Rebar auto-sizing
Posted: Fri Mar 09, 2007 11:15 am
Code: Select all
#TBSTYLE_BUTTON = $0
#TBSTYLE_SEP = $1
#TBSTYLE_CHECK = $2
#TBSTYLE_GROUP = $4
#TBSTYLE_CHECKGROUP = (#TBSTYLE_GROUP | #TBSTYLE_CHECK)
#TBSTYLE_DROPDOWN = $8
#TBSTYLE_AUTOSIZE = $10
#TBSTYLE_NOPREFIX = $20
#TBSTYLE_TOOLTIPS = $100
#TBSTYLE_WRAPABLE = $200
#TBSTYLE_ALTDRAG = $400
#TBSTYLE_FLAT = $800
#TBSTYLE_LIST = $1000
#TBSTYLE_CUSTOMERASE = $2000
#TBSTYLE_REGISTERDROP = $4000
#TBSTYLE_TRANSPARENT = $8000
#TBSTYLE_EX_DRAWDDARROWS = $1
#TBSTYLE_EX_UNDOC1 = $4
#TBSTYLE_EX_MIXEDBUTTONS = $8
#TBSTYLE_EX_HIDECLIPPEDBUTTONS = $10
#TBSTYLE_EX_DOUBLEBUFFER = $80
#BTNS_BUTTON = #TBSTYLE_BUTTON
#BTNS_SEP = #TBSTYLE_SEP
#BTNS_CHECK = #TBSTYLE_CHECK
#BTNS_GROUP = #TBSTYLE_GROUP
#BTNS_CHECKGROUP = #TBSTYLE_CHECKGROUP
#BTNS_DROPDOWN = #TBSTYLE_DROPDOWN
#BTNS_AUTOSIZE = #TBSTYLE_AUTOSIZE
#BTNS_NOPREFIX = #TBSTYLE_NOPREFIX
#BTNS_SHOWTEXT = $40
#BTNS_WHOLEDROPDOWN = $80
#TB_ADDSTRING = #WM_USER + 28
#TB_SETIMAGELIST = #WM_USER + 48
#TB_GETIMAGELIST = #WM_USER + 49
Global MainWin.l, hWin.l, hTB.l, hTBList, hSB.l, oldListViewProc, hPB.l
Macro ImageList_AddIcon_(wnd,icon)
ImageList_ReplaceIcon_(wnd,-1,icon)
EndMacro
Procedure MakeLong(lo.w, hi.w)
ProcedureReturn (hi * $10000) | (lo & $FFFF)
EndProcedure
Procedure ToolBar_AddButton(id.l, text.s, image.l)
ImageList_AddIcon_(hTBList, image)
btn.TBBUTTON
btn\idCommand = id
btn\iBitmap = id
btn\fsState = #TBSTATE_ENABLED
btn\fsStyle = #BTNS_BUTTON | #BTNS_AUTOSIZE | #BTNS_SHOWTEXT ; | #BTNS_CHECK
btn\iString = SendMessage_(hTB, #TB_ADDSTRING, 0, text)
SendMessage_(hTB, #TB_INSERTBUTTON, SendMessage_(hTB, #TB_BUTTONCOUNT, 0, 0) +1, @btn)
EndProcedure
Procedure.l CreateRebar(hwndOwner, hwndTB)
rbi.REBARINFO : rbBand.REBARBANDINFO : rc.RECT
hwndRB = CreateWindowEx_(#WS_EX_TOOLWINDOW, "ReBarWindow32", #Null, #WS_CHILD | #WS_VISIBLE | #WS_CLIPSIBLINGS | #WS_CLIPCHILDREN | #RBS_VARHEIGHT | #CCS_NODIVIDER, 0, 0, 0, 0, hwndOwner, #Null, GetModuleHandle_(0), #Null)
rbi\cbSize = SizeOf(REBARINFO)
rbi\fMask = 0
rbi\himl = #Null
SendMessage_(hwndRB, #RB_SETBARINFO, 0, @rbi)
rbBand\cbSize = SizeOf(REBARBANDINFO)
rbBand\fMask = #RBBIM_COLORS | #RBBIM_TEXT | #RBBIM_STYLE | #RBBIM_CHILD | #RBBIM_CHILDSIZE ;| #RBBIM_SIZE
rbBand\fStyle = #RBBS_CHILDEDGE ;| #RBBS_NOGRIPPER
;rbBand\clrBack = RGB(200, 200, 128) | rbBand\clrFore = RGB(64, 100, 0)
tbtext$ = ""
rbBand\lpText = @tbtext$
rbBand\hwndChild = hwndTB
rbBand\cxMinChild = 100
rbBand\cyMinChild = SendMessage_(hwndTB, #TB_GETBUTTONSIZE, 0, 0)>>16
rbBand\cx = 800
SendMessage_(hwndRB, #RB_INSERTBAND, -1, @rbBand);
ProcedureReturn hwndRB
EndProcedure
Procedure MainWinCallback(hWnd, Msg, wParam, lParam)
Result = #PB_ProcessPureBasicEvents
If Msg = #WM_GETMINMAXINFO
*pMinMax.MINMAXINFO = lParam
*pMinMax\ptMinTrackSize\x = 500
*pMinMax\ptMinTrackSize\y = 150
;*pMinMax\ptMaxTrackSize\x = 600 | *pMinMax\ptMaxTrackSize\y = 300
Result = 0
EndIf
ProcedureReturn Result
EndProcedure
Procedure ListViewCallback(hWnd, Msg, wParam, lParam)
Result = CallWindowProc_(oldListViewProc, hWnd, Msg, wParam, lParam)
Select Msg
Case #WM_NOTIFY
*pnmh.NMHEADER = lParam
If *pnmh\hdr\code = #HDN_ITEMCHANGED
;MoveWindow_(hSB, 0, 0, 0, 0, 0)
EndIf
Case #WM_HSCROLL ;Debug "Horizontal!"
Case #WM_VSCROLL ;Debug "Vertical!"
EndSelect
ProcedureReturn Result
EndProcedure
Pos.RECT
Sop.RECT
MainWin = OpenWindow(#PB_Any, 200, 200, 600, 400, "Program", #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_Invisible) : hWin = WindowID(MainWin)
SetWindowLong_(hWin,#GWL_EXSTYLE,GetWindowLong_(hWin,#GWL_EXSTYLE)|#WS_EX_TOOLWINDOW)
CreateGadgetList(hWin)
SetWindowCallback(@MainWinCallback(), MainWin)
hTB = ToolBarID(CreateToolBar(#PB_Any, hWin))
Style = #CCS_NODIVIDER | #CCS_NOPARENTALIGN | #CCS_NORESIZE | #CCS_TOP | #TBSTYLE_FLAT | #TBSTYLE_LIST | #TBSTYLE_TOOLTIPS | #TBSTYLE_TRANSPARENT | #WS_CHILD | #WS_CLIPCHILDREN | #WS_CLIPSIBLINGS | #WS_VISIBLE
SetWindowLong_(hTB, #GWL_STYLE, Style) : SetWindowLong_(hTB, #GWL_EXSTYLE, #WS_EX_LEFT | #WS_EX_LTRREADING | #WS_EX_TOOLWINDOW)
;SendMessage_(hTB, #TB_SETSTYLE, 0, SendMessage_(hToolBar, #TB_GETSTYLE, $0, $0) | #TBSTYLE_AUTOSIZE | #TBSTYLE_LIST)
hList = SendMessage_(hTB, #TB_GETIMAGELIST, 0, 0);
hTBList = ImageList_Duplicate_(hList)
ImageList_Destroy_(hList)
ImageList_SetIconSize_(hTBList, 48, 48)
SendMessage_(hTB, #TB_SETIMAGELIST, 0, hTBList)
SendMessage_(hTB, #TB_SETBITMAPSIZE, 0, MakeLong(48,48))
SendMessage_(hTB, #TB_SETBUTTONSIZE, 0, MakeLong(52,52))
;SendMessage_(hTB, #TB_AUTOSIZE, 0, 0)
ToolBar_AddButton(0, "1", LoadImage_(GetModuleHandle_(0), 1, #IMAGE_ICON, 0,0,0))
ToolBar_AddButton(1, "2", LoadImage_(GetModuleHandle_(0), 2, #IMAGE_ICON, 0,0,0))
ToolBar_AddButton(2, "3", LoadImage_(GetModuleHandle_(0), 3, #IMAGE_ICON, 0,0,0))
hRB = CreateRebar(hWin, hTB)
SetWindowLong_(hRB, #GWL_STYLE, $5600B649)
SetWindowLong_(hRB, #GWL_EXSTYLE, $00000080)
GetClientRect_(hTB, @Pos)
hLV = ListIconGadget(#PB_Any, 0, Pos\bottom +1, 600, 322, "x", 100, #PB_ListIcon_FullRowSelect|#PB_ListIcon_AlwaysShowSelection)
oldListViewProc = SetWindowLong_(GadgetID(hLV), #GWL_WNDPROC, @ListViewCallback())
hStat = CreateStatusBar(#PB_Any, hWin)
StatusBarIcon(hStat, 0, LoadImage_(GetModuleHandle_(0), 4, #IMAGE_ICON, 0,0,0))
StatusBarText(hStat, 0, "What's up?")
hSB = StatusBarID(hStat)
hPB = ProgressBarGadget(#PB_Any, 480, 3, 94, 17, 0, 100)
SetParent_(GadgetID(hPB), hSB)
HideGadget(hPB, 1)
HideWindow(MainWin, 0)
Repeat
Event = WindowEvent()
Delay(1)
Until Event = #PB_Event_CloseWindow