
- PB commands supported (90%)
- UNICODE
- x64 (I hope...)

Code: Select all
XIncludeFile "CreateCustomGadget.pb"
; ********************
; EXAMPLE @ eddy
; ********************
Enumeration ;Rebar Flags
#Rebar_Vertical=$80
#Rebar_VerticalGrip=#Rebar_Vertical | #RBS_VERTICALGRIPPER
#Rebar_VariableThickness=#RBS_VARHEIGHT
#Rebar_FixedOrder=#RBS_FIXEDORDER
#Rebar_Separators=#RBS_BANDBORDERS
EndEnumeration
Structure REBARGADGET_PARAMS Extends GADGET_PARAMS
clrBack.i
clrFore.i
EndStructure
Procedure RebarGadget_RemoveGadgetItem(*gadget.GADGET, Position)
GetGadgetParams(*params, REBARGADGET_PARAMS, *gadget\hwnd)
If *params
ProcedureReturn SendMessage_(*gadget\hwnd, #RB_DELETEBAND, 0, index)
EndIf
EndProcedure
Procedure RebarGadget_ClearGadgetItemList(*gadget.GADGET)
GetGadgetParams(*params, REBARGADGET_PARAMS, *gadget\hwnd)
If *params
While CountGadgetItems(*params\ID)
RemoveGadgetItem(*params\ID, 0)
Wend
EndIf
EndProcedure
Procedure RebarGadget_CountGadgetItems(*gadget.GADGET)
GetGadgetParams(*params, REBARGADGET_PARAMS, *gadget\hwnd)
If *params
ProcedureReturn SendMessage_(*gadget\hwnd, #RB_GETBANDCOUNT, 0, 0)
EndIf
EndProcedure
Procedure RebarGadget_SetGadgetColor(*gadget.GADGET, ColorType, Color)
GetGadgetParams(*params, REBARGADGET_PARAMS, *gadget\hwnd)
If *params
Select ColorType
Case #PB_Gadget_FrontColor
*params\clrFore=Color
SendMessage_(*gadget\hwnd, #RB_SETTEXTCOLOR, 0, Color)
Case #PB_Gadget_BackColor
*params\clrBack=Color
SendMessage_(*gadget\hwnd, #RB_SETBKCOLOR, 0, Color)
EndSelect
EndIf
EndProcedure
Procedure RebarGadget_GetGadgetColor(*gadget.GADGET, ColorType)
GetGadgetParams(*params, REBARGADGET_PARAMS, *gadget\hwnd)
If *params
Select ColorType
Case #PB_Gadget_FrontColor
*params\clrFore=SendMessage_(*gadget\hwnd, #RB_GETTEXTCOLOR, 0, 0)
ProcedureReturn *params\clrFore
Case #PB_Gadget_BackColor
*params\clrBack=SendMessage_(*gadget\hwnd, #RB_GETBKCOLOR, 0, 0)
ProcedureReturn *params\clrBack
EndSelect
EndIf
EndProcedure
Procedure RebarGadget_AddGadgetItem(*gadget.GADGET, Position, Text$, ImageID=0, Flags=0)
GetGadgetParams(*params, REBARGADGET_PARAMS, *gadget\hwnd)
If *params
Protected BarWidth=Flags
Protected BarContainerID=ContainerGadget(#PB_Any, 0, 0, 0, 0)
Protected rbBand.REBARBANDINFO
rbBand\cbSize=SizeOf(REBARBANDINFO)
rbBand\fMask | #RBBIM_STYLE | #RBBIM_CHILD | #RBBIM_CHILDSIZE | #RBBIM_HEADERSIZE
rbBand\fMask | #RBBIM_TEXT | #RBBIM_COLORS | #RBBIM_IMAGE
rbBand\fStyle=#RBBS_CHILDEDGE
rbBand\lpText=@Text$
rbBand\hwndChild=GadgetID(BarContainerID)
;size band
rbBand\cyMinChild=BarWidth
rbBand\cx=BarWidth
rbBand\cxHeader=30
;color band
rbBand\clrBack=*params\clrBack
rbBand\clrFore=*params\clrFore
SetGadgetColor(BarContainerID, #PB_Gadget_BackColor, *params\clrBack)
;add new band
SendMessage_(*gadget\hwnd, #RB_INSERTBAND, Position, @rbBand)
ProcedureReturn BarContainerID
EndIf
EndProcedure
Procedure RebarGadget_OpenGadgetList(*gadget.GADGET, GadgetItem)
GetGadgetParams(*params, REBARGADGET_PARAMS, *gadget\hwnd)
If GadgetItem=-2 : ProcedureReturn #False : EndIf
If *params
Protected BarContainerID=GadgetItem
Protected hwndChild=GadgetID(BarContainerID)
Protected rbBand.REBARBANDINFO
rbBand\cbSize=SizeOf(REBARBANDINFO)
rbBand\fMask | #RBBIM_STYLE | #RBBIM_CHILD | #RBBIM_CHILDSIZE | #RBBIM_HEADERSIZE
rbBand\fMask | #RBBIM_TEXT | #RBBIM_COLORS | #RBBIM_IMAGE
Protected rbIndex
Protected rbLast=CountGadgetItems(*params\ID)-1
For rbIndex=0 To rbLast
SendMessage_(*gadget\hwnd, #RB_GETBANDINFO, rbIndex, @rbBand)
If rbBand\hwndChild=hwndChild
ProcedureReturn OpenGadgetList(BarContainerID)
Break
EndIf
Next
EndIf
EndProcedure
Procedure RebarGadget_FreeGadget(*gadget.GADGET)
GetGadgetParams(*params, REBARGADGET_PARAMS, *gadget\hwnd)
If *params
EndIf
EndProcedure
Procedure RebarGadget_Callback(hwnd, message, wparam, lparam)
GetGadgetParams(*params, REBARGADGET_PARAMS, hwnd)
With *params
Select message
Case #WM_LBUTTONDOWN
;PB_Gadget_SendGadgetCommand(hwnd, 10000)
EndSelect
ProcedureReturn CallWindowProc_(\OldCallback, hwnd, message, wparam, lparam)
EndWith
EndProcedure
Procedure RebarGadget(ID, x, y, Width, Height, Flags=0, BackColor=#PB_Ignore, ForeColor=#PB_Ignore)
NewGadgetParams(*params, REBARGADGET_PARAMS)
; ********************
; Gadget Paramters
; ********************
With *params
;for window creation
\Window_Style=#WS_CHILD | #WS_VISIBLE | #WS_CLIPSIBLINGS | #RBS_VARHEIGHT | Flags
\Window_ExStyle=#WS_EX_TOOLWINDOW
\Window_ClassName="ReBarWindow32"
\Window_Text=""
;for gadget customization
\NewType=#PB_GadgetType_Unknown
\NewCallback=@RebarGadget_Callback()
;here .... all your custom parameters
\clrBack=GetSysColor_(#COLOR_BTNFACE)
\clrFore=GetSysColor_(#COLOR_BTNTEXT)
If BackColor<>#PB_Ignore : \clrBack=BackColor : EndIf
If ForeColor<>#PB_Ignore : \clrFore=ForeColor : EndIf
EndWith
; ********************
; Gadget Commands
; ********************
With *params\cmds
;use custom command
; *GadgetCallback
\FreeGadget=@RebarGadget_FreeGadget()
; *GetGadgetState
; *SetGadgetState
; *GetGadgetText
; *SetGadgetText
\AddGadgetItem2=@RebarGadget_AddGadgetItem()
\AddGadgetItem3=@RebarGadget_AddGadgetItem()
\RemoveGadgetItem=@RebarGadget_RemoveGadgetItem()
\ClearGadgetItemList=@RebarGadget_ClearGadgetItemList()
\ResizeGadget=0
\CountGadgetItems=@RebarGadget_CountGadgetItems()
; *GetGadgetItemState
; *SetGadgetItemState
; *GetGadgetItemText
; *SetGadgetItemText
\OpenGadgetList2=@RebarGadget_OpenGadgetList()
\GadgetX=0
\GadgetY=0
\GadgetWidth=0
\GadgetHeight=0
\HideGadget=0
;NOTUSED; *AddGadgetColumn
;NOTUSED; *RemoveGadgetColumn
; *GetGadgetAttribute
; *SetGadgetAttribute
; *GetGadgetItemAttribute2
; *SetGadgetItemAttribute2
\SetGadgetColor=@RebarGadget_SetGadgetColor()
\GetGadgetColor=@RebarGadget_GetGadgetColor()
; *SetGadgetItemColor2
; *GetGadgetItemColor2
; *SetGadgetItemData
; *GetGadgetItemData
EndWith
;check requirements
Protected icex.INITCOMMONCONTROLSEX
icex\dwSize=SizeOf(INITCOMMONCONTROLSEX);
icex\dwICC=#ICC_COOL_CLASSES | #ICC_BAR_CLASSES
If Not InitCommonControlsEx_(@icex) : ProcedureReturn #False : EndIf
;create gadget
Protected result=CreateGadget(ID, x, y, Width, Height, *params)
If Not result : ProcedureReturn #False : EndIf
;remove theme skin if possible
Protected UxTheme=OpenLibrary(#PB_Any, "UxTheme.dll")
Protected *SetWindowTheme
If UxTheme
*SetWindowTheme=GetFunction(UxTheme, "SetWindowTheme")
CallFunctionFast(*SetWindowTheme, GadgetID(*params\ID), "", "")
CloseLibrary(UxTheme)
EndIf
ProcedureReturn result
EndProcedure
OpenWindow(1, 0, 0, 500, 500, "Custom RebarGadget")
Global rebarFlags
rebarFlags | #Rebar_Vertical | #Rebar_VerticalGrip
rebarFlags | #Rebar_FixedOrder | #Rebar_Separators
rebarFlags | #Rebar_VariableThickness
SetGadgetFont(#PB_Default, LoadFont(1, "verdana", 8, #PB_Font_Bold))
If RebarGadget(2, 5, 5, 0, 0, rebarFlags)
rebarItemID1=AddGadgetItem(2, -1, "Bar1", 0, 200)
rebarItemID2=AddGadgetItem(2, -1, "Bar2", 0, 185)
ExplorerTreeGadget(20, 5, 5, 180, 200, "C:\*.txt;*.pb")
ButtonGadget(21, 5, 210, 180, 20, "Back")
rebarItemID3=AddGadgetItem(2, -1, "Bar3∞", 0, 185)
CalendarGadget(30, 5, 5, 180, 200)
ButtonGadget(31, 5, 210, 180, 20, "Cleanup")
CloseGadgetList()
OpenGadgetList(2, rebarItemID1)
ButtonGadget(10, 45, 10, 100, 25, "Button")
ListIconGadget(11, 5, 40, 180, 350, "Listview", 125)
ComboBoxGadget(12, 5, 410, 180, 200)
CloseGadgetList()
Debug "CountGadgetItems="+Str(CountGadgetItems(2))
Debug "GadgetWidth="+Str(GadgetWidth(2))
Debug "GadgetHeight="+Str(GadgetHeight(2))
Debug "IsGadget(rebarItemID3)="+Str(IsGadget(rebarItemID3))
EndIf
Repeat : Until WaitWindowEvent()=#PB_Event_CloseWindow