Double Buffering is one way but not always sufficient. Imagine you paint a shape at runtime, it depends on your repaint method. Forces the control to repaint its image on the screen could be crucial.
Call Repaint to force the control to repaint its image immediately. If the ControlStyle property includes csOpaque, the control paints itself directly. So double buffering plus invalidate and [csOpaque] as controlstyle could be an improvement:
var Compass: TPaintBox;
procedure TForm1ForceRepaint(Sender: TObject);
{Called when display type or compass angle changes}
begin
compass.controlstyle:= [csOpaque];
while heading.value<0 do heading.Value:=heading.Value+360;
while heading.value>360 do heading.Value:=heading.Value-360;
compass.Invalidate;
end;
https://stackoverflow.com/questions/1954491/stop-flickering
https://delphi-bar.blogspot.com/2012/11/prevent-screen-refresh-and-flickering.html
LockWindowUpdate(Handle);
try
// Code goes here
finally
LockWindowUpdate(0);
end;
Solution 2
SendMessage(Handle, WM_SETREDRAW, WPARAM(False), 0);
try
// Code goes here
finally
SendMessage(Handle, WM_SETREDRAW, WPARAM(True), 0);
RedrawWindow(Self.Handle, nil, 0, RDW_ERASE or RDW_FRAME or RDW_INVALIDATE or RDW_ALLCHILDREN);
end;
https://delphi-bar.blogspot.com/2012/11/prevent-screen-refresh-and-flickering.html
https://stackoverflow.com/questions/15308077/delphi-custom-animation-collision-detection
https://www.codeproject.com/Articles/33/Flicker-Free-Drawing-In-MFC
https://stackoverflow.com/questions/6363954/best-way-to-do-non-flickering-segmented-graphics-updates-in-delphi
https://stackoverflow.com/questions/17483147/flicker-does-not-reduce-after-double-buffering-in-mfc-cpaintdc
https://stackoverflow.com/questions/17483147/flicker-does-not-reduce-after-double-buffering-in-mfc-cpaintdc
沒有留言:
張貼留言