As the ScrollArea is auto resized internally by the Splitter, WM_SETREDRAW Off/On, RedrawWindow... have no effect.
A tip to remove flickering from a ScrollArea resized with a SplitterGadget.
Any other tips are welcome
Code: Select all
; A tip to remove flickering from a ScrollArea resized with a SplitterGadget:
; BindGadgetEvent Splitter. In the callback, replaced in the Splitter, the child ScrollArea with a Canvas gadget.
; The ScrollArea resized is then drawn in the Canvas by sending a WM_Print message.
; On left button up, replaced in reverse, the Canvas by the ScrollArea in the Splitter.
EnableExplicit
Enumeration Window
#Window_0
EndEnumeration
Enumeration Gadgets
#ScrlArea_1
#Canv_1
#Txt_1
#Btn_1
#PrintScrlArea_2
#ScrlArea_2
#Canv_2
#Txt_2
#Btn_2
#Splitter
EndEnumeration
Enumeration Image
#Imag
EndEnumeration
CatchImage(#Imag, ?Imag)
Global ResizeSplitter
Procedure BindSplitter()
Static SplitterPosition
Protected NewSplitterPosition, hDC
NewSplitterPosition = GetGadgetState(#Splitter)
If Not NewSplitterPosition = SplitterPosition
SplitterPosition = NewSplitterPosition
UpdateWindow_(GadgetID(#ScrlArea_1)) ; a little better for #ScrlArea_1
If Not ResizeSplitter
HideGadget(#PrintScrlArea_2, #False)
If GetGadgetAttribute(#Splitter, #PB_Splitter_FirstGadget) = #ScrlArea_1
SetGadgetAttribute(#Splitter, #PB_Splitter_SecondGadget, #PrintScrlArea_2)
Else
SetGadgetAttribute(#Splitter, #PB_Splitter_FirstGadget, #PrintScrlArea_2)
EndIf
HideGadget(#ScrlArea_2, #True)
ResizeSplitter = #True
EndIf
ResizeGadget(#ScrlArea_2, #PB_Ignore, #PB_Ignore, GadgetWidth(#PrintScrlArea_2), #PB_Ignore)
;RedrawWindow_(GadgetID(#ScrlArea_2), #Null, #Null, #RDW_INVALIDATE | #RDW_ERASENOW | #RDW_ALLCHILDREN | #RDW_UPDATENOW)
hDC = StartDrawing(CanvasOutput(#PrintScrlArea_2))
If hDC
SendMessage_(GadgetID(#ScrlArea_2), #WM_PRINT, hDC, #PRF_CHILDREN | #PRF_CLIENT | #PRF_NONCLIENT | #PRF_OWNED | #PRF_ERASEBKGND)
StopDrawing()
EndIf
;Else
; Debug "Event received with same Splitter position"
EndIf
EndProcedure
Procedure Open_Window_0(X = 0, Y = 0, Width = 580, Height = 320)
If OpenWindow(#Window_0, X, Y, Width, Height, "DEFlicker ScrollArea", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered)
ScrollAreaGadget(#ScrlArea_1, 0, 0, 0, 0, 512, 512, 10, #PB_ScrollArea_Single)
SetGadgetColor(#ScrlArea_1, #PB_Gadget_BackColor, $999999)
CanvasGadget(#Canv_1, 0, 0, DesktopUnscaledX(256), DesktopUnscaledX(256))
SetGadgetAttribute(#Canv_1, #PB_Canvas_Image, ImageID(#Imag))
TextGadget(#Txt_1, 230, 120, 160, 60, "( Fliker Side )", #PB_Text_Center | #SS_CENTERIMAGE)
SetGadgetColor(#Txt_1, #PB_Gadget_BackColor, $400000) : SetGadgetColor(#Txt_1, #PB_Gadget_FrontColor, $40FFFF)
ButtonGadget(#Btn_1, 40, 230, 220, 60, "Change (Flicker) Side ")
CloseGadgetList()
CanvasGadget(#PrintScrlArea_2, 0, 0, 0, 0)
HideGadget(#PrintScrlArea_2, #True)
ScrollAreaGadget(#ScrlArea_2, 0, 0, 0, 0, 512, 512, 10, #PB_ScrollArea_Single)
SetGadgetColor(#ScrlArea_2, #PB_Gadget_BackColor, $999999)
; It does not work with a PB_Canvas_Container with button and text inside, they are not drawn as children when the #WM_PRINT message is sent ???
CanvasGadget(#Canv_2, 0, 0, DesktopUnscaledX(256), DesktopUnscaledX(256))
SetGadgetAttribute(#Canv_2, #PB_Canvas_Image, ImageID(#Imag))
TextGadget(#Txt_2, 230, 120, 160, 60, "( DEFliker Side )", #PB_Text_Center | #SS_CENTERIMAGE)
SetGadgetColor(#Txt_2, #PB_Gadget_BackColor, $400000) : SetGadgetColor(#Txt_2, #PB_Gadget_FrontColor, $40FFFF)
ButtonGadget(#Btn_2, 40, 230, 220, 60, "Change (DEFlicker) Side ")
CloseGadgetList()
SplitterGadget(#Splitter, 0, 0, 580, 320, #ScrlArea_1, #ScrlArea_2, #PB_Splitter_Separator | #PB_Splitter_Vertical)
BindGadgetEvent(#Splitter, @BindSplitter())
ProcedureReturn #True
EndIf
EndProcedure
;- Main Program
If Open_Window_0()
Repeat
If ResizeSplitter = #True
;Better here than using #WM_LBUTTONUP when an event is sent following a resize, without a left button up
;32768 Or $8000: the most significant bit is set. If the high-order bit is 1, the key is down, otherwise, it is up.
If Not (GetKeyState_(#VK_LBUTTON) & 32768)
HideGadget(#ScrlArea_2, #False)
If GetGadgetAttribute(#Splitter, #PB_Splitter_FirstGadget) = #ScrlArea_1
SetGadgetAttribute(#Splitter, #PB_Splitter_SecondGadget, #ScrlArea_2)
Else
SetGadgetAttribute(#Splitter, #PB_Splitter_FirstGadget, #ScrlArea_2)
EndIf
HideGadget(#PrintScrlArea_2, #True)
RedrawWindow_(GadgetID(#Splitter), #Null, #Null, #RDW_INVALIDATE | #RDW_ERASENOW | #RDW_ALLCHILDREN | #RDW_UPDATENOW)
ResizeSplitter = #False
EndIf
EndIf
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
Break
Case #PB_Event_Gadget
Select EventGadget()
Case #Btn_1, #Btn_2
If GetGadgetAttribute(#Splitter, #PB_Splitter_FirstGadget) = #ScrlArea_1
SetGadgetAttribute(#Splitter, #PB_Splitter_FirstGadget, #ScrlArea_2)
SetGadgetAttribute(#Splitter, #PB_Splitter_SecondGadget, #ScrlArea_1)
Else
SetGadgetAttribute(#Splitter, #PB_Splitter_FirstGadget, #ScrlArea_1)
SetGadgetAttribute(#Splitter, #PB_Splitter_SecondGadget, #ScrlArea_2)
EndIf
RedrawWindow_(GadgetID(#Splitter), #Null, #Null, #RDW_INVALIDATE | #RDW_ERASENOW | #RDW_ALLCHILDREN | #RDW_UPDATENOW)
EndSelect
EndSelect
ForEver
EndIf
DataSection
Imag: : IncludeBinary #PB_Compiler_Home+"Examples\Sources\Data\Background.bmp"
EndDataSection