PaintBox中背景重画闪烁问题? ( 积分: 100 )

  • 主题发起人 主题发起人 wsgfaust
  • 开始时间 开始时间
W

wsgfaust

Unregistered / Unconfirmed
GUEST, unregistred user!
我在用Delphi做一个期货K线图,其中有个功能是在鼠标Move事件中,在K线图上画竖线提示用户鼠标横坐标位置。这过程出现了一个问题,就是在鼠标Move事件的处理时,如果随着鼠标每次移动都要重画一次背景K线,会造成画面闪烁的非常厉害,各位高手有没有解决的办法,谢谢告知。
 
我在用Delphi做一个期货K线图,其中有个功能是在鼠标Move事件中,在K线图上画竖线提示用户鼠标横坐标位置。这过程出现了一个问题,就是在鼠标Move事件的处理时,如果随着鼠标每次移动都要重画一次背景K线,会造成画面闪烁的非常厉害,各位高手有没有解决的办法,谢谢告知。
 
这种方法当然不好啦, 你可以用一个小小 Hint 窗口显示坐标。
 
谢谢回答,你说的显示方法我之前已经提供了,但是用户需求里要求必须有线来表示,所以还是必须解决闪烁问题。
 
加个双缓冲试试 Form1.DoubleBuffered := true;
 
那就用 双缓冲, 在 bmpBuffer: TbitMap 上面画图, 最后,将bmpBuffer 贴到paintbox 的canvas 上。
 
关注中,解决我看看更好的答案
 
接受答案了.
 
昨天一个高手用了vc里面的api帮我解决了这个问题,同样是双缓存,在内存中先画好然后copy到canvas,觉得xuxiaohan的答案最好。
 
procedure TFormKXianMain.FormCreate(Sender: TObject);
var hScrDC, hMemDC: HDC;
hBitmap, hOldBitmap: HWND; // 位图句柄
begin
memCanvas:=TCanvas.Create;
//为屏幕创建设备描述表
hScrDC := CreateDC('DISPLAY', NIL, NIL, NIL);
//为屏幕设备描述表创建兼容的内存设备描述表
hMemDC := CreateCompatibleDC(hScrDC);
// 创建一个与屏幕设备描述表兼容的位图
hBitmap := CreateCompatibleBitmap(hScrDC, Width, Height);
// 把新位图选到内存设备描述表中
hOldBitmap := SelectObject(hMemDC, hBitmap);

memCanvas.Handle:=hMemDC;
// memCanvas:=Canvas;
end;
procedure TFormKXianMain.RefreshBox;

begin
BitBlt(Canvas.Handle, 0, 0, Width, Height, memCanvas.Handle, 0, 0, SRCCOPY);
end;
这是两个主要函数,将图先画在memCanvas上,然后用下面函数copy到当前Canvas上。呵呵
 

Similar threads

G
回复
0
查看
154
gaodu2002
G
F
回复
5
查看
217
microtomato
M
后退
顶部