Okay than, challenge accepted.
Due to the demand for mouse positioning and the solutions in the other thread, here is another version with a subclass solution and more information
(full API for enthusiasts).
Here you have many options to get the information you need.
Code: Select all
; Self made clickable statusbar Version 2 -- Subclass and PostEvent
; written by Axolotl
;
EnableExplicit
Enumeration EWindow 1
#WND_Main
EndEnumeration
Enumeration EGadget 1
#GDT_txtMousePos
#GDT_txtInfo
; ...
EndEnumeration
Enumeration EStatusbar 1
#STB_Main
EndEnumeration
Enumeration EEvent #PB_Event_FirstCustomValue ; Solution 1 => custom event
#EVT_Statusbar
EndEnumeration
;-- Import "Comctl32.lib"
Import "Comctl32.lib" ;{ <<< from (latest) Comctl32.dll >>>
; use the PureBasic Syntax (Windows API procedures using trailing underscore)
;
CompilerIf #PB_Compiler_Processor = #PB_Processor_x64
SetWindowSubclass_(hWnd, *fnSubclass, uIdSubclass, dwRefData) As "SetWindowSubclass"
GetWindowSubclass_(hWnd, *fnSubclass, uIdSubclass, *dwRefData) As "GetWindowSubclass"
RemoveWindowSubclass_(hWnd, *fnSubclass, uIdSubclass) As "RemoveWindowSubclass"
DefSubclassProc_(hWnd, uMsg, wParam, lParam) As "DefSubclassProc"
CompilerElse
SetWindowSubclass_(hWnd, *fnSubclass, uIdSubclass, dwRefData) As "_SetWindowSubclass@16"
GetWindowSubclass_(hWnd, *fnSubclass, uIdSubclass, *dwRefData) As "_GetWindowSubclass@16"
RemoveWindowSubclass_(hWnd, *fnSubclass, uIdSubclass) As "_RemoveWindowSubclass@12"
DefSubclassProc_(hWnd, uMsg, wParam, lParam) As "_DefSubclassProc@16"
CompilerEndIf
EndImport ;} End of import "Comctl32.lib"
Procedure StatusbarSubclassProc(hWnd, uMsg, wParam, lParam, uIdSubclass, dwRefData)
Protected index, found, nbFields, tmp, pt.POINT, rc.RECT, Dim borders.l(3)
Select uMsg
Case #WM_NCDESTROY ; clean up
RemoveWindowSubclass_(hWnd, @StatusbarSubclassProc(), uIdSubclass)
Case #WM_MOUSEMOVE
; this gadget support is for debugging reasons
SetGadgetText(#GDT_txtMousePos, "MousePos: " + Str(lParam & $FFFF) + ", " + Str(lParam >> 16 & $FFFF))
Case #WM_LBUTTONDOWN ;: Debug "WM_LBUTTONDOWN "
If GetCursorPos_(@pt) And ScreenToClient_(hWnd, @pt)
If SendMessage_(hWnd, #SB_GETBORDERS, 0, @borders()) ; array that has three elements => width of horizontal, vertical and border between rectangles.
EndIf
nbFields = SendMessage_(hWnd, #SB_GETPARTS, 0, 0) ; retrieve the current number of Fields
If nbFields
found = -1 ; or -2
For index = 0 To nbFields - 1
tmp = pt\x + (index * borders(2))
If SendMessage_(hWnd, #SB_GETRECT, index, @rc) And tmp >= rc\left And tmp <= rc\right
found = index
Break
EndIf
Next index
; custom event (dwRefDate == Event and uIdSubclass == Window)
PostEvent(dwRefData, uIdSubclass, found) ; use Object as Field-Number
EndIf
EndIf
ProcedureReturn 1 ; if the message is done
; Case #WM_RBUTTONDOWN :Debug "WM_RBUTTONDOWN"
; ; copy the code from above for right mouse button if you need it.
; ProcedureReturn 1 ; if the message is done
EndSelect
ProcedureReturn DefSubclassProc_(hWnd, uMsg, wParam, lParam)
EndProcedure
Procedure Main()
Protected fieldNumber
If OpenWindow(#WND_Main, 100, 150, 320, 100, "PureBasic - StatusBar Example", #PB_Window_SystemMenu | #PB_Window_SizeGadget| #PB_Window_ScreenCentered)
TextGadget(#GDT_txtMousePos, 8, 8, 304, 20, "")
TextGadget(#GDT_txtInfo, 8, 32, 304, 20, "")
If CreateStatusBar(#STB_Main, WindowID(#WND_Main))
AddStatusBarField(100)
AddStatusBarField(50)
AddStatusBarField(100)
EndIf
StatusBarText(#STB_Main, 0, "Area 1")
StatusBarText(#STB_Main, 1, "Area 2");, #PB_StatusBar_BorderLess)
StatusBarText(#STB_Main, 2, "Area 3", #PB_StatusBar_Right | #PB_StatusBar_Raised)
; Subclass with
; dwRefDate == Event
; uIdSubclass == Window
SetWindowSubclass_(StatusBarID(#STB_Main), @StatusbarSubclassProc(), #WND_Main, #EVT_Statusbar)
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
Break
Case #EVT_Statusbar ; use custom event
fieldNumber = EventGadget() ; see above
If fieldNumber = -1
SetGadgetText(#GDT_txtInfo, "Clicked on Field Number == Outside the Fields")
Else
SetGadgetText(#GDT_txtInfo, "Clicked on Field Number == " + Str(fieldNumber))
EndIf
EndSelect
ForEver
EndIf
ProcedureReturn 0
EndProcedure
End Main()