关于 panel继承 Canvas 后重绘闪烁问题

wealsh 2012-09-08 08:38:02
我在 Panel 继承了 Canvas ,用一个线程不停地绘图,当鼠标在窗口或其它控件上面随便移动一下 这个 panel 就会闪烁,鼠标在窗口外就没问题,请问为什么?谢谢。

主窗口 与 panel
DoubleBuffered:=True;也没效果
...全文
246 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
Pinck 2012-09-12
  • 打赏
  • 举报
回复
使用双缓存,每次重绘时用缓存里的图形,而不是直接在Draw里绘制
littlestone08 2012-09-10
  • 打赏
  • 举报
回复
看盒子吧,要不你在盒子上留Q
littlestone08 2012-09-10
  • 打赏
  • 举报
回复
果然,盒子上的就是你。看盒子上的回复吧。要不你盒子上留QQ
wealsh 2012-09-10
  • 打赏
  • 举报
回复
TWealshPnl = class(TPanel)
private
FOnMouseEnter: TNotifyEvent;
FOnMouseLeave: TNotifyEvent;
FPaint:TNotifyEvent;
procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER;
procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;
protected
procedure Paint;override;
public
TmpSpBmp:TBitmap;
procedure CBShowSp(pData:Pointer;pSize:Integer);
property Canvas;
procedure ResizeBmp1(SrcBM, DstBM: TBitmap; Nwide, Nheight: integer);
published
property OnMouseEnter:TNotifyEvent read FOnMouseEnter write FOnMouseEnter;
property OnMouseLeave:TNotifyEvent read FOnMouseLeave write FOnMouseLeave;
property OnPaint:TNotifyEvent read FPaint write FPaint;
end;




procedure TWealshPnl.CBShowSp(pData:Pointer;pSize:Integer);
var
B:TBitmap;
begin
if not Assigned(TmpSpBmp) then
begin
TmpSpBmp:=TBitmap.Create;
DoubleBuffered:=True;
end;
TmpSpBmp.Canvas.Lock;
Canvas.Lock;
TmpSpBmp.Handle := HBitmap(pData^);
B:=TBitmap.Create;
ResizeBmp1(TmpSpBmp,B,Width-6,Height-6);
Canvas.Draw(3,3,B);
B.Free;
end;
wealsh 2012-09-10
  • 打赏
  • 举报
回复
TWealshPnl = class(TPanel)
private
FOnMouseEnter: TNotifyEvent;
FOnMouseLeave: TNotifyEvent;
FPaint:TNotifyEvent;
procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER;
procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;
protected
procedure Paint;override;
public
TmpSpBmp:TBitmap;
procedure CBShowSp(pData:Pointer;pSize:Integer);
property Canvas;
procedure ResizeBmp1(SrcBM, DstBM: TBitmap; Nwide, Nheight: integer);
published
property OnMouseEnter:TNotifyEvent read FOnMouseEnter write FOnMouseEnter;
property OnMouseLeave:TNotifyEvent read FOnMouseLeave write FOnMouseLeave;
property OnPaint:TNotifyEvent read FPaint write FPaint;
end;




procedure TWealshPnl.CBShowSp(pData:Pointer;pSize:Integer);
var
B:TBitmap;
begin
if not Assigned(TmpSpBmp) then
begin
TmpSpBmp:=TBitmap.Create;
DoubleBuffered:=True;
end;
TmpSpBmp.Canvas.Lock;
Canvas.Lock;
TmpSpBmp.Handle := HBitmap(pData^);
B:=TBitmap.Create;
ResizeBmp1(TmpSpBmp,B,Width-6,Height-6);
Canvas.Draw(3,3,B);
B.Free;
end;
BambooCaep 2012-09-08
  • 打赏
  • 举报
回复
从tcustomcontrol继承吧。
hsfzxjy 2012-09-08
  • 打赏
  • 举报
回复
什么叫继承了canvas?是某控件继承自panel然后重写canvas属性,还是你的panel继承自canvaa?你这样说让人迷惑。。

5,390

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧