PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Все о ResizeGadget


Все о ResizeGadget

Сообщений 1 страница 26 из 26

1

Часто у меня возникают вопросы по изменению размеров гаджетов в тех или иных ситуациях. Следующий пример я нашел в код архиве и в нем при растяжении или уменьшении окна меняются размеры кнопки. Я так понял тут какой - то особый код с использованием Callback, что намного сложней. Может быть можно как нибудь по другому данную задачу решить?

Код:
Procedure WinCallback(Win,Msg,wParam,lParam) 
  Select Msg 
    Case #WM_SIZE 
      ResizeGadget(1,5,5,WindowWidth(0)-10,WindowHeight(0)-10) 
  EndSelect 
  ProcedureReturn #PB_ProcessPureBasicEvents 
EndProcedure 

OpenWindow(0,0,0,200,30,"Test",#PB_Window_ScreenCentered|#PB_Window_SystemMenu|#PB_Window_SizeGadget) 
  
  ButtonGadget(1,5,5,190,20,"Button") 
  
SetWindowCallback(@WinCallback()) 

Repeat 
Until WaitWindowEvent() = #PB_Event_CloseWindow

0

2

daiomik написал(а):

Может быть можно как нибудь по другому данную задачу решить?

Можно в стандартном обработчике событий отслеживать событие #PB_Event_SizeWindow

Код:
OpenWindow(0,0,0,200,30,"Test",#PB_Window_ScreenCentered|#PB_Window_SystemMenu|#PB_Window_SizeGadget) 
SmartWindowRefresh(0, 1) ; Это для уменьшения мерцаний окна, при изменении его размеров.
ButtonGadget(1,5,5,190,20,"Button") 

Repeat 
  Event=WaitWindowEvent()
  
  If Event=#PB_Event_SizeWindow
    ResizeGadget(1,5,5,WindowWidth(0)-10,WindowHeight(0)-10) 
  EndIf
  
Until Event=#PB_Event_CloseWindow

0

3

Последний вариант мне больше понравился. Но я вот не пойму, зачем необходимо вычитать 10  здесь WindowWidth(0)-10 и здесьWindowHeight(0)-10, если можно просто использовать #PB_Ignore

0

4

daiomik написал(а):

зачем необходимо вычитать 10  здесь WindowWidth(0)-10 и здесьWindowHeight(0)-10

Чтобы кнопка не выходила за пределы окна.

В качестве второго и третьего аргумента, действительно можно использовать #PB_Ignore

0

5

Здравствуйте. Не нашел куда можно написать, но проблема похожа с этим случаем, поэтому пишу здесь и прошу помощи.
Есть небольшое приложение с множеством элементов необходимо динамически изменять их размеры при изменении размера окна.
Столкнулся со следующими проблемами:
Мерцание при изменении размеров.
При открытии окна без изменения размера текст не прорисовывается на ImageGadget.
При развертывании окна текст виден кусками.
При обновлении шрифта текста более одного раза текст выглядит кабы жирным.
Как правильно реализовать изменение размеров? Код привожу ниже.

Код:
#Fon=$C8C8C8  ;RGB(200, 200, 200)
#Blac=$000000 ;RGB(0, 0, 0)
#Blu=$FF0000  ;RGB(0, 0, 255)
;#Purp=$FFFF00 ;RGB(0, 255, 255)
;#Yel=$00FFFF  ;RGB(255, 255, 0)

#WinID=0
#Width=450
#Height=420
#WinStyle = #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget |#PB_Window_ScreenCentered|#PB_Window_SystemMenu|#PB_Window_SizeGadget
#WinColor=#Fon



;- Нумерованые константы
;{
Enumeration
#G_1=1 : #G_2 : #G_3 : #G_4
#G_5 : #G_6 : #G_7
#G_8 : #G_9 : #G_10
#G_11 : #G_12 : #G_13 : #G_14
EndEnumeration
;}



#X=0 : #Y=1
Global Dim Poi.u(#G_14,1)
;{ координаты элементов
Poi(#G_1,#X)=5   : Poi(#G_1,#Y)=5
Poi(#G_2,#X)=105 : Poi(#G_2,#Y)=5
Poi(#G_3,#X)=205  : Poi(#G_3,#Y)=5
Poi(#G_4,#X)=305   : Poi(#G_4,#Y)=5
Poi(#G_5,#X)=5  : Poi(#G_5,#Y)=105
Poi(#G_6,#X)=105  : Poi(#G_6,#Y)=105
Poi(#G_7,#X)=205  : Poi(#G_7,#Y)=105
Poi(#G_8,#X)=5 : Poi(#G_8,#Y)=205
Poi(#G_9,#X)=105 : Poi(#G_9,#Y)=205
Poi(#G_10,#X)=205  : Poi(#G_10,#Y)=205
Poi(#G_11,#X)=5 : Poi(#G_11,#Y)=305
Poi(#G_12,#X)=105 : Poi(#G_12,#Y)=305
Poi(#G_13,#X)=205 : Poi(#G_13,#Y)=305
Poi(#G_14,#X)=305 : Poi(#G_14,#Y)=305

;}



Procedure RoundedBox(X, Y, W, H, R,FrT,FrC,FiC)
   Box(X,Y,W,H,#Fon)              ;Цвет фона Windows при выводе изображения
   ;Box(0, 0, 200,150,$B5D4E6)
   x1=X+R
   x2=X+W-R
   y1=Y+R
   y2=Y+H-R
   
   
   Circle(x1,y1, R,FrC)
   Circle(x1,y1, R-FrT,FiC)
   Circle(x2,y1,R,FrC)
   Circle(x2-1,y1,R-FrT,FiC)
   Circle(x1,y2-1,R,FrC)
   Circle(x1,y2-1,R-FrT,FiC)
   Circle(x2,y2-1,R,FrC)
   Circle(x2-1,y2-1,R-FrT,FiC)
   Box(x1,Y,W-2*R,H,FrC)
   Box(x1,Y+FrT,W-2*R,H-2*FrT,FiC)
   Box(X,y1,W+1,H-2*R,FrC)
   Box(X+FrT,y1,W-2*FrT,H-2*R,FiC)

EndProcedure




Procedure Set_Image1 (w.i=100, h.i=100)
  k=0
  If IsImage(1)=0
    CreateImage(1, w, h*0.925)
    k=1
  EndIf
  
  If  ImageWidth(1)<>w Or ImageHeight(1)<>h*0.925
    ResizeImage(1,w,h*0.925)
    k=1
  EndIf
  
  If StartDrawing(ImageOutput(1)) And k
  ;Поскольку новое изображение имеет черный фон, заполняем его другим цветом:
    Box(0, 0, w, h*0.925, #Fon)   
  ;Рисует прямоугольник с закругленными углами
    ww=w*0.9 : hh=h*0.925-h/5-1
    RoundedBox((w-ww)/2, h/5, ww, hh, w/14,1,#Blac,#Blu)
  EndIf
  StopDrawing()
    
EndProcedure 



Procedure M_Gadget (id.i, x.i, y.i, w.i, h.i, Title.s)
  
  s1.f=w/100
  s2.f=h/100
  s.f=1
  If s1<=s2 : s=s1 : ElseIf s2<s1 : s=s2 : EndIf
  
  Set_Image1 (w,h)
  CopyImage(1, id+10)
  ImageGadget(id, x, y, w, h, ImageID(id+10))
  
    
  TextGadget(1001+id*10, x+20*s1, y+25*s2, 70*s1, 17*s2, Title, #PB_Text_Center)
  TextGadget(1002+id*10, x+20*s1, y+55*s2, 70*s1, 17*s2, Title, #PB_Text_Center)
  
  SetGadgetColor(1001+id*10, #PB_Gadget_BackColor, #Blu)
  SetGadgetColor(1002+id*10, #PB_Gadget_BackColor, #Blu)
  
  LoadFont(0, "Arial", 11*s)
  SetGadgetFont(1001+id*10, FontID(0))
  SetGadgetFont(1002+id*10, FontID(0))

EndProcedure



Procedure Resize_M_Gadget(id.i, x.i, y.i, w.i, h.i, k=0)

  s1.f=w/100
  s2.f=h/100
  s.f=1
  If s1<=s2 : s=s1 : ElseIf s2<s1 : s=s2 : EndIf
  
  Set_Image1 (w,h)  
  CopyImage(1, id+10)
  ResizeGadget(id, x, y, #PB_Ignore, #PB_Ignore)
  SetGadgetState(id,ImageID(id+10))

  
  ResizeGadget(1001+id*10, GadgetX(id)+20*s1, GadgetY(id)+25*s2, 70*s1, 17*s2)
  ResizeGadget(1002+id*10, GadgetX(id)+30*s1, GadgetY(id)+44*s2, 50*s1, 17*s2)
 
  LoadFont(0, "Arial", 11*s)
  SetGadgetFont(1001+id*10, FontID(0))
  SetGadgetFont(1002+id*10, FontID(0))
   
EndProcedure



Procedure Resize(s.f)
  
 
   
   Resize_M_Gadget(#G_1, Poi(#G_1,#X)*s, Poi(#G_1,#Y)*s, 100*s, 100*s)
   Resize_M_Gadget(#G_2, Poi(#G_2,#X)*s, Poi(#G_2,#Y)*s, 100*s, 100*s)
   Resize_M_Gadget(#G_3, Poi(#G_3,#X)*s, Poi(#G_3,#Y)*s, 100*s, 100*s)
   Resize_M_Gadget(#G_4, Poi(#G_4,#X)*s, Poi(#G_4,#Y)*s, 100*s, 100*s)
   Resize_M_Gadget(#G_5, Poi(#G_5,#X)*s, Poi(#G_5,#Y)*s, 100*s, 100*s)
   Resize_M_Gadget(#G_6, Poi(#G_6,#X)*s, Poi(#G_6,#Y)*s, 100*s, 100*s)
   Resize_M_Gadget(#G_7, Poi(#G_7,#X)*s, Poi(#G_7,#Y)*s, 100*s, 100*s)
   Resize_M_Gadget(#G_8, Poi(#G_8,#X)*s, Poi(#G_8,#Y)*s, 100*s, 100*s)
   Resize_M_Gadget(#G_9, Poi(#G_9,#X)*s, Poi(#G_9,#Y)*s, 100*s, 100*s)
   Resize_M_Gadget(#G_10, Poi(#G_10,#X)*s, Poi(#G_10,#Y)*s, 100*s, 100*s)
   Resize_M_Gadget(#G_11, Poi(#G_11,#X)*s, Poi(#G_11,#Y)*s, 100*s, 100*s)
   Resize_M_Gadget(#G_12, Poi(#G_12,#X)*s, Poi(#G_12,#Y)*s, 100*s, 100*s)
   Resize_M_Gadget(#G_13, Poi(#G_13,#X)*s, Poi(#G_13,#Y)*s, 100*s, 100*s)
   Resize_M_Gadget(#G_14, Poi(#G_14,#X)*s, Poi(#G_14,#Y)*s, 100*s, 100*s)
   

  ProcedureReturn
EndProcedure



OpenWindow(#WinID,0,0,#Width,#Height,"Test",#WinStyle) 
SmartWindowRefresh(#WinID, 1) ; Это для уменьшения мерцаний окна, при изменении его размеров.
SetWindowColor(#WinID,  #WinColor) ; устанавливаем цвет окна
;ButtonGadget(1,5,5,190,20,"Button") 
M_Gadget (#G_1, Poi(#G_1,#X), Poi(#G_1,#Y), 100, 100, "N_1")
M_Gadget (#G_2, Poi(#G_2,#X), Poi(#G_2,#Y), 100, 100, "N_2")
M_Gadget (#G_3, Poi(#G_3,#X), Poi(#G_3,#Y), 100, 100, "N_3")
M_Gadget (#G_4, Poi(#G_4,#X), Poi(#G_4,#Y), 100, 100, "N_4")
M_Gadget (#G_5, Poi(#G_5,#X), Poi(#G_5,#Y), 100, 100, "N_5")
M_Gadget (#G_6, Poi(#G_6,#X), Poi(#G_6,#Y), 100, 100, "N_6")
M_Gadget (#G_7, Poi(#G_7,#X), Poi(#G_7,#Y), 100, 100, "N_7")
M_Gadget (#G_8, Poi(#G_8,#X), Poi(#G_8,#Y), 100, 100, "N_8")
M_Gadget (#G_9, Poi(#G_9,#X), Poi(#G_9,#Y), 100, 100, "N_9")
M_Gadget (#G_10, Poi(#G_10,#X), Poi(#G_10,#Y), 100, 100, "N_10")
M_Gadget (#G_11, Poi(#G_11,#X), Poi(#G_11,#Y), 100, 100, "N_11")
M_Gadget (#G_12, Poi(#G_12,#X), Poi(#G_12,#Y), 100, 100, "N_12")
M_Gadget (#G_13, Poi(#G_13,#X), Poi(#G_13,#Y), 100, 100, "N_13")
M_Gadget (#G_14, Poi(#G_14,#X), Poi(#G_14,#Y), 100, 100, "N_14")


Repeat 
  Event=WaitWindowEvent()
  
  If Event=#PB_Event_SizeWindow
    ;ResizeGadget(1,5,5,WindowWidth(0)-10,WindowHeight(0)-10) 
    
        xx.f= WindowWidth(#WinID) / #Width
        yy.f= WindowHeight(#WinID) / #Height
        ff.f=0
        If xx<=yy : ff= xx : Else : ff=yy : EndIf
        If ff<0.6 : ff=0.6 : EndIf
        Resize(ff)
    
  EndIf
  
Until Event=#PB_Event_CloseWindow

0

6

Лучше использовать

Код:
BindEvent(#PB_Event_SizeWindow, @Resize())

0

7

AZJIO написал(а):

Лучше использовать

Спасибо но у меня старая версия PureBasic 4.51

0

8

alexvolk
а в чём причина на старье сидеть?

0

9

AZJIO написал(а):

alexvolk
а в чём причина на старье сидеть?

Редко пользуюсь. Переустанавливать не хочется, есть опасения что старые проекты не будут запускаться.

0

10

alexvolk
а если установить сразу 10 версий? Там же всё просто, какую запустил, той и пользуешься.
Скачай архив отсюда и засунь туда то что установилось.
Оно же ещё тут

Хотя бы 3 версии: 5.73 (до 6 там другой движок 3D), 6.04 (последняя компактная и поддержка WinXP) и любую последнюю версию на текущий момент.

C-Backend с оптимизацией создаёт более быстрый код.

Отредактировано AZJIO (27.02.2025 20:57:09)

0

11

Хорошо все это я попробую если найду дистрибутивы. Но касаемо моего кода что мне поможет?

0

12

Может где то еще можно задать вопросы и получить помощь?
Направьте в нужную сторону.

0

13

alexvolk написал(а):

Мерцание при изменении размеров.

Потому что гаджеты друг на друге.
Код конечно лучше так не писать.

Код:
#Fon=$C8C8C8  ;RGB(200, 200, 200)
#Blac=$000000 ;RGB(0, 0, 0)
#Blu=$FF0000  ;RGB(0, 0, 255)
;#Purp=$FFFF00 ;RGB(0, 255, 255)
;#Yel=$00FFFF  ;RGB(255, 255, 0)

#WinID=0
#Width=450
#Height=420
#WinStyle = #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget |#PB_Window_ScreenCentered|#PB_Window_SystemMenu|#PB_Window_SizeGadget
#WinColor=#Fon



;- Нумерованые константы
;{
Enumeration
#G_1=1 : #G_2 : #G_3 : #G_4
#G_5 : #G_6 : #G_7
#G_8 : #G_9 : #G_10
#G_11 : #G_12 : #G_13 : #G_14
EndEnumeration
;}



#X=0 : #Y=1
Global Dim Poi.u(#G_14,1)
;{ координаты элементов
Poi(#G_1,#X)=5   : Poi(#G_1,#Y)=5
Poi(#G_2,#X)=105 : Poi(#G_2,#Y)=5
Poi(#G_3,#X)=205  : Poi(#G_3,#Y)=5
Poi(#G_4,#X)=305   : Poi(#G_4,#Y)=5
Poi(#G_5,#X)=5  : Poi(#G_5,#Y)=105
Poi(#G_6,#X)=105  : Poi(#G_6,#Y)=105
Poi(#G_7,#X)=205  : Poi(#G_7,#Y)=105
Poi(#G_8,#X)=5 : Poi(#G_8,#Y)=205
Poi(#G_9,#X)=105 : Poi(#G_9,#Y)=205
Poi(#G_10,#X)=205  : Poi(#G_10,#Y)=205
Poi(#G_11,#X)=5 : Poi(#G_11,#Y)=305
Poi(#G_12,#X)=105 : Poi(#G_12,#Y)=305
Poi(#G_13,#X)=205 : Poi(#G_13,#Y)=305
Poi(#G_14,#X)=305 : Poi(#G_14,#Y)=305

;}



Procedure RoundedBox(X, Y, W, H, R,FrT,FrC,FiC)
   Box(X,Y,W,H,#Fon)              ;Цвет фона Windows при выводе изображения
   ;Box(0, 0, 200,150,$B5D4E6)
   x1=X+R
   x2=X+W-R
   y1=Y+R
   y2=Y+H-R
   
   
   Circle(x1,y1, R,FrC)
   Circle(x1,y1, R-FrT,FiC)
   Circle(x2,y1,R,FrC)
   Circle(x2-1,y1,R-FrT,FiC)
   Circle(x1,y2-1,R,FrC)
   Circle(x1,y2-1,R-FrT,FiC)
   Circle(x2,y2-1,R,FrC)
   Circle(x2-1,y2-1,R-FrT,FiC)
   Box(x1,Y,W-2*R,H,FrC)
   Box(x1,Y+FrT,W-2*R,H-2*FrT,FiC)
   Box(X,y1,W+1,H-2*R,FrC)
   Box(X+FrT,y1,W-2*FrT,H-2*R,FiC)

EndProcedure




Procedure Set_Image1 (w.i=100, h.i=100)
  k=0
  If IsImage(1)=0
    CreateImage(1, w, h*0.925)
    k=1
  EndIf
  
  If  ImageWidth(1)<>w Or ImageHeight(1)<>h*0.925
    ResizeImage(1,w,h*0.925)
    k=1
  EndIf
  
  If StartDrawing(ImageOutput(1)) And k
  ;Поскольку новое изображение имеет черный фон, заполняем его другим цветом:
    Box(0, 0, w, h*0.925, #Fon)   
  ;Рисует прямоугольник с закругленными углами
    ww=w*0.9 : hh=h*0.925-h/5-1
    RoundedBox((w-ww)/2, h/5, ww, hh, w/14,1,#Blac,#Blu)
  EndIf
  StopDrawing()
    
EndProcedure 



Procedure M_Gadget (id.i, x.i, y.i, w.i, h.i, Title.s)
  
  s1.f=w/100
  s2.f=h/100
  s.f=1
  If s1<=s2 : s=s1 : ElseIf s2<s1 : s=s2 : EndIf
  
  Set_Image1 (w,h)
  CopyImage(1, id+10)
  ImageGadget(id, x, y, w, h, ImageID(id+10))
  
  SetWindowLongPtr_(GadgetID(id), #GWL_STYLE, GetWindowLongPtr_(GadgetID(id), #GWL_STYLE) | #WS_CLIPCHILDREN | #WS_CLIPSIBLINGS)
  
  hWnd = UseGadgetList(GadgetID(id))
  TextGadget(1001+id*10, 20, 25, 70, 17, Title, #PB_Text_Center)
  TextGadget(1002+id*10, 20, 55, 70, 17, Title, #PB_Text_Center)
  
  SetWindowLongPtr_(GadgetID(1001+id*10), #GWL_STYLE, GetWindowLongPtr_(GadgetID(1001+id*10), #GWL_STYLE) | #WS_CLIPCHILDREN | #WS_CLIPSIBLINGS)
  SetWindowLongPtr_(GadgetID(1002+id*10), #GWL_STYLE, GetWindowLongPtr_(GadgetID(1002+id*10), #GWL_STYLE) | #WS_CLIPCHILDREN | #WS_CLIPSIBLINGS)
  
  SetGadgetColor(1001+id*10, #PB_Gadget_BackColor, #Blu)
  SetGadgetColor(1002+id*10, #PB_Gadget_BackColor, #Blu)
  
  LoadFont(0, "Arial", 11*s)
  SetGadgetFont(1001+id*10, FontID(0))
  SetGadgetFont(1002+id*10, FontID(0))
  
  UseGadgetList(hWnd)
EndProcedure



Procedure Resize_M_Gadget(id.i, x.i, y.i, w.i, h.i, k=0)

  s1.f=w/100
  s2.f=h/100
  s.f=1
  If s1<=s2 : s=s1 : ElseIf s2<s1 : s=s2 : EndIf
  
  Set_Image1 (w,h)  
  CopyImage(1, id+10)
  ResizeGadget(id, x, y, #PB_Ignore, #PB_Ignore)
  SetGadgetState(id,ImageID(id+10))

  
  ResizeGadget(1001+id*10, 20*s1, 25*s2, 70*s1, 17*s2)
  ResizeGadget(1002+id*10, 30*s1, 44*s2, 50*s1, 17*s2)
 
  LoadFont(0, "Arial", 11*s)
  SetGadgetFont(1001+id*10, FontID(0))
  SetGadgetFont(1002+id*10, FontID(0))
   
EndProcedure



Procedure Resize(s.f)
  
 
   
   Resize_M_Gadget(#G_1, Poi(#G_1,#X)*s, Poi(#G_1,#Y)*s, 100*s, 100*s)
   Resize_M_Gadget(#G_2, Poi(#G_2,#X)*s, Poi(#G_2,#Y)*s, 100*s, 100*s)
   Resize_M_Gadget(#G_3, Poi(#G_3,#X)*s, Poi(#G_3,#Y)*s, 100*s, 100*s)
   Resize_M_Gadget(#G_4, Poi(#G_4,#X)*s, Poi(#G_4,#Y)*s, 100*s, 100*s)
   Resize_M_Gadget(#G_5, Poi(#G_5,#X)*s, Poi(#G_5,#Y)*s, 100*s, 100*s)
   Resize_M_Gadget(#G_6, Poi(#G_6,#X)*s, Poi(#G_6,#Y)*s, 100*s, 100*s)
   Resize_M_Gadget(#G_7, Poi(#G_7,#X)*s, Poi(#G_7,#Y)*s, 100*s, 100*s)
   Resize_M_Gadget(#G_8, Poi(#G_8,#X)*s, Poi(#G_8,#Y)*s, 100*s, 100*s)
   Resize_M_Gadget(#G_9, Poi(#G_9,#X)*s, Poi(#G_9,#Y)*s, 100*s, 100*s)
   Resize_M_Gadget(#G_10, Poi(#G_10,#X)*s, Poi(#G_10,#Y)*s, 100*s, 100*s)
   Resize_M_Gadget(#G_11, Poi(#G_11,#X)*s, Poi(#G_11,#Y)*s, 100*s, 100*s)
   Resize_M_Gadget(#G_12, Poi(#G_12,#X)*s, Poi(#G_12,#Y)*s, 100*s, 100*s)
   Resize_M_Gadget(#G_13, Poi(#G_13,#X)*s, Poi(#G_13,#Y)*s, 100*s, 100*s)
   Resize_M_Gadget(#G_14, Poi(#G_14,#X)*s, Poi(#G_14,#Y)*s, 100*s, 100*s)
   

  ProcedureReturn
EndProcedure



OpenWindow(#WinID,0,0,#Width,#Height,"Test",#WinStyle)
;SetWindowLongPtr_(WindowID(#WinID), #GWL_EXSTYLE, GetWindowLongPtr_(WindowID(#WinID), #GWL_EXSTYLE) | #WS_EX_COMPOSITED)
SmartWindowRefresh(#WinID, 1) ; Это для уменьшения мерцаний окна, при изменении его размеров.
SetWindowColor(#WinID,  #WinColor) ; устанавливаем цвет окна
;ButtonGadget(1,5,5,190,20,"Button") 
M_Gadget (#G_1, Poi(#G_1,#X), Poi(#G_1,#Y), 100, 100, "N_1")
M_Gadget (#G_2, Poi(#G_2,#X), Poi(#G_2,#Y), 100, 100, "N_2")
M_Gadget (#G_3, Poi(#G_3,#X), Poi(#G_3,#Y), 100, 100, "N_3")
M_Gadget (#G_4, Poi(#G_4,#X), Poi(#G_4,#Y), 100, 100, "N_4")
M_Gadget (#G_5, Poi(#G_5,#X), Poi(#G_5,#Y), 100, 100, "N_5")
M_Gadget (#G_6, Poi(#G_6,#X), Poi(#G_6,#Y), 100, 100, "N_6")
M_Gadget (#G_7, Poi(#G_7,#X), Poi(#G_7,#Y), 100, 100, "N_7")
M_Gadget (#G_8, Poi(#G_8,#X), Poi(#G_8,#Y), 100, 100, "N_8")
M_Gadget (#G_9, Poi(#G_9,#X), Poi(#G_9,#Y), 100, 100, "N_9")
M_Gadget (#G_10, Poi(#G_10,#X), Poi(#G_10,#Y), 100, 100, "N_10")
M_Gadget (#G_11, Poi(#G_11,#X), Poi(#G_11,#Y), 100, 100, "N_11")
M_Gadget (#G_12, Poi(#G_12,#X), Poi(#G_12,#Y), 100, 100, "N_12")
M_Gadget (#G_13, Poi(#G_13,#X), Poi(#G_13,#Y), 100, 100, "N_13")
M_Gadget (#G_14, Poi(#G_14,#X), Poi(#G_14,#Y), 100, 100, "N_14")


Repeat 
  Event=WaitWindowEvent()
  
  If Event=#PB_Event_SizeWindow
    ;ResizeGadget(1,5,5,WindowWidth(0)-10,WindowHeight(0)-10) 
    
        xx.f= WindowWidth(#WinID) / #Width
        yy.f= WindowHeight(#WinID) / #Height
        ff.f=0
        If xx<=yy : ff= xx : Else : ff=yy : EndIf
        If ff<0.6 : ff=0.6 : EndIf
        Resize(ff)
    
  EndIf
  
Until Event=#PB_Event_CloseWindow

0

14

Пётр написал(а):

Потому что гаджеты друг на друге.
Код конечно лучше так не писать.

Я так понимаю сейчас ImageGadget выступает в качестве GadgetList?
Сейчас фон текста не устанавливается, как это можно поправить?
А еще можно ли обойтись без API функций?

0

15

alexvolk написал(а):

Я так понимаю сейчас ImageGadget выступает в качестве GadgetList?

Да, но лучше обновить PB как минимум до версии 5.60 и использовать CanvasGadget с флагом #PB_Canvas_Container.

alexvolk написал(а):

Сейчас фон текста не устанавливается, как это можно поправить?

Выше написал как.
Винда устроена так что очень многое работает на событиях отправляемых в callback функцию окна (гаджеты это дочерние окна по отношению в основному окну). И при изменении GadgetList для TextGadget родительским окном стал ImageGadget, а в нем не предусмотрена обработка многих событий в том числе перекраска дочерних окон, т. к. по умолчанию он это не поддерживает.
Если оставить как есть, потребуется перехватить callback функцию ImageGadget и обрабатывать событие #WM_CTLCOLORSTATIC.

Код:
#Text_Background_Green = $00FF00  ; Gruener Hintergrund 
#Text_Background_Red   = $0000FF  ; Roter Hintergrund 
#Text_Foreground       = $000000  ; Schrift-Farbe 

#MaxTextGadgets        = 20       ; Max. Anzahl TextGadgets 

Global Dim TextGadgetColors.l(#MaxTextGadgets) 

Text_Background_Green = CreateSolidBrush_(#Text_Background_Green)
Text_Background_Red   = CreateSolidBrush_(#Text_Background_Red)

Procedure TextGadget_Red(GadgetNr) 
   TextGadgetColors(GadgetNr) = 1 
   InvalidateRect_(GadgetID(GadgetNr),0,1) 
EndProcedure 

Procedure TextGadget_Green(GadgetNr) 
   TextGadgetColors(GadgetNr) = 0 
   InvalidateRect_(GadgetID(GadgetNr),0,1) 
EndProcedure 

Procedure WindowCallback(Window,Message,wParam,lParam) 
  Shared Text_Background_Green, Text_Background_Red 
  
  Select Message 
    Case #WM_CTLCOLORSTATIC 
      For a = 1 To #MaxTextGadgets 
        If IsGadget(a)                      ; +++ need for PB3.93+ with debugger on
          If lParam = GadgetID(a) 
            SetBkMode_(wParam,#TRANSPARENT) 
            SetTextColor_(wParam, #Text_Foreground) 
            If TextGadgetColors(a) = 0 
              ProcedureReturn Text_Background_Green 
            Else 
              ProcedureReturn Text_Background_Red 
            EndIf 
          EndIf 
        EndIf 
      Next a 
  EndSelect 
  
  ProcedureReturn DefWindowProc_(Window,Message,wParam,lParam)
EndProcedure 

 
OpenWindow(0,200,200,150,310,"TEST",#PB_Window_SystemMenu)
hWnd = ImageGadget(0, 0, 0, 150,310,0)
SetWindowLongPtr_(hWnd, #GWL_WNDPROC, @WindowCallback())
hWnd = UseGadgetList(hWnd)

For a = 1 To #MaxTextGadgets 
    TextGadget(a,10,a*14,130,14,"Text-Gadget "+Str(a),#PB_Text_Center) 
Next a 

UseGadgetList(hWnd)

TextGadget_Red(2) 
TextGadget_Red(7) 
TextGadget_Red(15) 

Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow 

DeleteObject_(Text_Background_Green) 
DeleteObject_(Text_Background_Red) 
alexvolk написал(а):

А еще можно ли обойтись без API функций?

Обновляйте PB. Или используйте WinAPI, в которых нет ничего плохого.

0

16

Пётр подскажите если я рисую текст на изображении почему он отображается только в одном ImageGadget?

Код:
#Fon=$C8C8C8  ;RGB(200, 200, 200)
#Blac=$000000 ;RGB(0, 0, 0)
#Blu=$FF0000  ;RGB(0, 0, 255)
;#Purp=$FFFF00 ;RGB(0, 255, 255)
;#Yel=$00FFFF  ;RGB(255, 255, 0)

#WinID=0
#Width=450
#Height=420
#WinStyle = #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget |#PB_Window_ScreenCentered|#PB_Window_SystemMenu|#PB_Window_SizeGadget
#WinColor=#Fon



;- Нумерованые константы
;{
Enumeration
#G_1=1 : #G_2 : #G_3 : #G_4
#G_5 : #G_6 : #G_7
#G_8 : #G_9 : #G_10
#G_11 : #G_12 : #G_13 : #G_14
EndEnumeration
;}



#X=0 : #Y=1
Global Dim Poi.u(#G_14,1)
;{ координаты элементов
Poi(#G_1,#X)=5   : Poi(#G_1,#Y)=5
Poi(#G_2,#X)=105 : Poi(#G_2,#Y)=5
Poi(#G_3,#X)=205  : Poi(#G_3,#Y)=5
Poi(#G_4,#X)=305   : Poi(#G_4,#Y)=5
Poi(#G_5,#X)=5  : Poi(#G_5,#Y)=105
Poi(#G_6,#X)=105  : Poi(#G_6,#Y)=105
Poi(#G_7,#X)=205  : Poi(#G_7,#Y)=105
Poi(#G_8,#X)=5 : Poi(#G_8,#Y)=205
Poi(#G_9,#X)=105 : Poi(#G_9,#Y)=205
Poi(#G_10,#X)=205  : Poi(#G_10,#Y)=205
Poi(#G_11,#X)=5 : Poi(#G_11,#Y)=305
Poi(#G_12,#X)=105 : Poi(#G_12,#Y)=305
Poi(#G_13,#X)=205 : Poi(#G_13,#Y)=305
Poi(#G_14,#X)=305 : Poi(#G_14,#Y)=305

;}



Procedure RoundedBox(X, Y, W, H, R,FrT,FrC,FiC)
   Box(X,Y,W,H,#Fon)              ;Цвет фона Windows при выводе изображения
   ;Box(0, 0, 200,150,$B5D4E6)
   x1=X+R
   x2=X+W-R
   y1=Y+R
   y2=Y+H-R
   
   
   Circle(x1,y1, R,FrC)
   Circle(x1,y1, R-FrT,FiC)
   Circle(x2,y1,R,FrC)
   Circle(x2-1,y1,R-FrT,FiC)
   Circle(x1,y2-1,R,FrC)
   Circle(x1,y2-1,R-FrT,FiC)
   Circle(x2,y2-1,R,FrC)
   Circle(x2-1,y2-1,R-FrT,FiC)
   Box(x1,Y,W-2*R,H,FrC)
   Box(x1,Y+FrT,W-2*R,H-2*FrT,FiC)
   Box(X,y1,W+1,H-2*R,FrC)
   Box(X+FrT,y1,W-2*FrT,H-2*R,FiC)

EndProcedure




Procedure Set_Image1 (w.i=100, h.i=100)
  k=0
  If IsImage(1)=0
    CreateImage(1, w, h*0.925)
    k=1
  EndIf
  
  If  ImageWidth(1)<>w Or ImageHeight(1)<>h*0.925
    ResizeImage(1,w,h*0.925)
    k=1
  EndIf
  
  If StartDrawing(ImageOutput(1)) And k
  ;Поскольку новое изображение имеет черный фон, заполняем его другим цветом:
    Box(0, 0, w, h*0.925, #Fon)   
  ;Рисует прямоугольник с закругленными углами
    ww=w*0.9 : hh=h*0.925-h/5-1
    RoundedBox((w-ww)/2, h/5, ww, hh, w/14,1,#Blac,#Blu)
  EndIf
  StopDrawing()
    
EndProcedure 



Procedure M_Gadget (id.i, x.i, y.i, w.i, h.i, Title.s)
  
  s1.f=w/100
  s2.f=h/100
  s.f=1
  If s1<=s2 : s=s1 : ElseIf s2<s1 : s=s2 : EndIf
  
  Set_Image1 (w,h)
  
     
  CopyImage(1, id+10)
  
  LoadFont(0, "Arial", 10*s)
  StartDrawing(ImageOutput(id+10))
  DrawingFont(FontID(0))
    DrawText( x+30*s1, y+30*s2, Title , #Blac , #Blu )
    DrawText( x+30*s1, y+50*s2, Str(id) , #Blac , #Blu )
  StopDrawing()
  
  ImageGadget(id, x, y, w, h, ImageID(id+10))
  
    
  ;TextGadget(1001+id*10, x+20*s1, y+25*s2, 70*s1, 17*s2, Title, #PB_Text_Center)
  ;TextGadget(1002+id*10, x+20*s1, y+55*s2, 70*s1, 17*s2, Title, #PB_Text_Center)
  
  ;SetGadgetColor(1001+id*10, #PB_Gadget_BackColor, #Blu)
  ;SetGadgetColor(1002+id*10, #PB_Gadget_BackColor, #Blu)
  
  ;LoadFont(0, "Arial", 11*s)
  ;SetGadgetFont(1001+id*10, FontID(0))
  ;SetGadgetFont(1002+id*10, FontID(0))

EndProcedure



Procedure Resize_M_Gadget(id.i, x.i, y.i, w.i, h.i, k=0)

  s1.f=w/100
  s2.f=h/100
  s.f=1
  If s1<=s2 : s=s1 : ElseIf s2<s1 : s=s2 : EndIf
  
  Set_Image1 (w,h)  
  CopyImage(1, id+10)
  ResizeGadget(id, x, y, #PB_Ignore, #PB_Ignore)
    
  LoadFont(0, "Arial", 10*s)
  StartDrawing(ImageOutput(id+10))
    DrawingFont(FontID(0))
    DrawText( x+30*s1, y+30*s2, "123" , #Blac , #Blu )
    DrawText( x+30*s1, y+50*s2, "123" , #Blac , #Blu )
  StopDrawing()
  
  SetGadgetState(id,ImageID(id+10))

  
;   ResizeGadget(1001+id*10, GadgetX(id)+20*s1, GadgetY(id)+25*s2, 70*s1, 17*s2)
;   ResizeGadget(1002+id*10, GadgetX(id)+30*s1, GadgetY(id)+44*s2, 50*s1, 17*s2)
;  
;   LoadFont(0, "Arial", 11*s)
;   SetGadgetFont(1001+id*10, FontID(0))
;   SetGadgetFont(1002+id*10, FontID(0))
   
EndProcedure



Procedure Resize(s.f)
  
 
   
   Resize_M_Gadget(#G_1, Poi(#G_1,#X)*s, Poi(#G_1,#Y)*s, 100*s, 100*s)
   Resize_M_Gadget(#G_2, Poi(#G_2,#X)*s, Poi(#G_2,#Y)*s, 100*s, 100*s)
   Resize_M_Gadget(#G_3, Poi(#G_3,#X)*s, Poi(#G_3,#Y)*s, 100*s, 100*s)
   Resize_M_Gadget(#G_4, Poi(#G_4,#X)*s, Poi(#G_4,#Y)*s, 100*s, 100*s)
   Resize_M_Gadget(#G_5, Poi(#G_5,#X)*s, Poi(#G_5,#Y)*s, 100*s, 100*s)
   Resize_M_Gadget(#G_6, Poi(#G_6,#X)*s, Poi(#G_6,#Y)*s, 100*s, 100*s)
   Resize_M_Gadget(#G_7, Poi(#G_7,#X)*s, Poi(#G_7,#Y)*s, 100*s, 100*s)
   Resize_M_Gadget(#G_8, Poi(#G_8,#X)*s, Poi(#G_8,#Y)*s, 100*s, 100*s)
   Resize_M_Gadget(#G_9, Poi(#G_9,#X)*s, Poi(#G_9,#Y)*s, 100*s, 100*s)
   Resize_M_Gadget(#G_10, Poi(#G_10,#X)*s, Poi(#G_10,#Y)*s, 100*s, 100*s)
   Resize_M_Gadget(#G_11, Poi(#G_11,#X)*s, Poi(#G_11,#Y)*s, 100*s, 100*s)
   Resize_M_Gadget(#G_12, Poi(#G_12,#X)*s, Poi(#G_12,#Y)*s, 100*s, 100*s)
   Resize_M_Gadget(#G_13, Poi(#G_13,#X)*s, Poi(#G_13,#Y)*s, 100*s, 100*s)
   Resize_M_Gadget(#G_14, Poi(#G_14,#X)*s, Poi(#G_14,#Y)*s, 100*s, 100*s)
   

  ProcedureReturn
EndProcedure



OpenWindow(#WinID,0,0,#Width,#Height,"Test",#WinStyle) 
SmartWindowRefresh(#WinID, 1) ; Это для уменьшения мерцаний окна, при изменении его размеров.
SetWindowColor(#WinID,  #WinColor) ; устанавливаем цвет окна
;ButtonGadget(1,5,5,190,20,"Button") 
M_Gadget (#G_1, Poi(#G_1,#X), Poi(#G_1,#Y), 100, 100, "N_1")
M_Gadget (#G_2, Poi(#G_2,#X), Poi(#G_2,#Y), 100, 100, "N_2")
M_Gadget (#G_3, Poi(#G_3,#X), Poi(#G_3,#Y), 100, 100, "N_3")
M_Gadget (#G_4, Poi(#G_4,#X), Poi(#G_4,#Y), 100, 100, "N_4")
M_Gadget (#G_5, Poi(#G_5,#X), Poi(#G_5,#Y), 100, 100, "N_5")
M_Gadget (#G_6, Poi(#G_6,#X), Poi(#G_6,#Y), 100, 100, "N_6")
M_Gadget (#G_7, Poi(#G_7,#X), Poi(#G_7,#Y), 100, 100, "N_7")
M_Gadget (#G_8, Poi(#G_8,#X), Poi(#G_8,#Y), 100, 100, "N_8")
M_Gadget (#G_9, Poi(#G_9,#X), Poi(#G_9,#Y), 100, 100, "N_9")
M_Gadget (#G_10, Poi(#G_10,#X), Poi(#G_10,#Y), 100, 100, "N_10")
M_Gadget (#G_11, Poi(#G_11,#X), Poi(#G_11,#Y), 100, 100, "N_11")
M_Gadget (#G_12, Poi(#G_12,#X), Poi(#G_12,#Y), 100, 100, "N_12")
M_Gadget (#G_13, Poi(#G_13,#X), Poi(#G_13,#Y), 100, 100, "N_13")
M_Gadget (#G_14, Poi(#G_14,#X), Poi(#G_14,#Y), 100, 100, "N_14")


Repeat 
  Event=WaitWindowEvent()
  
  If Event=#PB_Event_SizeWindow
    ;ResizeGadget(1,5,5,WindowWidth(0)-10,WindowHeight(0)-10) 
    
        xx.f= WindowWidth(#WinID) / #Width
        yy.f= WindowHeight(#WinID) / #Height
        ff.f=0
        If xx<=yy : ff= xx : Else : ff=yy : EndIf
        If ff<0.6 : ff=0.6 : EndIf
       ; Resize(ff)
    
  EndIf
  
Until Event=#PB_Event_CloseWindow

0

17

alexvolk написал(а):

он отображается только в одном ImageGadget?

Потому что в 116 и 117 строках лишние смешения по x и y. Текст за пределами области видимости.

0

18

не понял зачем текст гаджет нужен, почему по картинке не рисуем?

мерцает это видео не успевает перерисовывать
есть константа #WM_EXITSIZEMOVE, она срабатывает по окончании перетаскивания или изменения размеров окна
рисуй один раз после её срабатывания

0

19

Пётр написал(а):

Потому что в 116 и 117 строках лишние смешения по x и y. Текст за пределами области видимости.

Да точно спасибо! Сам не заметил.

0

20

newJS написал(а):

не понял зачем текст гаджет нужен, почему по картинке не рисуем?

Просто потом проще менять текст (выводить данные)

0

21

Пётр подскажите пожалуйста почему при большом количестве изменения размеров окна объем в памяти занимаемый приложением увеличивается?
Я что то делаю не так?

Код:
#Fon=$C8C8C8  ;RGB(200, 200, 200)
#Blac=$000000 ;RGB(0, 0, 0)
#Blu=$FF0000  ;RGB(0, 0, 255)
;#Purp=$FFFF00 ;RGB(0, 255, 255)
;#Yel=$00FFFF  ;RGB(255, 255, 0)

#WinID=0
#Width=450
#Height=420
#WinStyle = #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget |#PB_Window_ScreenCentered|#PB_Window_SystemMenu|#PB_Window_SizeGadget
#WinColor=#Fon

;- Нумерованые константы
;{
Enumeration
#G_1=1 : #G_2 : #G_3 : #G_4
#G_5 : #G_6 : #G_7
#G_8 : #G_9 : #G_10
#G_11 : #G_12 : #G_13 : #G_14
EndEnumeration
;}

#X=0 : #Y=1
Global Dim Poi.u(#G_14,1)
;{ координаты элементов
Poi(#G_1,#X)=5   : Poi(#G_1,#Y)=5
Poi(#G_2,#X)=105 : Poi(#G_2,#Y)=5
Poi(#G_3,#X)=205  : Poi(#G_3,#Y)=5
Poi(#G_4,#X)=305   : Poi(#G_4,#Y)=5
Poi(#G_5,#X)=5  : Poi(#G_5,#Y)=105
Poi(#G_6,#X)=105  : Poi(#G_6,#Y)=105
Poi(#G_7,#X)=205  : Poi(#G_7,#Y)=105
Poi(#G_8,#X)=5 : Poi(#G_8,#Y)=205
Poi(#G_9,#X)=105 : Poi(#G_9,#Y)=205
Poi(#G_10,#X)=205  : Poi(#G_10,#Y)=205
Poi(#G_11,#X)=5 : Poi(#G_11,#Y)=305
Poi(#G_12,#X)=105 : Poi(#G_12,#Y)=305
Poi(#G_13,#X)=205 : Poi(#G_13,#Y)=305
Poi(#G_14,#X)=305 : Poi(#G_14,#Y)=305
;}

Procedure RoundedBox(X, Y, W, H, R,FrT,FrC,FiC)
   Box(X,Y,W,H,#Fon)              ;Цвет фона Windows при выводе изображения
   x1=X+R
   x2=X+W-R
   y1=Y+R
   y2=Y+H-R   
   
   Circle(x1,y1, R,FrC)
   Circle(x1,y1, R-FrT,FiC)
   Circle(x2,y1,R,FrC)
   Circle(x2-1,y1,R-FrT,FiC)
   Circle(x1,y2-1,R,FrC)
   Circle(x1,y2-1,R-FrT,FiC)
   Circle(x2,y2-1,R,FrC)
   Circle(x2-1,y2-1,R-FrT,FiC)
   Box(x1,Y,W-2*R,H,FrC)
   Box(x1,Y+FrT,W-2*R,H-2*FrT,FiC)
   Box(X,y1,W+1,H-2*R,FrC)
   Box(X+FrT,y1,W-2*FrT,H-2*R,FiC)

EndProcedure

Procedure Set_Image1 (w.i=100, h.i=100)
  k=0
  If IsImage(1)=0
    CreateImage(1, w, h*0.925)
    k=1
  EndIf
  
  If  ImageWidth(1)<>w Or ImageHeight(1)<>h*0.925
    ResizeImage(1,w,h*0.925)
    k=1
  EndIf
  
  If StartDrawing(ImageOutput(1)) And k
  ;Поскольку новое изображение имеет черный фон, заполняем его другим цветом:
    Box(0, 0, w, h*0.925, #Fon)   
  ;Рисует прямоугольник с закругленными углами
    ww=w*0.9 : hh=h*0.925-h/5-1
    RoundedBox((w-ww)/2, h/5, ww, hh, w/14,1,#Blac,#Blu)
  EndIf
  StopDrawing()
    
EndProcedure 

Structure M_G
  id.i
  d1.i
  d2.i
  d3.i
  s1.f
  s2.f
  Title.s
EndStructure

Global NewList M_Gad.M_G() 

Procedure M_Gadget (id.i, x.i, y.i, w.i, h.i, Title.s)
  
  s1.f=w/100
  s2.f=h/100
  s.f=1
  If s1<=s2 : s=s1 : ElseIf s2<s1 : s=s2 : EndIf
  
  AddElement(M_Gad())
  M_Gad()\id=id
  M_Gad()\Title=Title
  M_Gad()\d1=888
  M_Gad()\s1=s1
  M_Gad()\s2=s2
  
  Set_Image1 (w,h)
  CopyImage(1, id+10)
  
  LoadFont(0, "Arial", 10*s)
  StartDrawing(ImageOutput(id+10))
    DrawingFont(FontID(0))
    DrawText( 30*s1, 30*s2, Title , #Blac , #Blu )
    DrawText( 30*s1, 50*s2, Str(M_Gad()\d1) , #Blac , #Blu )
  StopDrawing()
  
  ImageGadget(id, x, y, w, h, ImageID(id+10))
  
EndProcedure



Procedure Resize_M_Gadget(id.i, x.i, y.i, w.i, h.i, k=0)

  s1.f=w/100
  s2.f=h/100
  s.f=1
  If s1<=s2 : s=s1 : ElseIf s2<s1 : s=s2 : EndIf
  
  ForEach M_Gad()
    If M_Gad()\id = id : Break : EndIf
  Next  
  M_Gad()\s1=s1
  M_Gad()\s2=s2
  
  Set_Image1 (w,h)  
  CopyImage(1, id+10)
  ResizeGadget(id, x, y, #PB_Ignore, #PB_Ignore)
    
  LoadFont(0, "Arial", 10*s)
  StartDrawing(ImageOutput(id+10))
    DrawingFont(FontID(0))
    DrawText( 30*M_Gad()\s1, 30*M_Gad()\s2, M_Gad()\Title , #Blac , #Blu )
    DrawText( 30*M_Gad()\s1, 50*M_Gad()\s2, Str(M_Gad()\d1) , #Blac , #Blu )
  StopDrawing()
  
  SetGadgetState(id,ImageID(id+10))

EndProcedure

Procedure Set_M_Gadget(id.i, d1.i, Title.s="")
  
  ForEach M_Gad()
    If M_Gad()\id = id : Break : EndIf
  Next 
  
  If Title<>"" : M_Gad()\Title = Title :  EndIf
  If d1<>#PB_Ignore : M_Gad()\d1 = d1 :  EndIf
  
  CopyImage(1, id+10)
  
  StartDrawing(ImageOutput(id+10))
    DrawingFont(FontID(0))
    DrawText( 30*M_Gad()\s1, 30*M_Gad()\s2, M_Gad()\Title , #Blac , #Blu )
    DrawText( 30*M_Gad()\s1, 50*M_Gad()\s2, Str(M_Gad()\d1) , #Blac , #Blu )
  StopDrawing()
  
  SetGadgetState(id,ImageID(id+10))

EndProcedure

Procedure Resize(s.f)
   
   Resize_M_Gadget(#G_1, Poi(#G_1,#X)*s, Poi(#G_1,#Y)*s, 100*s, 100*s)
   Resize_M_Gadget(#G_2, Poi(#G_2,#X)*s, Poi(#G_2,#Y)*s, 100*s, 100*s)
   Resize_M_Gadget(#G_3, Poi(#G_3,#X)*s, Poi(#G_3,#Y)*s, 100*s, 100*s)
   Resize_M_Gadget(#G_4, Poi(#G_4,#X)*s, Poi(#G_4,#Y)*s, 100*s, 100*s)
   Resize_M_Gadget(#G_5, Poi(#G_5,#X)*s, Poi(#G_5,#Y)*s, 100*s, 100*s)
   Resize_M_Gadget(#G_6, Poi(#G_6,#X)*s, Poi(#G_6,#Y)*s, 100*s, 100*s)
   Resize_M_Gadget(#G_7, Poi(#G_7,#X)*s, Poi(#G_7,#Y)*s, 100*s, 100*s)
   Resize_M_Gadget(#G_8, Poi(#G_8,#X)*s, Poi(#G_8,#Y)*s, 100*s, 100*s)
   Resize_M_Gadget(#G_9, Poi(#G_9,#X)*s, Poi(#G_9,#Y)*s, 100*s, 100*s)
   Resize_M_Gadget(#G_10, Poi(#G_10,#X)*s, Poi(#G_10,#Y)*s, 100*s, 100*s)
   Resize_M_Gadget(#G_11, Poi(#G_11,#X)*s, Poi(#G_11,#Y)*s, 100*s, 100*s)
   Resize_M_Gadget(#G_12, Poi(#G_12,#X)*s, Poi(#G_12,#Y)*s, 100*s, 100*s)
   Resize_M_Gadget(#G_13, Poi(#G_13,#X)*s, Poi(#G_13,#Y)*s, 100*s, 100*s)
   Resize_M_Gadget(#G_14, Poi(#G_14,#X)*s, Poi(#G_14,#Y)*s, 100*s, 100*s)
   
;    Set_M_Gadget(#G_1, s*100)
;    Set_M_Gadget(#G_2, s*100)
;    Set_M_Gadget(#G_3, s*100)
;    Set_M_Gadget(#G_4, s*100)
    Set_M_Gadget(#G_5, s*100)
;    Set_M_Gadget(#G_6, s*100)
;    Set_M_Gadget(#G_7, s*100)
;    Set_M_Gadget(#G_8, s*100)
;    Set_M_Gadget(#G_9, s*100)
;    Set_M_Gadget(#G_10, s*100)
;    Set_M_Gadget(#G_11, s*100)
;    Set_M_Gadget(#G_12, s*100)
;    Set_M_Gadget(#G_13, s*100)
;    Set_M_Gadget(#G_14, s*100)
   
  ProcedureReturn
EndProcedure



OpenWindow(#WinID,0,0,#Width,#Height,"Test",#WinStyle) 
SmartWindowRefresh(#WinID, 1) ; Это для уменьшения мерцаний окна, при изменении его размеров.
SetWindowColor(#WinID,  #WinColor) ; устанавливаем цвет окна
M_Gadget (#G_1, Poi(#G_1,#X), Poi(#G_1,#Y), 100, 100, "N_1")
M_Gadget (#G_2, Poi(#G_2,#X), Poi(#G_2,#Y), 100, 100, "N_2")
M_Gadget (#G_3, Poi(#G_3,#X), Poi(#G_3,#Y), 100, 100, "N_3")
M_Gadget (#G_4, Poi(#G_4,#X), Poi(#G_4,#Y), 100, 100, "N_4")
M_Gadget (#G_5, Poi(#G_5,#X), Poi(#G_5,#Y), 100, 100, "N_5")
M_Gadget (#G_6, Poi(#G_6,#X), Poi(#G_6,#Y), 100, 100, "N_6")
M_Gadget (#G_7, Poi(#G_7,#X), Poi(#G_7,#Y), 100, 100, "N_7")
M_Gadget (#G_8, Poi(#G_8,#X), Poi(#G_8,#Y), 100, 100, "N_8")
M_Gadget (#G_9, Poi(#G_9,#X), Poi(#G_9,#Y), 100, 100, "N_9")
M_Gadget (#G_10, Poi(#G_10,#X), Poi(#G_10,#Y), 100, 100, "N_10")
M_Gadget (#G_11, Poi(#G_11,#X), Poi(#G_11,#Y), 100, 100, "N_11")
M_Gadget (#G_12, Poi(#G_12,#X), Poi(#G_12,#Y), 100, 100, "N_12")
M_Gadget (#G_13, Poi(#G_13,#X), Poi(#G_13,#Y), 100, 100, "N_13")
M_Gadget (#G_14, Poi(#G_14,#X), Poi(#G_14,#Y), 100, 100, "N_14")


Repeat 
  Event=WaitWindowEvent()
  
  If Event=#PB_Event_SizeWindow
        
        xx.f= WindowWidth(#WinID) / #Width
        yy.f= WindowHeight(#WinID) / #Height
        ff.f=0
        If xx<=yy : ff= xx : Else : ff=yy : EndIf
        If ff<0.6 : ff=0.6 : EndIf
        Resize(ff)
    
  EndIf
  
Until Event=#PB_Event_CloseWindow

0

22

alexvolk написал(а):

почему при большом количестве изменения размеров окна объем в памяти занимаемый приложением увеличивается?

Не заметил такого.

0

23

Пётр написал(а):

Не заметил такого.

Потаскаешь за уголок и размер увеличивается.

https://forumupload.ru/uploads/0009/ae/28/410/t403103.gif
https://forumupload.ru/uploads/0009/ae/28/410/t155594.gif
https://forumupload.ru/uploads/0009/ae/28/410/t227447.gif

0

24

alexvolk написал(а):

Потаскаешь за уголок и размер увеличивается.

2.2 МБ это не много. А если сжать окно, использование памяти не уменьшается?

0

25

Пётр написал(а):

2.2 МБ это не много. А если сжать окно, использование памяти не уменьшается?

Да уменьшается, но при запуске в исходном размере 1.7 МБ, после нескольких изменений в исходом размере уже 2 МБ, после еще нескольких изменений в исходном размере уже 2.2 МБ и так далее.
Размер доходил до 5.7 больше не пробовал, если еще помучатся будет и больше.

0

26

5.7 МБ это не много.
Картинки занимают память. Иначе где им хранить цвета пикселей? Чем больше картинка, тем больше ей требуется памяти.

0


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Все о ResizeGadget