Code: Select all
Structure GadgetsSizesList
id.i
x.i
y.i
w.i
h.i
flag.i
EndStructure
Structure WH
w.i
h.i
w2.i
h2.i
EndStructure
Global NewList GadgetsSizesList.GadgetsSizesList()
Global GUI.WH
Procedure GetNewXYWH(ID)
Protected x, y, w, h
ForEach GadgetsSizesList()
If GadgetsSizesList()\id = ID ; исправить на случай если не найдено
Break
EndIf
Next
With GadgetsSizesList()
If \flag = 0 ; по умолчанию, всё остаётся на месте
ProcedureReturn
EndIf
If \flag & 1 ; изменяется размер и отступы пропорционально новым размерам окна
x = \x * GUI\w2 / GUI\w
y = \y * GUI\h2 / GUI\h
w = \w * GUI\w2 / GUI\w
h = \h * GUI\h2 / GUI\h
Else
x = \x
y = \y
w = \w
h = \h
EndIf
If \flag & 2 ; левый отступ не изменяется
x = #PB_Ignore
EndIf
If \flag & 4 ; правый отступ не изменяется
tmp = GUI\w - \x - \w
If \flag & 2 ; левый отступ не изменяется
; x = #PB_Ignore
w = GUI\w2 - \x - tmp
Else
x = GUI\w2 - w - tmp
EndIf
EndIf
; If \flag & 16
; EndIf
If \flag & 32 ; верхний отступ не изменяется
y = #PB_Ignore
EndIf
If \flag & 64 ; нижний отступ не изменяется
tmp = GUI\h - \y - \h
If \flag & 32 ; верхний отступ не изменяется
; y = #PB_Ignore
h = GUI\h2 - \y - tmp
Else
y = GUI\h2 - h - tmp
EndIf
EndIf
If \flag & 256 ; ширина не изменяется
w = #PB_Ignore
EndIf
If \flag & 512 ; высота не изменяется
h = #PB_Ignore
EndIf
If \flag & 8 ; не перемещается относительно горизонтального центра
x = (\x + \w / 2) - w / 2
EndIf
If \flag & 128 ; не перемещается относительно вертикального центра
y = (\y + \h / 2) - h / 2
EndIf
EndWith
ResizeGadget(ID, x, y, w, h)
EndProcedure
Procedure SizeWindowHandler()
With GUI
\w2 = WindowWidth(0)
\h2 = WindowHeight(0)
EndWith
GetNewXYWH(1)
GetNewXYWH(2)
EndProcedure
Procedure AddGadgetSize(ID, flag)
AddElement(GadgetsSizesList())
With GadgetsSizesList()
\id = ID
\x = GadgetX(ID)
\y = GadgetY(ID)
\w = GadgetWidth(ID)
\h = GadgetHeight(ID)
\flag = flag
EndWith
EndProcedure
; Объединённые стили
; SIZE 768 (256+512) размер не изменяется
; MENUBAR 544 (512+32) элементы остаются в верхней части окна и без изменения высоты
; STATEBAR 576 (512+64) элементы остаются в нижней части окна и без изменения высоты
; ALL 802 (2+32+256+512) элемент не изменяется и не перемещается
; BORDERS 102 (2+4+32+64) размеры изменяются на величину изменения окна.
;-┌──GUI──┐
If OpenWindow(0, 0, 0, 720, 400, "Example...", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_SizeGadget)
With GUI
\w = 720
\h = 400
EndWith
ButtonGadget(1, 10, 10, 100, 30, "Button")
AddGadgetSize(1, 1)
EditorGadget(2, 10, 70, 700, 320)
AddGadgetSize(2, 32 + 64 + 2 + 4)
BindEvent(#PB_Event_SizeWindow, @SizeWindowHandler())
;-┌──Loop──┐
Repeat
Select WaitWindowEvent()
Case #PB_Event_Gadget
Select EventGadget()
Case 1
Debug 1
EndSelect
Case #PB_Event_CloseWindow
CloseWindow(0)
End
EndSelect
ForEver
;-└──Loop──┘
EndIf
Code: Select all
Structure GadgetsSizesList
id.i
x.i
y.i
w.i
h.i
flag.i
EndStructure
Structure WH
w.i
h.i
w2.i
h2.i
EndStructure
Global NewList GadgetsSizesList.GadgetsSizesList()
Global GUI.WH
Procedure GetNewXYWH(ID)
Protected x, y, w, h, *GadgetSize.GadgetsSizesList
*GadgetSize = GetGadgetData(ID)
With *GadgetSize
If \flag = 0 ; по умолчанию, всё остаётся на месте
ProcedureReturn
EndIf
If \flag & 1 ; изменяется размер и отступы пропорционально новым размерам окна
x = \x * GUI\w2 / GUI\w
y = \y * GUI\h2 / GUI\h
w = \w * GUI\w2 / GUI\w
h = \h * GUI\h2 / GUI\h
Else
x = \x
y = \y
w = \w
h = \h
EndIf
If \flag & 2 ; левый отступ не изменяется
x = #PB_Ignore
EndIf
If \flag & 4 ; правый отступ не изменяется
tmp = GUI\w - \x - \w
If \flag & 2 ; левый отступ не изменяется
; x = #PB_Ignore
w = GUI\w2 - \x - tmp
Else
x = GUI\w2 - w - tmp
EndIf
EndIf
; If \flag & 16
; EndIf
If \flag & 32 ; верхний отступ не изменяется
y = #PB_Ignore
EndIf
If \flag & 64 ; нижний отступ не изменяется
tmp = GUI\h - \y - \h
If \flag & 32 ; верхний отступ не изменяется
; y = #PB_Ignore
h = GUI\h2 - \y - tmp
Else
y = GUI\h2 - h - tmp
EndIf
EndIf
If \flag & 256 ; ширина не изменяется
w = #PB_Ignore
EndIf
If \flag & 512 ; высота не изменяется
h = #PB_Ignore
EndIf
If \flag & 8 ; не перемещается относительно горизонтального центра
x = (\x + \w / 2) - w / 2
EndIf
If \flag & 128 ; не перемещается относительно вертикального центра
y = (\y + \h / 2) - h / 2
EndIf
EndWith
ResizeGadget(ID, x, y, w, h)
EndProcedure
Procedure SizeWindowHandler()
With GUI
\w2 = WindowWidth(0)
\h2 = WindowHeight(0)
EndWith
GetNewXYWH(1)
GetNewXYWH(2)
EndProcedure
Procedure AddGadgetSize(ID, flag)
Protected *item
*item = AddElement(GadgetsSizesList())
If *item
With GadgetsSizesList()
\id = ID
\x = GadgetX(ID)
\y = GadgetY(ID)
\w = GadgetWidth(ID)
\h = GadgetHeight(ID)
\flag = flag
EndWith
SetGadgetData(ID, *item)
EndIf
EndProcedure
; Объединённые стили
; SIZE 768 (256+512) размер не изменяется
; MENUBAR 544 (512+32) элементы остаются в верхней части окна и без изменения высоты
; STATEBAR 576 (512+64) элементы остаются в нижней части окна и без изменения высоты
; ALL 802 (2+32+256+512) элемент не изменяется и не перемещается
; BORDERS 102 (2+4+32+64) размеры изменяются на величину изменения окна.
;-┌──GUI──┐
If OpenWindow(0, 0, 0, 720, 400, "Example...", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_SizeGadget)
With GUI
\w = 720
\h = 400
EndWith
ButtonGadget(1, 10, 10, 100, 30, "Button")
AddGadgetSize(1, 1)
; EditorGadget(2, 10, 70, 700, 320)
; AddGadgetSize(2, 32 + 64 + 2 + 4)
EditorGadget(2, 160, 100, 400, 200)
AddGadgetSize(2, 1 + 8 + 128)
BindEvent(#PB_Event_SizeWindow, @SizeWindowHandler())
;-┌──Loop──┐
Repeat
Select WaitWindowEvent()
Case #PB_Event_Gadget
Select EventGadget()
Case 1
Debug 1
EndSelect
Case #PB_Event_CloseWindow
CloseWindow(0)
End
EndSelect
ForEver
;-└──Loop──┘
EndIf