[VB6] Probleem met postmessage

Pagina: 1
Acties:

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

Topicstarter
(overleden)
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:

Afbeeldingslocatie: http://www.theforumisdown.com/uploadfiles/0103/valbar1.gif

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!):

Afbeeldingslocatie: http://www.theforumisdown.com/uploadfiles/0103/valbar2.gif

Wat er nu echter gebeurd is het volgende:

Afbeeldingslocatie: http://www.theforumisdown.com/uploadfiles/0103/valbar3.gif

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.


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


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

Topicstarter
(overleden)
Kleine schop zodat alle devvers die maandag weer beginnen deze post weer goed zien staan :Y)

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


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 00:47
Ik denk dat die andere button een size + redraw message nodig hebben,. Bij die NCLEFTBLAHBLAH message staat vermeld dat alleen de window die de cursor 'contained' die message krijgt normaal gesproken.
Het zou kunnen zijn dat die buttons eerst een hittest doen of de cursor wel in hun area zitten, wat natuurlijk niet het geval is.

Maar ik kan er ook helemaal naast zitten. :)

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

Topicstarter
(overleden)
Hmm, ik ben bang dat ik je niet helemaal begrijp :P

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


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 00:47
RobIII schreef op 17 november 2003 @ 11:17:
Hmm, ik ben bang dat ik je niet helemaal begrijp :P
Ik bedoel dat die NCLEFT... message waarschijnlijk niets doet bij controls die niet de cursor over zich hebben.

Waarom gebruik je eigenlijk niet gewoon een Button( X en X +1 ).Move( X, Y , Width, Height ) ?

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

Topicstarter
(overleden)
farlane schreef op 17 november 2003 @ 13:21:
[...]
Ik bedoel dat die NCLEFT... message waarschijnlijk niets doet bij controls die niet de cursor over zich hebben.
Jawel, vervang op regel 25 de .hwnd maar eens door cmdBar(Index + 1).hwnd om dat te proberen (werkt dus niet op de laatste button, rest wel...duh). Je ziet dus dat er geen cursor over hoeft te hangen. Meer dan dat toont dit dan ook niet aan.
farlane schreef op 17 november 2003 @ 13:21:
[...]
Waarom gebruik je eigenlijk niet gewoon een Button( X en X +1 ).Move( X, Y , Width, Height ) ?
Heb je dat al eens werkend gekregen dan? Ikke niet :?

[ Voor 8% gewijzigd door RobIII op 17-11-2003 13:38 ]

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


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 00:47
RobIII schreef op 17 november 2003 @ 13:36:
Jawel, vervang op regel 25 de .hwnd maar eens door cmdBar(Index + 1).hwnd om dat te proberen (werkt dus niet op de laatste button, rest wel...duh). Je ziet dus dat er geen cursor over hoeft te hangen. Meer dan dat toont dit dan ook niet aan.
Ok, kan goed zijn ik heb mijn theorie niet getest.
Heb je dat al eens werkend gekregen dan? Ikke niet :?
Ja, net in vijf minuten. Met twee knoppen, maar daar weet jij ongetwijfeld wel een oplossing voor. Plak deze code in een usercontrol met twee knoppen naats elkaar die cmdBar heten in een array.

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
Option Explicit

Private m_pressed As Boolean

Private Sub cmdBar_MouseDown(Index As Integer, Button As Integer, Shift As Integer, X As Single, Y As Single)
  cmdBar(Index).MousePointer = vbSizeWE
  
  m_pressed = True
End Sub

Private Sub cmdBar_MouseUp(Index As Integer, Button As Integer, Shift As Integer, X As Single, Y As Single)
  cmdBar(Index).MousePointer = vbDefault
  
  m_pressed = False
End Sub

Private Sub cmdBar_MouseMove(Index As Integer, Button As Integer, Shift As Integer, X As Single, Y As Single)

  If m_pressed Then
  
    With cmdBar(Index)
      Call .Move(.Left, .Top, X - .Left, .Height)
    End With
    With cmdBar(Index + 1)
    
      Dim newWidth As Single
      
      newWidth = .Left + .Width - (cmdBar(Index).Left + cmdBar(Index).Width)
      
      Call .Move(cmdBar(Index).Left + cmdBar(Index).Width, .Top, newWidth, .Height)
    End With
    
  End If
  
End Sub

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

Topicstarter
(overleden)
Sorry, maar dit is niet goed.
• De knoppen sizen niet tegelijkertijd
• De form-redraw gebeurd pas NA het "sizen". Met form.autoredraw op true krijg ik zelfs een out-of-stack ;)

Zo ziet jouw code er uit (copy/paste)
Afbeeldingslocatie: http://www.theforumisdown.com/uploadfiles/0103/valbar4.gif

Met een usercontrol.refresh in jouw code op regel 32 (jouw code) ziet het er al stukken beter uit. Maar de reden waarom ik naar die API greep is om het vreselijk lelijke geflikker te voorkomen van die knoppen.

Als je een (non-API?) oplossing hebt die een beetje "soepel" loopt dan hoor ik het graag.

Overigens wel bedankt voor het meedenken (ik wil niet klinken als een zeikerd :Y) )

[ Voor 42% gewijzigd door RobIII op 17-11-2003 16:21 ]

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


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 00:47
Hmmm, bij mij doet ie het goed. Ik heb beide ( usercontrol en form ) de autowredraw op false staan. ( Krijg niet de cursor op mijn screendump trouwens, en ik weet niet hoe ik een screendump hier zou moeten laten zien :) )

Heb je ook code in je usercontrol_paint staan of zo die iets triggert ?

[edit]
Ook als ik beide autoredraw op true zet, gaat het goed. Ik denk dat je ergens code hebt staan die niet helemaal doet wat jij verwacht.
Overigens heb je XX.refresh bijna nooit nodig. :)


Anders post ff de relevante code ......

[ Voor 30% gewijzigd door farlane op 17-11-2003 16:37 ]

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

Topicstarter
(overleden)
farlane schreef op 17 november 2003 @ 16:33:
Anders post ff de relevante code ......
Uhm...Dat was de relevante code ;)

Echt, ik heb alleen jouw code gecopy/pasted en verder niks nakkes in mijn usercontrol staan behalve het usercontrol_show event.

Ik zal het zipje posten voor de gein met jouw code. Momentje....
Met jouw code

Wat bereft die screenshots: die mousepointers heb ik erop gefotosjopped :+ (Ze zijn er dus wel, maar printscreen neemt ze niet mee waardoor ik ze er maar op getekend heb)

[ Voor 32% gewijzigd door RobIII op 17-11-2003 17:03 ]

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


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 00:47
RobIII schreef op 17 november 2003 @ 16:55:
[...]
Wat bereft die screenshots: die mousepointers heb ik erop gefotosjopped :+
Ahh, voelde me alweer helemaal n00b. Ik zal ff kijke ... moment ...


Ok :

1 - Je hebt de buttons in een picturebox staan
2 - Je hebt de backstyle van het control op transparent staan.

[ Voor 20% gewijzigd door farlane op 17-11-2003 17:07 ]

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

Topicstarter
(overleden)
farlane schreef op 17 november 2003 @ 17:00:
[...]
1 - Je hebt de buttons in een picturebox staan
2 - Je hebt de backstyle van het control op transparent staan.
1 - Ok, maar geen code. En autoredraw aan/uit op die picturebox maakt niks uit :?
2 - Uhm, ja. Maar ook dat maakt niks uit :? Krijg nou de !@*&%!@#... Dat is 'm!! Opgelost ;)

Dank u _/-\o_

Update
Ja, leuk ;) Maar toch werkt het niet. Als ik nu namelijk een knop aan de rechterkant vastpak en wil gaan sizen dan ben ik mijn mousemove event kwijt en moet ik allerlei stunts gaan uithalen om die op te vangen. Toch maar weer API werk vrees ik :? Mijn cursor blijft overigens ook flikkeren op die manier tussen "normaal" en "sizen"...

[ Voor 55% gewijzigd door RobIII op 17-11-2003 17:31 ]

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


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 00:47
Mja, ik weet niet wat er allemaal fout gaat bij jou, maar ik heb em nu ietje gefatsoeneerd en hij doet exact wat jij wil. En het ding flikkert niet.

Ik wil je mijn projectje wel opsturen ware het niet dat je je emeel adres niet hebt ingevuld.

Geloof me, je kunt beter tien regels meer VB code hebben dat twee API calls erbij in, want die doen altijd dingen die je niet verwacht. ( Of die VB niet verwacht )

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

Topicstarter
(overleden)
hierstondeenemailadres ;)

Ik ben benieuwd ;)

[edit]
Dat was snel! :)

Ziet er heel aardig uit, alleen flikkert het echt enorm... Damned... Misschien dat je een snellere pc/vga kaart hebt? Ik weet het niet...

Ik stoei wel wat verder, in ieder geval bedankt voor het meedenken ;)

[ Voor 109% gewijzigd door RobIII op 18-11-2003 10:50 ]

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


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 00:47
RobIII schreef op 18 november 2003 @ 10:42:
hierstondeenemailadres ;)

Ik ben benieuwd ;)

[edit]
Dat was snel! :)

Ziet er heel aardig uit, alleen flikkert het echt enorm... Damned... Misschien dat je een snellere pc/vga kaart hebt? Ik weet het niet...
Heb je wel alle servicepacks geinstalleerd? Het tekenwerk dat gedaan moet worden is namelijk minimaal dus ik kan me niet voorstellen dat je vga kaart hier moeite mee heeft.

De code is ook nog wel wat te optimaliseren door alleen de buttons die echt hertekend moeten worden te moven. Knutsel er maar eens wat mee. :)
Ik stoei wel wat verder, in ieder geval bedankt voor het meedenken ;)
Geen dank. :)

( Oh ja, als je echt meer wil dan VB kan heb je altijd nog de mogelijkheid over te stappen naar bijvoorbeeld Delphi of C++. Is bovendien ook leuker ook. :) )

[ Voor 11% gewijzigd door farlane op 18-11-2003 11:11 ]

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

Topicstarter
(overleden)
farlane schreef op 18 november 2003 @ 11:09:
Heb je wel alle servicepacks geinstalleerd? Het tekenwerk dat gedaan moet worden is namelijk minimaal dus ik kan me niet voorstellen dat je vga kaart hier moeite mee heeft.
Ja VStudio SP5 (wanneer komt 6 ei'k?) en WinXP met alle updates en SP's. Maar dat mag toch niet uitmaken (m.u.v. SP5 misschien)? Moet ook werken onder Win95.
farlane schreef op 18 november 2003 @ 11:09:
De code is ook nog wel wat te optimaliseren door alleen de buttons die echt hertekend moeten worden te moven. Knutsel er maar eens wat mee. :)
Hehe ;) Dat klopt, maar zelfs met 2 buttons flikkert het hier. Op 2 systemen hier ook niet en 3 anderen weer wel...
farlane schreef op 18 november 2003 @ 11:09:
Geen dank. :)

( Oh ja, als je echt meer wil dan VB kan heb je altijd nog de mogelijkheid over te stappen naar bijvoorbeeld Delphi of C++. Is bovendien ook leuker ook. :) )
Nee helaas. Ik zou het liefst VB.Net of C# gebruiken, maar helaas dien ik hier voor een aantal "oudere" collega's VB6 te gebruiken (onder het motto: het is toch goed zat? |:( )

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


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 00:47
RobIII schreef op 18 november 2003 @ 11:33:
Ja VStudio SP5 (wanneer komt 6 ei'k?) en WinXP met alle updates en SP's. Maar dat mag toch niet uitmaken (m.u.v. SP5 misschien)? Moet ook werken onder Win95.
SP6 komt denk ik helemaal niet meer. Alle tijd en geld wordt nu in het VS.NET verhaal gestoken. Ik ben echter van menign dat VC6 en VB6 nog heel lang gebruikt zullen worden.
Hehe ;) Dat klopt, maar zelfs met 2 buttons flikkert het hier. Op 2 systemen hier ook niet en 3 anderen weer wel...
Hmm, ikzelf heb het alleen gedraaid op W2K. Misschien dat het daar iets mee te maken kan hebben ?
Nee helaas. Ik zou het liefst VB.Net of C# gebruiken, maar helaas dien ik hier voor een aantal "oudere" collega's VB6 te gebruiken (onder het motto: het is toch goed zat? |:( )
Tja, wat je wilt is ( helaas voor jou ) idd ook wel te doen. :)

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

Topicstarter
(overleden)
Volgens MSBetas.com komt een SP6 er wel aan...Ik kan alleen niet vinden wanneer...

Hmmmm...Meer info hier. Je dient wel in te loggen met een MSN account, en vervolgens als je wordt gevraagd om een GuestID "vsndpspguest" in te vullen (Thank you, Google en Google groups _/-\o_ )

Voor degenen die hier niet aan mee willen doen: een screenshotje *klikbaar*:
Afbeeldingslocatie: http://www.theforumisdown.com/uploadfiles/0103/vssp6b_thumb.gif

En: Nee, je kunt de SP6 niet "zo maar" downloaden. Je dient je in te schrijven, een beta-tester ID aan te vragen enzovoorts enzovoorts...

Maar nou heb ik nog steeds die release date niet :(

[ Voor 87% gewijzigd door RobIII op 18-11-2003 13:58 ]

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


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 00:47
[offtopic]

Hmm, dat valt me 100% mee eigenlijk. Zoals sommigen al aangaven is VS6 naar software maatstaven alweer bejaard, en normaal gesproken heeft MS er weinig moeite mee om dan maar geen sp's meer te maken. ( Als stimulans om het veel betere en stabielere VS.NET aan te schaffen ongetwijfeld )

Netjes van Microsoft. En ook al een open XML formaat voor Office. 't Kan niet op :)

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.

Pagina: 1