Toon posts:

[vb6] Menuutje maken onder rechtermuisknop?

Pagina: 1
Acties:

Verwijderd

Topicstarter
Euj iedereen. Vraagie van mij alweer!

Ben bezig met een programmaatje (degenen die hier heel vaak komen en die een goed geheugen hebben kunnen zich misschien herrinneren dat het om een programmaatje gaat dat grafieken maakt), en nu wil ik het zo maken, dat als iemand op een object klikt (de grafiek in dit geval), dat er dan zo'n menuutje komt dat je ook hebt als je met je rechtermuisknop op 'Start' klikt. Snappen jullie?

Alvast bedankt!

  • Dennis
  • Registratie: Februari 2001
  • Laatst online: 09-09 23:30
Daar is toch ook een aparte control voor? Of was dat nou Delphi :?

Verwijderd

Met Popupmenu kun je een menu laten zien, als je control geen specifiek event voor right click heeft kun je GetKeyState API gebruiken om te checken of het de linker of rechter knop is.

Verwijderd

Topicstarter
Perfect! Tnx guys and girls!

Verwijderd

Topicstarter
Wacht, volgende probleem. Ik kan alleen over het gehele object een MouseDown event afvangen. Ik kan dus niet van gedeeltes van de grafiek (stukken staafdiagram, of 'taartstukken' uit een cirkeldiagram) een MouseDown event krijgen. Ik kan echter wél een X en Y positie uitlezen, maar hoe krijg ik het nu voor elkaar om deze X en Y te gebruiken om te bepalen waar de gebruiker precies geklikt heeft? Of is hier een andere oplossing voor? Of is hier géén oplossing voor?

  • Dennis
  • Registratie: Februari 2001
  • Laatst online: 09-09 23:30
Ik vrees dat dit niet mogelijk is, anders schiet je je doel van een aparte control voor de grafieken voorbij en kun je net zo goed helemaal zelf de grafiek renderen.

Het is dus wel mogelijk, maar je moet dan wel een regelmaat hebben in hoe de grafiek wordt opgebouwd, dus dan hoop ik dat je goed bent in wiskunde ;)

Verwijderd

Op woensdag 17 april 2002 20:05 schreef ddc het volgende:
Ik vrees dat dit niet mogelijk is, anders schiet je je doel van een aparte control voor de grafieken voorbij en kun je net zo goed helemaal zelf de grafiek renderen.

Het is dus wel mogelijk, maar je moet dan wel een regelmaat hebben in hoe de grafiek wordt opgebouwd, dus dan hoop ik dat je goed bent in wiskunde ;)
Mja, of je moet de kleur van de pixel waar je op klikt detecteren :P

Verwijderd

Topicstarter
Beide zijn onmogelijk of veel te inefficient (ik ben ook nog eens absoluut niet goed in wiskunde!) Niemand anders nog oplossingen?

Je kunt ook niet op de één of andere manier de laatst gebruikte muisknop achterhalen ofzo?

Anders moet ik het maar gewoon met toetsen doen. Ik kan namelijk wel de event 'selected' opvangen, en dan met een bepaalde toetsencombi.

  • Dennis
  • Registratie: Februari 2001
  • Laatst online: 09-09 23:30
Op woensdag 17 april 2002 20:29 schreef CyberKnutselaar het volgende:
Je kunt ook niet op de één of andere manier de laatst gebruikte muisknop achterhalen ofzo?
Tuurlijk kan dat wel :)
Als je kunt kijken of het linker of rechter knop is kun je dat natuurlijk ook opslaan.

Verwijderd

Topicstarter
Op woensdag 17 april 2002 20:34 schreef ddc het volgende:

[..]

Tuurlijk kan dat wel :)
Als je kunt kijken of het linker of rechter knop is kun je dat natuurlijk ook opslaan.
Ik geloof dat we elkaar niet begrijpen... Ik kan twee soorten (relevante) events afvangen:
1) mousedown. Hiermee kan ik ook kijken welke muisknop ingedrukt werd, maar deze event werkt alleen voor een compleet object (dus niet voor afzonderlijke delen van het diagram)
2) selected. Hiermee kan ik kijken welke element geselecteerd is, maar ik kan niet de muisknop waarmee het geselecteerd is achterhalen. Ik kan slechts achterhalen of eventueel control of shift ingedrukt zijn.

Nu wil ik dus de selected event gebruiken, en dan uit een één of andere constante vissen welke muisknop de gebruiker als laatst heeft gebruikt, snappez-voes?

Verwijderd

Op woensdag 17 april 2002 20:34 schreef ddc het volgende:

[..]

Tuurlijk kan dat wel :)
Als je kunt kijken of het linker of rechter knop is kun je dat natuurlijk ook opslaan.
Dat is toch het hele probleem opgelost, leek me al zo vaag dat je geen element kan bepalen.

Ook ff lezen wat ik net gezegd heb :)

GetKeyState API
code:
1
If GetKeyState(vbRightButton) And &H8000 Then DoeIets

En deze ff erbij natuurlijk:
code:
1
2
Private Declare Function GetKeyState Lib "user32"_
Alias "GetKeyState" (ByVal nVirtKey As Long) As Integer

Verwijderd

Topicstarter
Hehe... leuk geredeneerd, en het werkt allemaal best. Probleem is alleen dat de event 'select' alleen optreedt als er geselecteerd wordt met de linkermuisknop ;) Dus we kunnen in de event select wel leuk controleren of de rechtermuisknop wordt gebruikt, maar dat helpt gewoon iet, aangezien dan de hele event niet optreedt!

Jammer, maar waar :( Iemand nog suggesties?

Verwijderd

Op woensdag 17 april 2002 22:20 schreef CyberKnutselaar het volgende:
Hehe... leuk geredeneerd, en het werkt allemaal best. Probleem is alleen dat de event 'select' alleen optreedt als er geselecteerd wordt met de linkermuisknop ;) Dus we kunnen in de event select wel leuk controleren of de rechtermuisknop wordt gebruikt, maar dat helpt gewoon iet, aangezien dan de hele event niet optreedt!

Jammer, maar waar :( Iemand nog suggesties?
Hiermee kan ik kijken welke element geselecteerd is, maar ik kan niet de muisknop waarmee het geselecteerd is achterhalen.
Owh, ik dacht dat ie het bij beide deed idd. :P
Als het event alleen met de linker knop werkt moet je iets anders verzinnen (dubbelklikken oid). Je kunt ook ff kijken of er andere Graph controls te downloaden zijn (ik neem aan dat je die van MS gebruikt?). :)

Verwijderd

Topicstarter
Hmmm... Ik heb het nu inderdaad met dubbelklik gedaan, dat werkt in principe perfect. Maarjah, mensen zijn toch gewend om de rechtermuisknop te gebruiken om eigenschappen van iets te bewerken.

Ik ben al veel te ver gevorderd met het programma om nu nog een andere graph control te gaan gebruiken, en dat MSChart bevalt me wel. Veel opties, gratis, alleen 3D is lelijk getekend. Ach, je kunt niet alles hebben!

Toch bedankt!

Verwijderd

Op donderdag 18 april 2002 11:13 schreef CyberKnutselaar het volgende:
Hmmm... Ik heb het nu inderdaad met dubbelklik gedaan, dat werkt in principe perfect. Maarjah, mensen zijn toch gewend om de rechtermuisknop te gebruiken om eigenschappen van iets te bewerken.

Ik ben al veel te ver gevorderd met het programma om nu nog een andere graph control te gaan gebruiken, en dat MSChart bevalt me wel. Veel opties, gratis, alleen 3D is lelijk getekend. Ach, je kunt niet alles hebben!

Toch bedankt!
En wat wederom iedereen vergeet is dat er ook linkshandigen onder ons zijn die de muisknoppen omdraaien. Daarbij komt dat ook met Shift-F10 en het popupmenu-toets (links van rechtercontrol toets) het popupmenu getoond dient te worden. M.a.w. reageren op een right-click van de muis is per definitie fout (en deze fout maken zeer vele VB'ers!).

En nu een zetje in de goede richting: reageren op de Window Message WM_CONTEXTMENU. Als Params krijg je de XPos en YPos mee en een Window Handle. Vermaak je ermee!

  • Crazy D
  • Registratie: Augustus 2000
  • Laatst online: 09-09 16:14

Crazy D

I think we should take a look.

Op donderdag 18 april 2002 11:41 schreef hvdberg het volgende:
En wat wederom iedereen vergeet is dat er ook linkshandigen onder ons zijn die de muisknoppen omdraaien. Daarbij komt dat ook met Shift-F10 en het popupmenu-toets (links van rechtercontrol toets) het popupmenu getoond dient te worden. M.a.w. reageren op een right-click van de muis is per definitie fout (en deze fout maken zeer vele VB'ers!). Als ik het gevonden heb dan zal ik de code posten waarmee je een 'echt' popup menu kan maken!
Ik heb net even met m'n logitech muisje ingesteld dat de rechterbutton voortaan click is, en de linkerbutton uh "rechtermuisklik" is, en als ik vervolgens met rechts klik (wat dus de gewone click is), krijg je in het mousedown event netjes vbLeftButton als button-waarde, oftewel, als je checkt of Button = vbRightButton, heb je dus ook als je de buttons omdraait gewoon de juiste te pakken :)

Voor als er toetsenbord combo's gebruikt worden om het popup menu op te roepen kun je het keydown event afvangen.

[edit]
En voor het hardcore :P werk kun je je form subclassen en de WM_CONTEXTMENU message afvangen. Deze wordt verstuurd als de rechtermuisbutton wordt geklikt (zo staat het ook in MSDN dus niet mekkeren dat voor linkshandigen dat eigenlijk de linkermuis button is...), of als via de bekende Windows toetscombinaties een contextmenu wordt getoont.

Exact expert nodig?


Verwijderd

Op donderdag 18 april 2002 11:55 schreef Crazy_D het volgende:
Ik heb net even met m'n logitech muisje ingesteld dat de rechterbutton voortaan click is, en de linkerbutton uh "rechtermuisklik" is, en als ik vervolgens met rechts klik (wat dus de gewone click is), krijg je in het mousedown event netjes vbLeftButton als button-waarde, oftewel, als je checkt of Button = vbRightButton, heb je dus ook als je de buttons omdraait gewoon de juiste te pakken :)
Daar heb je helemaal gelijk in.
Voor als er toetsenbord combo's gebruikt worden om het popup menu op te roepen kun je het keydown event afvangen.
Dat kan.
[edit]
En voor het hardcore :P werk kun je je form subclassen en de WM_CONTEXTMENU message afvangen. Deze wordt verstuurd als de rechtermuisbutton wordt geklikt (zo staat het ook in MSDN dus niet mekkeren dat voor linkshandigen dat eigenlijk de linkermuis button is...), of als via de bekende Windows toetscombinaties een contextmenu wordt getoont.
Is dat zo hardcore dan? Trouwens waarom ik daar over begon te 'mekkeren' is het feit dat ook ik eerst (in VB tenminste) de right mouse click afving. En de 1e de beste klant ramt met z'n toetsenbord op de popup-menu knop zonder resultaat en begint meteen te mekkeren :) .

En ik had al geplaatst dat je de WM_CONTEXTMENU moest hebben.

Wat ik eigenlijk probeerde te zeggen is dat enkel reageren op een right-mouse button click niet voldoende is.

Oh ja, de WM_CONTEXTMENU wordt afgevuurd na de WM_RBUTTONUP of WM_NCRBUTTONUP (goed geschreven?) message. 't Lijkt me gewoon 't slimst om op WM_CONTEXTMENU te reageren want dan ben je van al het gemekker af!

  • Crazy D
  • Registratie: Augustus 2000
  • Laatst online: 09-09 16:14

Crazy D

I think we should take a look.

Op donderdag 18 april 2002 12:12 schreef hvdberg het volgende:
Is dat zo hardcore dan? Trouwens waarom ik daar over begon te 'mekkeren' is het feit dat ook ik eerst (in VB tenminste) de right mouse click afving. En de 1e de beste klant ramt met z'n toetsenbord op de popup-menu knop zonder resultaat en begint meteen te mekkeren :) .
:D ja mousedown/up event krijg je helaas niet als het popupmenu wordt opgeroepen met het toetsenbord. Je moet er idd ook erg bewust aan denken.
Njah subclassen vind ik op zich niet echt hardcore, maar er zijn genoeg mensen wie dat wel zo vinden...
En ik had al geplaatst dat je de WM_CONTEXTMENU moest hebben.
Net langs elkaar heen ge-edit dus ;)
Wat ik eigenlijk probeerde te zeggen is dat enkel reageren op een right-mouse button click niet voldoende is.

Oh ja, de WM_CONTEXTMENU wordt afgevuurd na de WM_RBUTTONUP of WM_NCRBUTTONUP (goed geschreven?) message. 't Lijkt me gewoon 't slimst om op WM_CONTEXTMENU te reageren want dan ben je van al het gemekker af!
Heb je op zich wel gelijk in. Is ook gewoon het makkelijkste want dan hoef je zelf niet overal aan te denken. En als MS besluit dat ook Ctrl+Alt+F10 het popup menu moet tonen, wordt dat vanzelf wel een keer doorgevoerd in Windows, en krijg je dat vanzelf wel door via de WM_CONTEXTMENU.
Maar ja ik probeerde ook meer te zeggen dat het op zich niet fout is om dat met de VB events te doen in plaats van met een subclass.

Exact expert nodig?


Verwijderd

Met subclassen is het wel wat moeilijk debuggen, maar daar ontkom je meestal niet aan.

Het probleem is volgens mij dat de Graph control aangeeft welk gebied is aangeklikt in het klik event (en dan niet gewoon X en Y, maar welk element van het grafiek), dat kun je moeilijk zelf doen.
Pagina: 1