Есть код, при котором происходит прорисовка на холсте. Размеры холста, зависимы от размера окна. Т.е. при изменении размера окна, происходит 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)