Seite 1 von 1

#PB_EventType_RightClick

Verfasst: 25.06.2016 03:55
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


Re: #PB_EventType_RightClick

Verfasst: 25.06.2016 06:38
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.

Re: #PB_EventType_RightClick

Verfasst: 25.06.2016 10:23
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


Re: #PB_EventType_RightClick

Verfasst: 25.06.2016 11:23
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

Re: #PB_EventType_RightClick

Verfasst: 25.06.2016 11:51
von BSP
@RSBasic.
Ja, genau so ist es gemeint.

Und darum abermals:
Recht herzlichen Dank an Dich.

Gruß: Bernd

Re: #PB_EventType_RightClick

Verfasst: 25.06.2016 18:01
von Nino
@RSBasic:
Cool. 8) Danke!