Page 1 of 1

Rebar auto-sizing

Posted: Fri Mar 09, 2007 11:15 am
by klaver

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
Any one know how to make the rebar resizine together with the window?

Posted: Fri Mar 09, 2007 11:57 am
by Fluid Byte

Code: Select all

Repeat
  Event = WindowEvent()
  Delay(1)
  
  If Event = #WM_SIZE
  	MoveWindow_(hRB,0,0,WindowWidth(MainWin),0,1)
  EndIf
Until Event = #PB_Event_CloseWindow

Posted: Fri Mar 09, 2007 3:39 pm
by klaver
Thanks, Fluid Byte :)