Wellicht een beetje een vreemde topictitel, maar ik heb een kleine vraag waarop ik mij al een tijdje blindstaar.
Ik heb een shaped form, dus in een andere vorm dan de traditionele rechthoek. Omdat dit form geen titelbalk heeft is het niet te verplaatsen door de titelbalk te slepen. Daarom wil ik het kunnen verplaatsen door op de achtergrond te klikken en slepen.
Ik heb hiervoor de volgende eenvoudige code:
Dit werkt als een trein en doet precies wat ik wil. Wat ik alleen niet snap is waarom.
Even nagaan wat er (volgens mij) gebeurt a.d.h.v. een voorbeeldje:
1. Het form bevindt zich op de coordinaten 300,300 op het scherm.
2. De user drukt de muisknop in op coordinaten 10,10 op het form (dus 310,310 op het scherm).
3. Deze coordinaten (10,10) worden opgeslagen in klikCoords en bezigMetSlepen wordt true.
4. De user sleept nu 10 pixels naar rechts. De MouseMove event doet zich voor.
5. De verplaatste afstand (dx, dy) wordt berekend (= 10,0) en het form wordt vanaf zijn huidige locatie over dezelfde afstand verplaatst. De nieuwe locatie is dus 310,300.
6. De muisknop is nog steeds ingedrukt en de user sleept nog eens 10 pixels naar rechts. De MouseMove event doet zich nogmaals voor.
7. De verplaatste afstand (dx,dy) wordt opnieuw berekend en is nu (20,0).
8. Het form wordt vanaf zijn huidige locatie verplaatst en de nieuwe locatie is dus 330,300.
Omdat in stap 8 het form vanaf zijn huidige locatie wordt verplaatst, zou ik verwachten dat het uitkomt op 330,300 (de oude 310,300 + 20,0). Gewenst is natuurlijk dat het op 320,300 uitkomt, aangezien de user pas 20 pixels gesleept heeft.
In werkelijkheid wordt in stap 8 het form gewoon keurig op locatie 320,300 geplaatst. Waarom?
Wat ik zou verwachten dat ik moet doen, is in de MouseDown event naast de klikCoords ook de locatie van het form opslaan (dus op het moment van starten met slepen), en in de MouseMove de nieuwe locatie relatief aan de startlocatie berekenen. Maar juist als ik dat doe reageert het form niet goed op het slepen.
Wat is er fout in mijn redenatie?
Ik heb een shaped form, dus in een andere vorm dan de traditionele rechthoek. Omdat dit form geen titelbalk heeft is het niet te verplaatsen door de titelbalk te slepen. Daarom wil ik het kunnen verplaatsen door op de achtergrond te klikken en slepen.
Ik heb hiervoor de volgende eenvoudige code:
C#:
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
| public partial class Form1 : Form { private Boolean bezigMetSlepen = false; private Point klikCoords; public Form1() { InitializeComponent(); } private void Form1_MouseDown(object sender, MouseEventArgs e) { //Sla coordinaten op waar geklikt is klikCoords = new Point(e.X, e.Y); //Geef aan dat we gaan slepen bezigMetSlepen = true; } private void Form1_MouseUp(object sender, MouseEventArgs e) { //Muisknop losgelaten, dus stop met slepen bezigMetSlepen = false; } private void Form1_MouseMove(object sender, MouseEventArgs e) { //Zijn we aan het slepen? Zo ja, dan moet het form verplaatst worden if (bezigMetSlepen) { //Bereken de afstand van de huidige muispositie tot aan de positie //waarop geklikt was: dat is de afstand waarover gesleept is int dX = e.X - klikCoords.X; int dY = e.Y - klikCoords.Y; //Bereken de nieuwe locatie voor het form Point newloc = new Point(this.Location.X + dX, this.Location.Y + dY); this.Location = newloc; } } } |
Dit werkt als een trein en doet precies wat ik wil. Wat ik alleen niet snap is waarom.
Even nagaan wat er (volgens mij) gebeurt a.d.h.v. een voorbeeldje:
1. Het form bevindt zich op de coordinaten 300,300 op het scherm.
2. De user drukt de muisknop in op coordinaten 10,10 op het form (dus 310,310 op het scherm).
3. Deze coordinaten (10,10) worden opgeslagen in klikCoords en bezigMetSlepen wordt true.
4. De user sleept nu 10 pixels naar rechts. De MouseMove event doet zich voor.
5. De verplaatste afstand (dx, dy) wordt berekend (= 10,0) en het form wordt vanaf zijn huidige locatie over dezelfde afstand verplaatst. De nieuwe locatie is dus 310,300.
6. De muisknop is nog steeds ingedrukt en de user sleept nog eens 10 pixels naar rechts. De MouseMove event doet zich nogmaals voor.
7. De verplaatste afstand (dx,dy) wordt opnieuw berekend en is nu (20,0).
8. Het form wordt vanaf zijn huidige locatie verplaatst en de nieuwe locatie is dus 330,300.
Omdat in stap 8 het form vanaf zijn huidige locatie wordt verplaatst, zou ik verwachten dat het uitkomt op 330,300 (de oude 310,300 + 20,0). Gewenst is natuurlijk dat het op 320,300 uitkomt, aangezien de user pas 20 pixels gesleept heeft.
In werkelijkheid wordt in stap 8 het form gewoon keurig op locatie 320,300 geplaatst. Waarom?
Wat ik zou verwachten dat ik moet doen, is in de MouseDown event naast de klikCoords ook de locatie van het form opslaan (dus op het moment van starten met slepen), en in de MouseMove de nieuwe locatie relatief aan de startlocatie berekenen. Maar juist als ik dat doe reageert het form niet goed op het slepen.
Wat is er fout in mijn redenatie?
The sentence below is true.
The sentence above is false.