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?
Rechtsklick mit ExplorerTreegadget
Rechtsklick mit ExplorerTreegadget
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!
Re: Rechtsklick mit ExplorerTreegadget
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
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
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Re: Rechtsklick mit ExplorerTreegadget
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!
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!