Code : Tout sélectionner
EnableExplicit
Global lInc.l, lEvent.l
Global bEndWindow.b
Global Dim FieldWidths.l(3)
Declare StatusBar_Resize(StatusBarID.l, Num.l, Array StatusBarWidthArr.l(1))
Declare StatusBar_Width(StatusBarID.l, Field.l)
Declare StatusBar_SetFieldWidth(StatusBar.l, Item.l, Width.l)
OpenWindow(0, 0, 0, 600, 400, "Resize StatusBar", #PB_Window_SystemMenu|#PB_Window_TitleBar|#PB_Window_ScreenCentered)
CreateStatusBar(0, WindowID(0))
For lInc = 0 To 2
AddStatusBarField(WindowWidth(0)/3)
StatusBarText(0, lInc, "Field "+Str(lInc))
Next
ButtonGadget(1, (WindowWidth(0) - 200)/2, (WindowHeight(0) - 50)/2, 200, 50, "Resize StatusBar")
ButtonGadget(2, (WindowWidth(0) - 200)/2, (WindowHeight(0) - 50)/2+50, 200, 50, "Resize a part of StatusBar")
Repeat
lEvent = WaitWindowEvent()
Select lEvent
Case #PB_Event_Gadget
Select EventGadget()
Case 1 ;{ Resize StatusBar
FieldWidths(0) = Random(WindowWidth(0)/2)
FieldWidths(1) = Random(WindowWidth(0) - FieldWidths(0))
FieldWidths(2) = -1
StatusBar_Resize(0, 3, FieldWidths())
StatusBarText(0, 0, "Width = "+Str(StatusBar_Width(0,0)))
StatusBarText(0, 1, "Width = "+Str(StatusBar_Width(0,1)))
StatusBarText(0, 2, "Width = "+Str(StatusBar_Width(0,2)))
;}
Case 2 ;{ Resize a part of StatusBar
StatusBar_SetFieldWidth(0, 1, 60 + Random(40))
StatusBarText(0, 1, "Width = "+Str(StatusBar_Width(0,1)))
;}
EndSelect
Case #PB_Event_CloseWindow ;{
bEndWindow = #True
;}
EndSelect
Until bEndWindow
;@desc Resize fields of a statusbar
;@@windows
;@link http://msdn.microsoft.com/en-us/library/bb760757(VS.85).aspx
ProcedureDLL StatusBar_Resize(StatusBar.l, Num.l, Array StatusBarWidthArr.l(1))
If IsStatusBar(StatusBar)
Protected StatusBarID = StatusBarID(StatusBar)
CompilerSelect #PB_Compiler_OS
CompilerCase #PB_OS_Linux ;{
Protected *HBoxGTK.GtkWidget, *FrameGTK.GtkWidget
Protected *HBoxList.GList, *HBoxItem.GList
Protected *AllocItem.GtkAllocation
Protected lIncA.l, lIncB.l, lPadding.l
*HBoxGTK.GtkWidget = StatusBarID
*HBoxList = gtk_container_get_children_(*HBoxGTK)
For lIncA = 0 To g_list_length_(*HBoxList) - 1
*HBoxItem = g_list_nth_(*HBoxList, lIncA)
*FrameGTK = *HBoxItem\data
; get the padding of gtkobjects in gtkhbox
gtk_box_query_child_packing_(*HBoxGTK, *FrameGTK, 0, 0, @lPadding, 0)
*AllocItem = *FrameGTK\allocation
If lIncA <> g_list_length_(*HBoxList) - 1
; define the width of statusbarfield
*AllocItem\width = StatusBarWidthArr(lIncA)
Else
; calculate the last statusbarfield width
If StatusBarWidthArr(lIncA) = - 1
*AllocItem\width = *HBoxGTK\allocation\width
For lIncB = 0 To lIncA
*AllocItem\width - StatusBarWidthArr(lIncB)
Next
*AllocItem\width - (lIncA + 1) * 2 * lPadding
Else ; if defined, define the width of statusbarfield
*AllocItem\width = StatusBarWidthArr(lIncA)
EndIf
EndIf
; define the start position of frames
*AllocItem\x = lPadding
If lIncA > 0
For lIncB = 0 To lIncA
*AllocItem\x + lPadding * 2 + StatusBarWidthArr(lIncB)
Next
EndIf
gtk_widget_size_allocate_(*FrameGTK, *AllocItem)
gtk_widget_set_size_request_(*FrameGTK, *AllocItem\width, *AllocItem\height)
Next
;}
CompilerCase #PB_OS_Windows ;{
SendMessage_(StatusBarID, #SB_SETPARTS, Num, StatusBarWidthArr())
;}
CompilerEndSelect
EndIf
EndProcedure
;@desc Returns the width of the nth field of a statusbar
;@@windows
;@link http://msdn.microsoft.com/en-us/library/bb760748(VS.85).aspx
ProcedureDLL StatusBar_Width(StatusBar.l, Field.l)
If IsStatusBar(StatusBar)
Protected StatusBarID = StatusBarID(StatusBar)
CompilerSelect #PB_Compiler_OS
CompilerCase #PB_OS_Linux ;{
Protected *HBoxGTK.GtkWidget, *FrameGTK.GtkWidget
Protected *HBoxList.GList, *HBoxItem.GList
Protected *AllocItem.GtkAllocation
*HBoxGTK.GtkWidget = StatusBarID
*HBoxList = gtk_container_get_children_(*HBoxGTK)
If Field >= g_list_length_(*HBoxList)
Field = g_list_length_(*HBoxList) - 1
EndIf
*HBoxItem = g_list_nth_(*HBoxList, Field)
*FrameGTK = *HBoxItem\data
*AllocItem = *FrameGTK\allocation
ProcedureReturn *AllocItem\width
;}
CompilerCase #PB_OS_Windows ;{
Protected rc.RECT
SendMessage_(StatusBarID, #SB_GETRECT, Field,@rc)
ProcedureReturn rc\right - rc\left
;}
CompilerEndSelect
EndIf
EndProcedure
;@@windows
;@author Freak
ProcedureDLL StatusBar_SetFieldWidth(StatusBar.l, Item.l, Width.l)
If IsStatusBar(StatusBar)
Protected StatusBarID = StatusBarID(StatusBar)
CompilerSelect #PB_Compiler_OS
CompilerCase #PB_OS_Linux ;{
Protected *HBoxGTK.GtkWidget, *FrameGTK.GtkWidget
Protected *HBoxList.GList, *HBoxItem.GList
Protected *AllocItem.GtkAllocation
Protected lIncA.l, lIncB.l, lPadding.l
*HBoxGTK.GtkWidget = StatusBarID
*HBoxList = gtk_container_get_children_(*HBoxGTK)
*HBoxItem = g_list_nth_(*HBoxList, Item)
*FrameGTK = *HBoxItem\data
; get the padding of gtkobjects in gtkhbox
gtk_box_query_child_packing_(*HBoxGTK, *FrameGTK, 0, 0, @lPadding, 0)
*AllocItem = *FrameGTK\allocation
If lIncA <> g_list_length_(*HBoxList) - 1
; define the width of statusbarfield
*AllocItem\width = Width
Else
; calculate the last statusbarfield width
If Width = - 1
*AllocItem\width = *HBoxGTK\allocation\width
For lIncB = 0 To lIncA
*AllocItem\width - StatusBar_Width(StatusBar, lIncB)
Next
*AllocItem\width - (lIncA + 1) * 2 * lPadding
Else ; if defined, define the width of statusbarfield
*AllocItem\width = Width
EndIf
EndIf
; define the start position of frames
*AllocItem\x = lPadding
If lIncA > 0
For lIncB = 0 To lIncA
*AllocItem\x + lPadding * 2 + StatusBar_Width(StatusBar, lIncB)
Next
EndIf
gtk_widget_size_allocate_(*FrameGTK, *AllocItem)
gtk_widget_set_size_request_(*FrameGTK, *AllocItem\width, *AllocItem\height)
;}
CompilerCase #PB_OS_Windows ;{
Protected nParts.l, lLeftField.l, lResult.l
Protected *dwFields
nParts = SendMessage_(StatusBarID, #SB_GETPARTS, 0, 0)
*dwFields = AllocateMemory(nParts * 4)
If *dwFields
SendMessage_(StatusBarID, #SB_GETPARTS, nParts, *dwFields)
If Item < 1
lLeftField = 0
Else
lLeftField = PeekL(*dwFields + ((Item - 1) * 4))
EndIf
PokeL(*dwFields + (Item * 4), lLeftField + Width)
lResult = SendMessage_(StatusBarID, #SB_SETPARTS, nParts, *dwFields)
FreeMemory(*dwFields)
ProcedureReturn lResult
EndIf
ProcedureReturn #False
;}
CompilerEndSelect
EndIf
EndProcedure