Rechtsklick mit ExplorerTreegadget

Anfängerfragen zum Programmieren mit PureBasic.
EmmJott
Beiträge: 46
Registriert: 25.10.2024 12:23

Rechtsklick mit ExplorerTreegadget

Beitrag von EmmJott »

Guten Morgen allerseits,

habe mit dem Explorertreegadget folgendes Problem:
Ein Linksklick wird nur registriert, wenn ich entweder auf einen Eintrag oder auf einen der +-Buttons klicke. Soweit so gut. Beim Rechtsklick ist das aber anders, der wird immer registriert und es wird der Eintrag als markiert gezeigt, der Y-Pos-mäßig am ehesten zur Mausposition passt - egal wie breit man das Gadget macht.

Da ich per Rechtsklick ein PopupMenü öffne, das man auch ungenutzt wieder verlassen kann, bliebe dann eine falsche Einstellung im Explorertreegadget stehen.

Kann man einstellen, dass der Rechtsklick genauso funktioniert wie der linksklick, also nur die Einstellung verändert, wenn man genau den Eintrag trifft? Oder: Kann man irgendwie rausbekommen, was vor dem Rechtsklick eingestellt war? Oder: Wie fragt man einen Rechtsklick über dem Fenster (und über einem Gadget) ab, ohne dass der Rechtsklick im Gadget ausgelöst wird?
Bin aktiv in der rentenvorbereitenden Arbeitslosigkeit - zwangsweise. Auch nach >30 Jahren im Betrieb springst Du über die Klinge, wenn der (Miss-)Manager seinen Hintern retten will. Lasst Euch von euren Arbeitgebern bloß nix von wegen Loyalität erzählen - wenn's drauf ankommt, ist die nix Wert!
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Rechtsklick mit ExplorerTreegadget

Beitrag von mk-soft »

Wird für Anfänger etwas schwierig. Einfach studieren ...

Ist wohl ne Window Macke.
Mit SetWindowsCallback ändert sich kurz der Eintrag.

Aber man kann den Rechtsklick komplett abfangen.
Siehe SetGadgetCallback -> TreeGadgetCB

Code: Alles auswählen

;-TOP

; Comment : Module SetGadgetCallback (Windows Only)
; Author  : mk-soft
; Version : v0.03
; Created : 10.06.2018
; Updated : 16.02.2020
; Link    : https://www.purebasic.fr/english/viewtopic.php?f=12&t=70842
;
; Syntax Callback:
;           Procedure GadgetCB(hWnd,uMsg,wParam,lParam)
;             Select uMsg
;               ;TODO
;             EndSelect
;             ; Call previous gadget procedure
;             ProcedureReturn CallGadgetProc(hWnd,uMsg,wParam,lParam)
;           EndProcedure
;
; *****************************************************************************

DeclareModule GadgetCallback
  
  Declare SetGadgetCallback(Gadget, *lpNewFunc) 
  Declare CallGadgetProc(hWnd, uMsg, wParam, lParam)
  
EndDeclareModule

Module GadgetCallback
  
  EnableExplicit
  
  ; ---------------------------------------------------------------------------
  
  Procedure SetGadgetCallback(Gadget, *lpNewFunc)
    Protected hWnd, *lpPrevFunc
    
    hWnd = GadgetID(Gadget)
    *lpPrevFunc = GetProp_(hWnd, "PB_PrevFunc")
    ; Remove exists Callback
    If *lpPrevFunc
      SetWindowLongPtr_(hWnd, #GWL_WNDPROC, *lpPrevFunc)
      RemoveProp_(hWnd, "PB_PrevFunc")
    EndIf
    ; Set new Callback  
    If *lpNewFunc
      *lpPrevFunc = SetWindowLongPtr_(hWnd, #GWL_WNDPROC, *lpNewFunc)
      SetProp_(hWnd, "PB_PrevFunc", *lpPrevFunc)
      ProcedureReturn *lpPrevFunc
    EndIf
    ProcedureReturn 0
  EndProcedure
  
  ; ---------------------------------------------------------------------------
  
  Procedure CallGadgetProc(hWnd, uMsg, wParam, lParam)
    Protected result, *lpPrevFunc
    
    *lpPrevFunc = GetProp_(hWnd, "PB_PrevFunc")
    If *lpPrevFunc
      result = CallWindowProc_(*lpPrevFunc, hWnd, uMsg, wParam, lParam)
    EndIf
    ProcedureReturn result
  EndProcedure
EndModule

; *****************************************************************************


;-TOP Window

#ProgramTitle = "Main Window"
#ProgramVersion = "v1.01.2"

Enumeration Windows
  #Main
EndEnumeration

Enumeration MenuBar
  #MainMenu
EndEnumeration

Enumeration MenuItems
  #MainMenuAbout
  #MainMenuExit
EndEnumeration

Enumeration Gadgets
  #MainTree
EndEnumeration

Enumeration StatusBar
  #MainStatusBar
EndEnumeration

; ----

UseModule GadgetCallback

Procedure TreeGadgetCB(hWnd, uMsg, wParam, lParam)
  Select uMsg
    Case #WM_RBUTTONDOWN
      PostEvent(#PB_Event_Gadget, GetActiveWindow(), #MainTree, #PB_EventType_RightClick)
      ProcedureReturn 0
      
    Case #WM_RBUTTONUP
      ProcedureReturn 0
      
  EndSelect
  
  ProcedureReturn CallGadgetProc(hWnd,uMsg,wParam,lParam)
  
EndProcedure


Procedure WinCallback(hWnd, uMsg, wParam, lParam) 
  Protected *notify.NMHDR  
  Select uMsg
    Case #WM_NOTIFY
      *notify = lParam
      If *notify\idFrom = #MainTree
        If *notify\code = #NM_RCLICK
          ProcedureReturn 0
        EndIf
      EndIf
      
  EndSelect
  
  ProcedureReturn #PB_ProcessPureBasicEvents 
EndProcedure 

; ----

Procedure UpdateWindow()
  Protected dx, dy
  dx = WindowWidth(#Main)
  dy = WindowHeight(#Main) - StatusBarHeight(#MainStatusBar) - MenuHeight()
  ; Resize gadgets
  ResizeGadget(#MainTree, 5, 5, dx - 10, dy -10)
EndProcedure

Procedure Main()
  Protected dx, dy
  
  #MainStyle = #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_MaximizeGadget | #PB_Window_MinimizeGadget
  
  If OpenWindow(#Main, #PB_Ignore, #PB_Ignore, 800, 600, #ProgramTitle , #MainStyle)
    ; Menu
    CreateMenu(#MainMenu, WindowID(#Main))
    MenuTitle("&File")
    CompilerIf #PB_Compiler_OS = #PB_OS_MacOS
      MenuItem(#PB_Menu_About, "")
    CompilerElse
      MenuItem(#MainMenuAbout, "About")
    CompilerEndIf
    ; Menu File Items
    
    CompilerIf Not #PB_Compiler_OS = #PB_OS_MacOS
      MenuBar()
      MenuItem(#MainMenuExit, "E&xit")
    CompilerEndIf
    
    ; StatusBar
    CreateStatusBar(#MainStatusBar, WindowID(#Main))
    AddStatusBarField(#PB_Ignore)
    
    ; Gadgets
    dx = WindowWidth(#Main)
    dy = WindowHeight(#Main) - StatusBarHeight(#MainStatusBar) - MenuHeight()
    ExplorerTreeGadget(#MainTree, 5, 5, dx - 10, dy -10, GetHomeDirectory())
    ; Bind Events
    BindEvent(#PB_Event_SizeWindow, @UpdateWindow(), #Main)
    
    ;SetWindowCallback(@WinCallback())
    
    SetGadgetCallback(#MainTree, @TreeGadgetCB())
    
    ; Event Loop
    Repeat
      Select WaitWindowEvent()
        Case #PB_Event_CloseWindow
          Select EventWindow()
            Case #Main
              Break
              
          EndSelect
          
        Case #PB_Event_Menu
          Select EventMenu()
            CompilerIf #PB_Compiler_OS = #PB_OS_MacOS   
              Case #PB_Menu_About
                PostEvent(#PB_Event_Menu, #Main, #MainMenuAbout)
                
              Case #PB_Menu_Preferences
                
              Case #PB_Menu_Quit
                PostEvent(#PB_Event_CloseWindow, #Main, #Null)
                
            CompilerEndIf
            
          Case #MainMenuAbout
            MessageRequester("About", #ProgramTitle + #LF$ + #ProgramVersion, #PB_MessageRequester_Info)
              
          Case #MainMenuExit
            PostEvent(#PB_Event_CloseWindow, #Main, #Null)
            
          EndSelect
          
        Case #PB_Event_Gadget
          Select EventGadget()
            Case #MainTree
              Select EventType()
                Case #PB_EventType_LeftClick
                  Debug "leftClick"
                  
                Case #PB_EventType_RightClick
                  Debug "rightClick"
                  
              EndSelect
              
          EndSelect
          
      EndSelect
    ForEver
    
  EndIf
  
EndProcedure : Main()
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
EmmJott
Beiträge: 46
Registriert: 25.10.2024 12:23

Re: Rechtsklick mit ExplorerTreegadget

Beitrag von EmmJott »

Hammermäßig! Würde nicht behaupten wollen, dass ich den Code so einfach verinnerlichen werde, aber mein Progrämmchen wird darauf aufbauen können.

Herzlichen Dank für das Beispiel!
Bin aktiv in der rentenvorbereitenden Arbeitslosigkeit - zwangsweise. Auch nach >30 Jahren im Betrieb springst Du über die Klinge, wenn der (Miss-)Manager seinen Hintern retten will. Lasst Euch von euren Arbeitgebern bloß nix von wegen Loyalität erzählen - wenn's drauf ankommt, ist die nix Wert!
Antworten