Autor Beitrag
KainPlan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 27

Vista Buisness, Windows 7
C/C++, C#, PHP...
BeitragVerfasst: Di 24.02.09 03:23 
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

ausblenden volle Höhe 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;
        /// <summary>
        /// Das ist der "Radius" in dem die Tranzparenzänderungen wirksam sind.
        /// The "radius" where the opacity changes take effect.
        /// </summary>
        public int OpacityTouchRadius
        {
            get { return opacityTouchRadius; }
            set { opacityTouchRadius = value; recalculate(); }
        }

        private double opacityMin = 0.25;
        /// <summary>
        /// Das Minimum der zu erreichenden Tranzparenz.
        /// The minimum of opacity to reach.
        /// </summary>
        public double OpacityMin
        {
            get { return opacityMin; }
            set { opacityMin = value; recalculate(); }
        }

        private double opacityMax = 1;
        /// <summary>
        /// Das Maximum der zu erreichenden Tranzparenz.
        /// The maximum of opacity to reach.
        /// </summary>
        public double OpacityMax
        {
            get { return opacityMax; }
            set { opacityMax = value; recalculate(); }
        }

        private bool active = false;
        /// <summary>
        /// Schaltet die funktionen dieser Klasse an oder ab.
        /// Switch the changes on or off.
        /// </summary>
        public bool Active
        {
            get { return active; }
            set { active = value; }
        }

        private Form form;
        /// <summary>
        /// Gibt das Formular an welches die Änderungen der Tranzparenz empfängt.
        /// The Form who takes effect of the opacity changes.
        /// </summary>
        public Form Form
        {
            get { return form; }
            set { form = value; }
        }
        #endregion

        #region "-- private Members --"
        /// <summary>
        /// Wert zum berechnen der tatsächlichen Tranzparenz
        /// Value to calculate the transparens.
        /// </summary>
        private double opacityStep = -1;
        /// <summary>
        /// Statischer Zeitgeber dieser Klasse. Jede Instanz dieser nutzt diesen Zeitgeber.
        /// Static Timeprovider. Every instance of this class will use it.
        /// </summary>
        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);
        }

        /// <summary>
        /// Selbsterklärend?
        /// It's pretty selfexplanatory.
        /// </summary>
        public void Start()
        {
            active = true;
        }

        /// <summary>
        /// Selbsterklärend?
        /// It's pretty selfexplanatory.
        /// </summary>
        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 == nullreturn;

            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) //  TOPLEFT CORNER
                {
                    // distance between 2 points.
                    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) // TOPRIGHT CORNER
                {
                    // distance between 2 points.
                    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) // BOTTOMRIGHT CORNER
                {
                    // distance between 2 points.
                    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) // BOTTOMLEFT CORNER
                {
                    // distance between 2 points.
                    a = fr.Bottom - mpos.Y;
                    b = fr.Left - mpos.X;
                    dist = Math.Sqrt(a * a + b * b);
                }


                else if (fr.Top > mpos.Y) // TOP
                {
                    dist = fr.Top - mpos.Y;
                }
                else if (fr.Right < mpos.X) // RIGHT
                {
                    dist = mpos.X - fr.Right;
                }
                else if (fr.Bottom < mpos.Y) // BOTTOM
                {
                    dist = mpos.Y - fr.Bottom;
                }
                else if (fr.Left > mpos.X) // LEFT
                {
                    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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 339
Erhaltene Danke: 20

Win 10
C# (VS 2012), C++ (VS 2012/GCC), PAWN(Notepad++), Java(NetBeans)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 27

Vista Buisness, Windows 7
C/C++, C#, PHP...
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3747
Erhaltene Danke: 123

Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
BeitragVerfasst: 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

_________________
This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
KainPlan Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 27

Vista Buisness, Windows 7
C/C++, C#, PHP...
BeitragVerfasst: Di 24.02.09 22:50 
user profile iconelundril hat folgendes geschrieben Zum zitierten Posting springen:
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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 339
Erhaltene Danke: 20

Win 10
C# (VS 2012), C++ (VS 2012/GCC), PAWN(Notepad++), Java(NetBeans)
BeitragVerfasst: Mi 25.02.09 00:33 
user profile iconKainPlan hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconelundril hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 27

Vista Buisness, Windows 7
C/C++, C#, PHP...
BeitragVerfasst: Mi 25.02.09 22:31 
achso :) Okay dann haben wir jetzt alle mal aneinander vorbei geredet ;D, passiert.