#PB_EventType_RightClick

Für allgemeine Fragen zur Programmierung mit PureBasic.
BSP
Beiträge: 201
Registriert: 01.02.2009 14:04

#PB_EventType_RightClick

Beitrag von BSP »

Hallo Allerseits.

Wie kann ich bei einem #PB_EventType_RightClick auf ein Listicongadget verhindern,
das eine Zeile selectiert wird?

Ich möchte gerne, dass bei einem Rechtsklick mein Menue aufgerufen wird,
egal, wo ich auf das Gadget klicke. (Also auch auf eine bisher unselectierte Zeile).
Klicke ich versehentlich auf eine unselectierte Zeile,
ist meine bereits gemachte selection weg und ich muss von vorne anfangen.

Win10, PB542 (x64). (Aber das ist egal, das Problem gab es bereits früher).

Vielen Dank schon mal für Eure mühe.
Gruß: Bernd

Code: Alles auswählen

#ligadg = 0

OpenWindow(0, 0, 0, 400, 400, "Mousebutt", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)

CreatePopupMenu(0)
MenuItem(0, "Nenuitem 1")
MenuItem(1, "Nenuitem 1")
MenuItem(2, "Nenuitem 1")
MenuItem(3, "Ende")

ListIconGadget(#ligadg, 0, 0, 400, 300, "Testzeilen", 400, #PB_ListIcon_FullRowSelect|#PB_ListIcon_GridLines|#PB_ListIcon_MultiSelect)
For i = 1 To 10
  AddGadgetItem(#ligadg, -1, "Zeile " + Str(i))
Next
ButtonGadget(1, 4, 370, 100, 26, "Ende")

Repeat
  ev = WaitWindowEvent()
  Select ev
    Case #PB_Event_CloseWindow
      ende = 1
      
    Case #PB_Event_Gadget
      Select EventGadget()
        Case 1
          ende = 1
        Case #ligadg
          Select EventType()
            Case #PB_EventType_RightClick
              Debug "#PB_EventType_RightClick"
              Debug GetGadgetState(#ligadg)
              If CountGadgetItems(#ligadg)
                DisplayPopupMenu(0, WindowID(0))
              EndIf
          EndSelect
          
      EndSelect
      
  EndSelect
Until ende

PB 5.31 (x86) & (x64) Win10
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: #PB_EventType_RightClick

Beitrag von Nino »

Hallo,

wenn ich vor dem Rechtsklick [Shift] oder [Strg] drücke, dann ist das Verhalten hier so wie von Dir gewünscht.
Vielleicht kannst Du das im Programm simulieren.
BSP
Beiträge: 201
Registriert: 01.02.2009 14:04

Re: #PB_EventType_RightClick

Beitrag von BSP »

Hallo Nino.
Also, das mit dem manuellem drücken der Tasten vor dem Click kann ich bestätigen.
Nur das mit dem Simulieren ist nicht so einfach.
Ich bekomme es nicht hin.

Der Mausdruck wird nicht sofort zurück gemeldet.
Es muss erst eine weitere Mausaktion erfolgen. Z.B. Maus bewegen, Maus wieder loslassen.
So kommt z.B. auch kein RBUTTONUP zustande.

Das ein Tastendruck übergeben wird kann man daran erkennen,
das z.B. die Str- Taste nicht mehr gedrückt werden muss,
um weitere Zeilen zu selectieren.

Damit Du / Ihr mal seht was ich u.a. versucht habe,
hier nochmal mein Prg mit ein paar Versuchen:

Gruß: Bernd

Code: Alles auswählen

#ligadg = 0


Procedure sendkey(VK_Key)
  ; http://www.purearea.net/pb/CodeArchiv/Input+Output/Get&Send_Keys/SendKey_global.pb
  ; Die notwendigen Structuren sin in PB bereits integriert !
  
  Protected KeyStroke.INPUT
  KeyStroke\type = 1;#INPUT_KEYBOARD
  KeyStroke\ki\wVk = VK_Key ;#VK_Irgendwas
  KeyStroke\ki\wScan = 0
  KeyStroke\ki\dwFlags = 0
  KeyStroke\ki\time = 100;time
  KeyStroke\ki\dwExtraInfo = 0

  SendInput_(1, @KeyStroke, SizeOf(INPUT))
EndProcedure

OpenWindow(0, 0, 0, 400, 400, "Mousebutt", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)

CreatePopupMenu(0)
MenuItem(0, "Nenuitem 1")
MenuItem(1, "Nenuitem 1")
MenuItem(2, "Nenuitem 1")
MenuItem(3, "Ende")

ListIconGadget(#ligadg, 0, 0, 400, 300, "Testzeilen", 400, #PB_ListIcon_FullRowSelect|#PB_ListIcon_GridLines|#PB_ListIcon_MultiSelect)
For i = 0 To 10
  AddGadgetItem(#ligadg, -1, "Zeile " + Str(i))
Next
ButtonGadget(1, 4, 370, 100, 26, "Ende")

Repeat
  ev = WaitWindowEvent()
  If GetAsyncKeyState_(#VK_RBUTTON)
    ;Debug "Rechte Maustaste gedrückt"
    ;If GetAsyncKeyState_(#WM_RBUTTONUP)
    ;sendkey(#VK_SHIFT)  ; Warnung: Taste wird vom Prg nicht wieder losgelassen.
    ;sendkey(#VK_CONTROL) ; Warnung: Taste wird vom Prg nicht wieder losgelassen.
                         ; Die Tasten müssen nochmals manuell (vom Nutzer) gedrückt
                         ; und losgelassen werden.
  EndIf
  Select ev
    Case #PB_Event_CloseWindow
      ende = 1
      
    Case #WM_RBUTTONUP;#WM_RBUTTONDOWN
      sendkey(#VK_CONTROL)
      Debug "#WM_RBUTTONDOWN"
;       
    Case #PB_Event_Gadget
      Select EventGadget()
        Case 1
          ende = 1
        Case #ligadg
          Select EventType()
            Case #PB_EventType_RightButtonUp
              SetGadgetState(#ligadg, -1)
            Case #PB_EventType_RightButtonDown
              SetGadgetState(#ligadg, -1)
            Case #PB_EventType_RightClick
              ;sendkey(#VK_CONTROL)
              ;Delay(100)
              ;Debug "#PB_EventType_RightClick"
              ;Debug GetGadgetState(#ligadg)
              If CountGadgetItems(#ligadg)
                DisplayPopupMenu(0, WindowID(0))
              EndIf
              ;sendkey(#VK_UP)
              
          EndSelect
          
      EndSelect
      
    Default
;       If GetAsyncKeyState_(#VK_RBUTTON)
;         sendkey(#VK_CONTROL)
;         Debug "Rechte Maustaste gedrückt"
;         EndIf
  EndSelect
Until ende

PB 5.31 (x86) & (x64) Win10
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: #PB_EventType_RightClick

Beitrag von RSBasic »

Meinst du so?:

Code: Alles auswählen

;-Bitte EnableExplicit benutzen :-)
;EnableExplicit

#ligadg = 0

Global ListIconCB

Procedure ListIconCB(hWnd, uMsg, wParam, lParam)
  Select uMsg
    Case #WM_RBUTTONDOWN
      DisplayPopupMenu(0, WindowID(0))
      ProcedureReturn 1
  EndSelect
  
  ProcedureReturn CallWindowProc_(ListIconCB, hWnd, uMsg, wParam, lParam)
EndProcedure

OpenWindow(0, 0, 0, 400, 400, "Mousebutt", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)

CreatePopupMenu(0)
MenuItem(0, "Nenuitem 1")
MenuItem(1, "Nenuitem 1")
MenuItem(2, "Nenuitem 1")
MenuItem(3, "Ende")

ListIconGadget(#ligadg, 0, 0, 400, 300, "Testzeilen", 400, #PB_ListIcon_FullRowSelect|#PB_ListIcon_GridLines|#PB_ListIcon_MultiSelect)
For i = 1 To 10
  AddGadgetItem(#ligadg, -1, "Zeile " + Str(i))
Next
ButtonGadget(1, 4, 370, 100, 26, "Ende")

ListIconCB = SetWindowLongPtr_(GadgetID(#ligadg), #GWL_WNDPROC, @ListIconCB())

Repeat
  ev = WaitWindowEvent()
  Select ev
    Case #PB_Event_CloseWindow
      ende = 1
      
    Case #PB_Event_Gadget
      Select EventGadget()
        Case 1
          ende = 1
        Case #ligadg
          
      EndSelect
      
  EndSelect
Until ende
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
BSP
Beiträge: 201
Registriert: 01.02.2009 14:04

Re: #PB_EventType_RightClick

Beitrag von BSP »

@RSBasic.
Ja, genau so ist es gemeint.

Und darum abermals:
Recht herzlichen Dank an Dich.

Gruß: Bernd
PB 5.31 (x86) & (x64) Win10
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: #PB_EventType_RightClick

Beitrag von Nino »

@RSBasic:
Cool. 8) Danke!
Antworten