PureBasic - форум

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

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


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Избавиться от мерцания CanvasGadget, при ResizeGadget


Избавиться от мерцания CanvasGadget, при ResizeGadget

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

1

Есть код, при котором происходит прорисовка на холсте. Размеры холста, зависимы от размера окна. Т.е. при изменении размера окна, происходит ResizeGadget для CanvasGadget. Проблема в том, что при изменении размеров холста, нарисованное на нём, сбрасывается до чистого фона и поэтому происходит мерцание. Я бы хотел найти грамотный кроссплатформенный способ, избавиться от такого мерцания.

Код первый, по вопросу:

Код:
Enumeration Windows
  #Window1
EndEnumeration

Enumeration Gadgets
  #Canvas1
EndEnumeration

Procedure _Draw()
  If StartDrawing( CanvasOutput(#Canvas1) )
    Protected.u W = GadgetWidth(#Canvas1), H = GadgetHeight(#Canvas1)
    For i =0 To 7
      Box( i*20, i*20, W-(i*40), H-(i*40), RGB( 255-(i*20), 200-(i*20), 170-(i*17) ) )
    Next
    StopDrawing()
  EndIf
EndProcedure

Procedure _Event()
  ResizeGadget( #Canvas1, 10, 10, WindowWidth(#Window1)-20 , WindowHeight(#Window1)-20 )
  _Draw()
EndProcedure


If OpenWindow( #Window1, 0, 0, 500, 300, "ТЕСТ (ИЗМЕНЯЙТЕ РАЗМЕР ОКНА С ПОМОЩЬЮ МЫШИ)", #PB_Window_ScreenCentered|#PB_Window_SystemMenu|#PB_Window_SizeGadget )
  SetWindowColor( #Window1, $AAB220 )
  CanvasGadget( #Canvas1, 10, 10, WindowWidth(#Window1)-20 , WindowHeight(#Window1)-20 )
  _Draw()
  BindEvent( #PB_Event_SizeWindow , @_Event(), #Window1 )
  Repeat 
    Event=WaitWindowEvent()
  Until Event=#PB_Event_CloseWindow
EndIf

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

Код:
Enumeration Windows
  #Window1
EndEnumeration

Enumeration Gadgets
  #Canvas1
  #CanvasTmp
EndEnumeration

Procedure _Draw()
  If StartDrawing( CanvasOutput(#Canvas1) )
    Protected.u W = GadgetWidth(#Canvas1), H = GadgetHeight(#Canvas1)
    For i =0 To 7
      Box( i*20, i*20, W-(i*40), H-(i*40), RGB( 255-(i*20), 200-(i*20), 170-(i*17) ) )
    Next
    StopDrawing()
  EndIf
EndProcedure

Procedure _Event()
  
  ResizeGadget( #CanvasTmp, 10, 10, WindowWidth(#Window1)-20 , WindowHeight(#Window1)-20 )
  
  Protected OldImageID = GetGadgetAttribute(#Canvas1, #PB_Canvas_Image)
  SetGadgetAttribute( #CanvasTmp, #PB_Canvas_Image, OldImageID )
  HideGadget( #CanvasTmp, #False )
  
  HideGadget( #Canvas1, #True )
  ResizeGadget( #Canvas1, 10, 10, WindowWidth(#Window1)-20 , WindowHeight(#Window1)-20 )
  _Draw()
  HideGadget( #Canvas1, #False )
  
  HideGadget( #CanvasTmp, #True )
  
EndProcedure

If OpenWindow( #Window1, 0, 0, 500, 300, "ТЕСТ (ИЗМЕНЯЙТЕ РАЗМЕР ОКНА С ПОМОЩЬЮ МЫШИ)", #PB_Window_ScreenCentered|#PB_Window_SystemMenu|#PB_Window_SizeGadget )
  SetWindowColor( #Window1, $AAB220 )
  CanvasGadget( #Canvas1, 10, 10, WindowWidth(#Window1)-20 , WindowHeight(#Window1)-20 )
  CanvasGadget( #CanvasTmp, GadgetX(#Canvas1), GadgetY(#Canvas1), GadgetWidth(#Canvas1), GadgetHeight(#Canvas1) )
  HideGadget( #CanvasTmp, #True )
  _Draw()
  BindEvent( #PB_Event_SizeWindow , @_Event(), #Window1 )
  
  Repeat : Event=WaitWindowEvent() : Until Event=#PB_Event_CloseWindow
EndIf

А поэтому, прошу ребят из сообщества, помочь в решении этой задачи. Кроссплатформенность желательна.

P.S. Если честно, я не понимаю, почему разработчик PB, предпочёл стирать CanvasGadget полностью, при изменении его размера, вполне можно было работать по отсечениям изменённых размеров (когда не стираются незатронутые области). На мой взгляд, тогда проблем с мерцанием не было бы.

Отредактировано Webarion (12.10.2022 00:12:59)

0

2

Код:
Enumeration Windows
  #Window1
EndEnumeration

Enumeration Gadgets
  #Canvas1
EndEnumeration

Procedure _Draw()
  If StartDrawing( CanvasOutput(#Canvas1) )
    Protected.u W = OutputWidth(), H = OutputHeight()
    For i =0 To 7
      Box( i*20, i*20, W-(i*40), H-(i*40), RGB( 255-(i*20), 200-(i*20), 170-(i*17) ) )
    Next
    StopDrawing()
  EndIf
EndProcedure

Procedure CanvasEvent()
  If EventType() = #PB_EventType_Resize
    _Draw()
  EndIf
EndProcedure

Procedure _Event()
  ResizeGadget( #Canvas1, 10, 10, WindowWidth(#Window1)-20 , WindowHeight(#Window1)-20 )
EndProcedure


If OpenWindow( #Window1, 0, 0, 500, 300, "ТЕСТ (ИЗМЕНЯЙТЕ РАЗМЕР ОКНА С ПОМОЩЬЮ МЫШИ)", #PB_Window_ScreenCentered|#PB_Window_SystemMenu|#PB_Window_SizeGadget )
  SmartWindowRefresh(#Window1, #True)
  SetWindowColor( #Window1, $AAB220 )
  CanvasGadget( #Canvas1, 10, 10, WindowWidth(#Window1)-20 , WindowHeight(#Window1)-20 )
  _Draw()
  BindEvent( #PB_Event_SizeWindow , @_Event(), #Window1 )
  BindGadgetEvent(#Canvas1, @CanvasEvent())
  Repeat 
    Event=WaitWindowEvent()
  Until Event=#PB_Event_CloseWindow
EndIf
Webarion написал(а):

вполне можно было работать по отсечениям изменённых размеров (когда не стираются незатронутые области).

В предыдущих версиях так и было.

+1

3

То, что нужно!  :cool:

0


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Избавиться от мерцания CanvasGadget, при ResizeGadget