Z-Order
Posted: Mon Jun 16, 2014 4:54 pm
Code: Select all
; mestnyi
CompilerIf #PB_Compiler_OS = #PB_OS_Windows
Import ""
CompilerElse
ImportC ""
CompilerEndIf
PB_Object_EnumerateStart(*Object)
PB_Object_EnumerateNext(*Object,*ID.Integer)
PB_Object_EnumerateAbort(*Object)
PB_Window_Objects.l
PB_Gadget_Objects.l
PB_Image_Objects.l
EndImport
ProcedureDLL IDImage(Handle.l) ;Returns purebasic image (ID) from handle
Protected ID
PB_Object_EnumerateStart(PB_Image_Objects)
While PB_Object_EnumerateNext(PB_Image_Objects, @ID)
If Handle = ImageID(ID) :PB_Object_EnumerateAbort(PB_Image_Objects)
ProcedureReturn ID
EndIf
Wend
ProcedureReturn -1
EndProcedure
ProcedureDLL IDGadget(Handle.l) ;Returns purebasic gadget (ID) from handle
Protected ID
PB_Object_EnumerateStart(PB_Gadget_Objects)
While PB_Object_EnumerateNext(PB_Gadget_Objects, @ID)
If Handle = GadgetID(ID) :PB_Object_EnumerateAbort(PB_Gadget_Objects)
ProcedureReturn ID
EndIf
Wend
ProcedureReturn -1
EndProcedure
ProcedureDLL IDWindow(Handle.l) ;Returns purebasic window (ID) from handle
Protected ID
PB_Object_EnumerateStart(PB_Window_Objects)
While PB_Object_EnumerateNext(PB_Window_Objects, @ID)
If Handle = WindowID(ID) :PB_Object_EnumerateAbort(PB_Window_Objects)
ProcedureReturn ID
EndIf
Wend
ProcedureReturn -1
EndProcedure
ProcedureDLL ID(Handle.l) ;Returns purebasic (ID) from handle
Protected ID
ID=IDGadget(Handle)
If IsGadget(ID)
ProcedureReturn ID
EndIf
ID=IDWindow(Handle)
If IsWindow(ID)
ProcedureReturn ID
EndIf
ID=IDImage(Handle)
If IsImage(ID)
ProcedureReturn ID
EndIf
If IsGadget(Handle) Or IsWindow(Handle) Or IsImage(Handle)
ProcedureReturn Handle
EndIf
ProcedureReturn -1
EndProcedure
ProcedureDLL IsTopGadget(Gadget) ;Returns TRUE if gadget top
If GetWindow_(GadgetID(Gadget),#GW_HWNDFIRST) = GadgetID(Gadget)
ProcedureReturn #True
EndIf
EndProcedure
ProcedureDLL IsBottomGadget(Gadget) ;Returns TRUE if gadget bottom
If GetWindow_(GadgetID(Gadget),#GW_HWNDLAST) = GadgetID(Gadget)
ProcedureReturn #True
EndIf
EndProcedure
ProcedureDLL SetTopGadget(Gadget) ;Set gadget ZOrder front
CompilerIf #PB_Compiler_OS = #PB_OS_Linux
CompilerElseIf #PB_Compiler_OS = #PB_OS_Windows
SetWindowPos_(GadgetID(Gadget),#HWND_TOP,0,0,0,0,#SWP_NOSIZE|#SWP_NOMOVE)
CompilerEndIf
EndProcedure
ProcedureDLL SetBottomGadget(Gadget) ;Set gadget ZOrder Back
CompilerIf #PB_Compiler_OS = #PB_OS_Linux
CompilerElseIf #PB_Compiler_OS = #PB_OS_Windows
SetWindowPos_(GadgetID(Gadget),#HWND_BOTTOM,0,0,0,0,#SWP_NOSIZE|#SWP_NOMOVE)
CompilerEndIf
EndProcedure
ProcedureDLL GetTopGadget() ;Returns top gadget
Protected Gadget
PB_Object_EnumerateStart(PB_Gadget_Objects)
While PB_Object_EnumerateNext(PB_Gadget_Objects, @Gadget)
If IsTopGadget(Gadget) :PB_Object_EnumerateAbort(PB_Gadget_Objects)
ProcedureReturn Gadget
EndIf
Wend
ProcedureReturn -1
EndProcedure
ProcedureDLL GetBottomGadget() ;Returns bottom gadget
Protected Gadget
PB_Object_EnumerateStart(PB_Gadget_Objects)
While PB_Object_EnumerateNext(PB_Gadget_Objects, @Gadget)
If IsBottomGadget(Gadget) :PB_Object_EnumerateAbort(PB_Gadget_Objects)
ProcedureReturn Gadget
EndIf
Wend
ProcedureReturn -1
EndProcedure
ProcedureDLL GetNextGadget(Gadget) ;Returns gadget next gadget
Protected NextGadget =ID(GetWindow_(GadgetID(Gadget),#GW_HWNDNEXT))
If IsGadget(NextGadget)
ProcedureReturn NextGadget
EndIf
ProcedureReturn -1
EndProcedure
ProcedureDLL GetPrevGadget(Gadget) ;Returns gadget prev gadget
Protected PrevGadget =ID(GetWindow_(GadgetID(Gadget),#GW_HWNDPREV))
If IsGadget(PrevGadget)
ProcedureReturn PrevGadget
EndIf
ProcedureReturn -1
EndProcedure
ProcedureDLL SetZOrderFix() ;Set all gadgets ZOrder Fix
Protected *Style,Gadget
PB_Object_EnumerateStart(PB_Gadget_Objects)
While PB_Object_EnumerateNext(PB_Gadget_Objects, @Gadget)
CompilerIf #PB_Compiler_OS = #PB_OS_Linux
CompilerElseIf #PB_Compiler_OS = #PB_OS_Windows
*Style = GetWindowLongPtr_(GadgetID(Gadget),#GWL_STYLE)
If *Style & #WS_CLIPCHILDREN =0
SetWindowLongPtr_(GadgetID(Gadget),#GWL_STYLE,*Style|#WS_CLIPCHILDREN)
EndIf
If *Style & #WS_CLIPSIBLINGS =0
SetWindowLongPtr_(GadgetID(Gadget),#GWL_STYLE,*Style|#WS_CLIPSIBLINGS)
EndIf
PB_Object_EnumerateAbort(PB_Gadget_Objects)
CompilerEndIf
Wend
ProcedureReturn -1
EndProcedure
ProcedureDLL SetTopGadgetOne(Gadget) ;Set gadget ZOrder top gadget one
Protected PrevGadget
CompilerIf #PB_Compiler_OS = #PB_OS_Linux
CompilerElseIf #PB_Compiler_OS = #PB_OS_Windows
PrevGadget = ID(GetPrevGadget(Gadget))
If IsGadget(PrevGadget)
SetWindowPos_(GadgetID(PrevGadget), GadgetID(Gadget), 0, 0, 0, 0, #SWP_NOSIZE | #SWP_NOMOVE)
EndIf
CompilerEndIf
EndProcedure
ProcedureDLL SetBottomGadgetOne(Gadget) ;Set gadget ZOrder bottom gadget one
Protected NextGadget
CompilerIf #PB_Compiler_OS = #PB_OS_Linux
CompilerElseIf #PB_Compiler_OS = #PB_OS_Windows
NextGadget = ID(GetNextGadget(Gadget))
If IsGadget(NextGadget)
SetWindowPos_(GadgetID(Gadget), GadgetID(NextGadget), 0, 0, 0, 0, #SWP_NOSIZE | #SWP_NOMOVE)
EndIf
CompilerEndIf
EndProcedure
;------------------------------------------------
;--------- Пример использования -----------------
OpenWindow(0, 0, 0, 250, 185, "", #PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)
ButtonGadget(1, 5, 30, 105, 20, "1",#PB_Button_Right)
ButtonGadget(2, 5, 30, 120, 20, "2",#PB_Button_Right)
ButtonGadget(3, 5, 30, 135, 20, "3",#PB_Button_Right)
ButtonGadget(4, 5, 30, 150, 20, "4",#PB_Button_Right)
ButtonGadget(5, 5, 30, 165, 20, "5",#PB_Button_Right)
ButtonGadget(6, 5, 30, 180, 20, "6",#PB_Button_Right)
ButtonGadget(7, 5, 30, 195, 20, "7",#PB_Button_Right)
ButtonGadget(8, 5, 30, 210, 20, "8",#PB_Button_Right)
ButtonGadget(9, 5, 30, 225, 20, "9",#PB_Button_Right)
ButtonGadget(10, 105, 30, 140, 20, "10",#PB_Button_Right)
#Top=99
#TopOne=100
#BottomOne=101
#Bottom=102
ButtonGadget(#Top, 5, 70, 240, 20, "Gadget №10 переместить на самый Верх")
ButtonGadget(#BottomOne, 5, 100, 240, 20, "Gadget №10 переместить на один Вниз")
ButtonGadget(#TopOne, 5, 130, 240, 20, "Gadget №10 переместить на один Верх")
ButtonGadget(#Bottom, 5, 160, 240, 20, "Gadget №10 переместить на самый Вниз")
Debug "GetTopGadget "+GetTopGadget()
Debug "GetBottomGadget "+GetBottomGadget()
Debug "GetNextGadget №10 > № "+GetNextGadget(10)
Debug "GetPrevGadget №10 < № "+GetPrevGadget(10)
SetZOrderFix()
Repeat
event = WaitWindowEvent()
Select event
Case #PB_Event_Gadget
Select EventGadget()
Case #Top
SetTopGadget(10)
Case #TopOne
SetTopGadgetOne(10)
Case #BottomOne
SetBottomGadgetOne(10)
Case #Bottom
SetBottomGadget(10)
For i=0 To 3
SetTopGadgetOne(10)
Next
EndSelect
EndSelect
Until event = #PB_Event_CloseWindow