Ik ben met een usercontrol bezig in VB. Deze usercontrol moet een aantal "blokken" laten zien welke ik met de muis smaller/breder kan slepen.
Nu heb ik voor deze "blokken" command-buttons gekozen, omdat ik later nog andere eigenschappen van deze buttons goed kan gebruiken, zoals "_Click" events en het "label" dat standaard op een command button staat.
Mijn usercontrol ziet er nu als volgt uit:

Zoals je ziet is het eerste blok "actief" en kan worden ge-sized. Ik wil alleen dat de blokken blijven aansluiten. Dat zou betekenen dat als je blok 1 smaller maakt, blok 2 breder wordt als volgt (Zo moet het dus worden!):

Wat er nu echter gebeurd is het volgende:

Maar 1 van de knoppen reageert op de postmessage die ik stuur.
De code die ik gebruik is als volgt:
Als test maakt de usercontrol nu standaard een paar knopjes aan. Dat moet ik nog veranderen zodat er meer/minder blokken gebruikt kunnen worden, maar daar gaat het nu hier niet om.
Zoals je kunt zien in de code, op regel 4 welke ik heb afge-remd, gebruikte ik eerst Sendmessage. Maar die call is synchroon en keert pas terug als ik klaar ben met sizen. De Postmessage call is echter a-synchroon en keert dus meteen terug. Geweldig! Dan kan ik dus mijn tweede knop ook nog een postmessage sturen.
Dat doe ik dus ook op regel 26. Daar stuur ik een tweede postmessage naar de button rechts van de 1e button.
Voor de duidelijkheid: Uiteindelijk moet je dus RUN-Time die knoppen kunnen sizen.
Waar het me nu dus om gaat:
• Waarom, als ik 2 postmessages verstuur, sized er maar 1 knop?
• Waarom, als ik 2 sendmessages verstuur, sized er wel 1 knop, en als ik de muis los laat daarna de 2e? Dit is niet logisch als je het vorige punt bekijkt. Wil je dit zelf testen, vervang dan de postmessage op regels 25 & 26 door sendmessage.
• De clue: Hoe laat ik 2 knoppen tegelijkertijd reageren op mijn "size-event"?
Alle suggesties zijn welkom. Wellicht weet iemand hier een (gratis?) OCX alternatief voor of een andere (praktische) oplossing.
P.s.: Ik heb de source ter download/inzage online gezet:
• 2.9 Kb RAR-file
• 3.35 Kb ZIP-file
Gebruik Group1.vbg om het project te openen
Nu heb ik voor deze "blokken" command-buttons gekozen, omdat ik later nog andere eigenschappen van deze buttons goed kan gebruiken, zoals "_Click" events en het "label" dat standaard op een command button staat.
Mijn usercontrol ziet er nu als volgt uit:

Zoals je ziet is het eerste blok "actief" en kan worden ge-sized. Ik wil alleen dat de blokken blijven aansluiten. Dat zou betekenen dat als je blok 1 smaller maakt, blok 2 breder wordt als volgt (Zo moet het dus worden!):

Wat er nu echter gebeurd is het volgende:

Maar 1 van de knoppen reageert op de postmessage die ik stuur.
De code die ik gebruik is als volgt:
Visual Basic:
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
| Option Explicit Private Declare Function ReleaseCapture Lib "user32" () As Long 'Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd _ As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd _ As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long Const WM_NCLBUTTONDOWN = &HA1 Const HTLEFT = 10 Const HTRIGHT = 11 Private Sub cmdBar_MouseDown(Index As Integer, Button As Integer, _ Shift As Integer, X As Single, Y As Single) Dim nParam As Long With cmdBar(Index) If X > 0 And X < 100 And Index > 0 Then nParam = HTLEFT ElseIf X > .Width - 100 And X < .Width And Index < cmdBar.Count - 1 Then nParam = HTRIGHT End If If nParam Then Call ReleaseCapture Call PostMessage(.hwnd, WM_NCLBUTTONDOWN, nParam, 0) Call PostMessage(cmdBar(Index + 1).hwnd, WM_NCLBUTTONDOWN, HTLEFT , 0) End If End With End Sub Private Sub cmdBar_MouseMove(Index As Integer, Button As Integer, _ Shift As Integer, X As Single, Y As Single) Dim NewPointer As MousePointerConstants With cmdBar(Index) If X > 0 And X < 100 And Index > 0 Then NewPointer = vbSizeWE ElseIf X > .Width - 100 And X < .Width And Index < cmdBar.Count - 1 Then NewPointer = vbSizeWE Else NewPointer = vbDefault End If If NewPointer <> .MousePointer Then .MousePointer = NewPointer End With End Sub Private Sub UserControl_Show() Dim T As Integer For T = 1 To 3 Load cmdBar(T) cmdBar(T).Visible = True cmdBar(T).Top = cmdBar(0).Top cmdBar(T).Left = cmdBar(T - 1).Left + cmdBar(T - 1).Width Next End Sub |
Als test maakt de usercontrol nu standaard een paar knopjes aan. Dat moet ik nog veranderen zodat er meer/minder blokken gebruikt kunnen worden, maar daar gaat het nu hier niet om.
Zoals je kunt zien in de code, op regel 4 welke ik heb afge-remd, gebruikte ik eerst Sendmessage. Maar die call is synchroon en keert pas terug als ik klaar ben met sizen. De Postmessage call is echter a-synchroon en keert dus meteen terug. Geweldig! Dan kan ik dus mijn tweede knop ook nog een postmessage sturen.
Dat doe ik dus ook op regel 26. Daar stuur ik een tweede postmessage naar de button rechts van de 1e button.
offtopic:
Ja, ik weet dat dit niet helemaal jofel is. Het werkt nu alleen als ik aan de rechterkant van een knop ga resizen, niet bij links, maar dat doet er nu niet toe. Deze aanpassing maak ik als ik 2 knoppen tegelijk heb "leren" sizen.
Ja, ik weet dat dit niet helemaal jofel is. Het werkt nu alleen als ik aan de rechterkant van een knop ga resizen, niet bij links, maar dat doet er nu niet toe. Deze aanpassing maak ik als ik 2 knoppen tegelijk heb "leren" sizen.
Voor de duidelijkheid: Uiteindelijk moet je dus RUN-Time die knoppen kunnen sizen.
Waar het me nu dus om gaat:
• Waarom, als ik 2 postmessages verstuur, sized er maar 1 knop?
• Waarom, als ik 2 sendmessages verstuur, sized er wel 1 knop, en als ik de muis los laat daarna de 2e? Dit is niet logisch als je het vorige punt bekijkt. Wil je dit zelf testen, vervang dan de postmessage op regels 25 & 26 door sendmessage.
• De clue: Hoe laat ik 2 knoppen tegelijkertijd reageren op mijn "size-event"?
Alle suggesties zijn welkom. Wellicht weet iemand hier een (gratis?) OCX alternatief voor of een andere (praktische) oplossing.
P.s.: Ik heb de source ter download/inzage online gezet:
• 2.9 Kb RAR-file
• 3.35 Kb ZIP-file
Gebruik Group1.vbg om het project te openen
[ Voor 15% gewijzigd door RobIII op 14-11-2003 16:57 ]
There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.
Je eigen tweaker.me redirect
Over mij
