Entwickler-Ecke
Open Source Units - Sensitive Opacity Extension
KainPlan - Di 24.02.09 03:23
Titel: Sensitive Opacity Extension
Hallo,
ich hab hier mal ne kleine Klasse geschrieben die die Entfernung zwischen Maus und Formrand misst und diese Entfernung in eine Tranzparenz umsetzt. Natürlich ist es möglich die maximale/minimale Tranzparenz festzulegen. Keine Ahnung wozu ihr das brauchen könnt aber ich hab da so meine teuflischen Ideen :D. HF
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174: 175: 176: 177: 178: 179: 180: 181: 182: 183: 184: 185: 186: 187: 188: 189: 190: 191: 192: 193: 194: 195: 196: 197: 198: 199: 200:
| public class SensitivOpacityExtension : IDisposable { #region "-- public Propertys --" private int opacityTouchRadius = 300; public int OpacityTouchRadius { get { return opacityTouchRadius; } set { opacityTouchRadius = value; recalculate(); } }
private double opacityMin = 0.25; public double OpacityMin { get { return opacityMin; } set { opacityMin = value; recalculate(); } }
private double opacityMax = 1; public double OpacityMax { get { return opacityMax; } set { opacityMax = value; recalculate(); } }
private bool active = false; public bool Active { get { return active; } set { active = value; } }
private Form form; public Form Form { get { return form; } set { form = value; } } #endregion
#region "-- private Members --" private double opacityStep = -1; private static Timer tMouseCapture = null; #endregion
#region "-- public Functions & Constructor --" public SensitivOpacityExtension(Form form) { this.form = form; recalculate();
if (tMouseCapture == null) { tMouseCapture = new Timer(); tMouseCapture.Interval = 10; tMouseCapture.Enabled = true; }
tMouseCapture.Tick += new EventHandler(tMouseCapture_Tick); }
public void Start() { active = true; }
public void Stop() { active = false; form.Opacity = opacityMax; } #endregion
#region "-- private Functions --" private void tMouseCapture_Tick(object sender, EventArgs e) { if (!active) return; if (form == null) return;
Point mpos = Cursor.Position;
if (form.Bounds.Contains(mpos)) { form.Opacity = opacityMax; } else { Rectangle fr = form.Bounds;
double dist = 0; int a, b;
if (fr.Top > mpos.Y && fr.Left > mpos.X) { a = fr.Left - mpos.X; b = fr.Top - mpos.Y; dist = Math.Sqrt(a * a + b * b); } else if (fr.Top > mpos.Y && fr.Right < mpos.X) { a = fr.Right - mpos.X; b = fr.Top - mpos.Y; dist = Math.Sqrt(a * a + b * b); } else if (fr.Bottom < mpos.Y && fr.Right < mpos.X) { a = fr.Bottom - mpos.Y; b = fr.Right - mpos.X; dist = Math.Sqrt(a * a + b * b); } else if (fr.Bottom < mpos.Y && fr.Left > mpos.X) { a = fr.Bottom - mpos.Y; b = fr.Left - mpos.X; dist = Math.Sqrt(a * a + b * b); }
else if (fr.Top > mpos.Y) { dist = fr.Top - mpos.Y; } else if (fr.Right < mpos.X) { dist = mpos.X - fr.Right; } else if (fr.Bottom < mpos.Y) { dist = mpos.Y - fr.Bottom; } else if (fr.Left > mpos.X) { dist = fr.Left - mpos.X; }
if (dist > opacityTouchRadius) form.Opacity = opacityMin; else { form.Opacity = opacityMax - opacityStep * dist; } }
}
private void recalculate() { double mval = opacityMax - opacityMin; opacityStep = (mval / (double)opacityTouchRadius); } #endregion
#region IDisposable Member public void Dispose() { if (tMouseCapture != null) tMouseCapture.Tick -= tMouseCapture_Tick; } #endregion } |
Greenberet - Di 24.02.09 10:49
Klingt ja nach einer netten Idee. Auch wenn der einzige Anwendungszweck der mir momentan einfallen würde wäre "Wie ärgere ich denn Heute den User" ^^
Mir ist beim durchlesen von deinem Source ein möglicher Bug aufgefallen.
Wenn die Form jetzt fast ganz Transparent ist und man eine neue Form über das Property setzt, dann bleibt die Transparent.
KainPlan - Di 24.02.09 16:12
Ach komm user ärgern wollen wir alle mal, ganz besonders den DAU. Jetzt mal im ernst die Form als Steuerelement und die Tranzparenz sind ja nur ein beispiel, wie man soch code verwenden kann. Bei selbst gezeichneten Buttons z.B. sieht das hervorragend aus wenn man statt Transparenz Farbe ins spiel bringt.
elundril - Di 24.02.09 18:06
ich hab mir die klasse zwar nicht durchgelesen, was ich jedoch von der ersten antwort rausgelesen hab ist, dass das Fenster verschwindet je näher man mit der Maus kommt. Das ganze könnte man ja auch umkehren. Es wird sichtbar je näher man mit der Maus kommt. Wäre sicher nützlich für Tools wie nen Kalender, den man nicht unbedingt sichtbar haben will aber doch im vordergrund um immer auf ihn zugreifen zu können.
lg
KainPlan - Di 24.02.09 22:50
elundril hat folgendes geschrieben : |
ich hab mir die klasse zwar nicht durchgelesen, was ich jedoch von der ersten antwort rausgelesen hab ist, dass das Fenster verschwindet je näher man mit der Maus kommt. Das ganze könnte man ja auch umkehren. Es wird sichtbar je näher man mit der Maus kommt. Wäre sicher nützlich für Tools wie nen Kalender, den man nicht unbedingt sichtbar haben will aber doch im vordergrund um immer auf ihn zugreifen zu können.
lg |
*hust*
also was du da beschreibst ist die funktionsweise der Klasse. Was macht das für einen sinn die Form bei Annäherung unsichtbar zu machen? Hab ich das vielleicht ungeschickt beschrieben??
Greenberet - Mi 25.02.09 00:33
KainPlan hat folgendes geschrieben : |
elundril hat folgendes geschrieben : | ich hab mir die klasse zwar nicht durchgelesen, was ich jedoch von der ersten antwort rausgelesen hab ist, dass das Fenster verschwindet je näher man mit der Maus kommt. Das ganze könnte man ja auch umkehren. Es wird sichtbar je näher man mit der Maus kommt. Wäre sicher nützlich für Tools wie nen Kalender, den man nicht unbedingt sichtbar haben will aber doch im vordergrund um immer auf ihn zugreifen zu können.
lg |
*hust*
also was du da beschreibst ist die funktionsweise der Klasse. Was macht das für einen sinn die Form bei Annäherung unsichtbar zu machen? Hab ich das vielleicht ungeschickt beschrieben?? |
um ehrlich zu sein ich hatte es auch so verstanden xD ( Darum auch der gedanke mim "user ärgern" )
So macht das ganze natürlich gleich schon viel mehr Sinn.
KainPlan - Mi 25.02.09 22:31
achso :) Okay dann haben wir jetzt alle mal aneinander vorbei geredet ;D, passiert.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!