怎样使控件重画时不抖动(160分)

  • 主题发起人 主题发起人 Rose
  • 开始时间 开始时间
R

Rose

Unregistered / Unconfirmed
GUEST, unregistred user!
我做了一个控件,想使其在运行状态能用鼠标拖动放大缩小。取得控件所在的容器,并用容器重画来实现,但会抖动。如何解决?望各位高手指点。

parent.Repaint ;
canvas.Handle := getDC(parent.handle);
Canvas.Brush.Color := clBtnface;
Canvas.FrameRect(ScreenRect);

 
var
bmp: TBitmap;
dc: HDC;
begin
bmp:=TBitmap.Create;
dc:=GetDC(parent.handle);
bmp.Canvas.Handle:=CreateCompatibleDC(dc);
bmp.width:=Parent.Width;
bmp.Height:=Parent.Height;
Parent.PaintTo(bmp.Canvas.Handle);
with bmp.Canvas do
begin
Brush.Color:= clBtnFace;
FrameRect(ScreenRect);
end;
bitblt(dc,0,0,Parent.Width, Parent.Height, bmp.Canvas.Handle,0,0,SRCCOPY);
bmp.Free;
ReleaseDC(dc);
end;
 
我发现eyes对win api比较熟,学过vc吧!
 
没有
高级语言都没学过
delphi是用会的
api是看help研究vcl源码(包括下载的freeware控件)知道的
 
Another_eYes这个范例的学名叫 double buffering.
 
双缓冲:)
也可以用快速动画,
去书店找本类似的书吧
 
o?
我临时编的东西都有学名了?(eYes真厉害)
 
编dos程序时有这样的技术!
 
DOS程序实在好玩
1.我用分页动画(实际和双缓冲差不多)
2.用ASM写画点函数,用TC调用
3.EYES,你有画线/筐/圆的ASM代码吗:)

EYES就是EYES
 
直接写屏在Windows下能不能用?
 
可以,不过是通过DirectX来实现
 
其实还可以用一个API函数

要往窗口paint前,

LockWindowsUpdate(hwnd:HWND),不让某个窗口paint,
等paint后在LockWindowsUpdate(0)
可以避免paint 一段,窗口就refresh

适用于动态paint

 
不好意思,我耽搁得太久了。谢谢大家。
 
多人接受答案了。
 
后退
顶部