如何防止Panel内部的控件被刷新(貌似简单,其实不然)?????

risingsoft 2006-06-27 12:07:32
我在TPanel里放了一个TImage,TImage上显示一个小标记图。Panel上被程序调用进行绘图。发现Panel刷新时把Image上的图像也擦除了。即使把Image.visible=true也不能解决。该如何处理呢?
代码:

//定义
fImageFlag:TImage;

//主界面创建
.FormCreate(...)...

fImageFlag := TImage.Create(self);//必须为form
fImageFlag.AutoSize := false;
fImageFlag.Stretch := true;
fImageFlag.Width := 100;
fImageFlag.Height := 100;
fImageFlag.Left := 0;
fImageFlag.Top := 0;
fImageFlag.Parent := pnlMain;//必须为pnlMain,是绘图面板
fImageFlag.Picture.bitmap.Assign(bmpLL);
fImageFlag.Visible := True;
fImageFlag.BringToFront;

//主界面调用
fImageFlag.Picture.Bitmap.Assign(bmpLL);//屏蔽此行就没问题。fImageFlag不会被刷掉
fImageFlag.Refresh;

但是我要动态换fImageFlag.Picture里的bitmap,该如何解决。总不能创建两个fImageFlag吧

在线等。。。。。。。。。。。。。
...全文
342 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
risingsoft 2006-06-27
  • 打赏
  • 举报
回复
Image.Invalidate;
Image.Refresh;
Image.Repaint;
Image.Update;

这些都试过了,都是Image一闪就消失了。
我要的效果是Image换图像后正常显示在Panel上
zwjchina 2006-06-27
  • 打赏
  • 举报
回复
在作完绘画之后,立刻调用Image.Invalidate;看看能否解决你的问题
CACACACACA 2006-06-27
  • 打赏
  • 举报
回复
怎么绘的?
Panel的Canvas用不了.
risingsoft 2006-06-27
  • 打赏
  • 举报
回复
up...
risingsoft 2006-06-27
  • 打赏
  • 举报
回复
好。。。算是吧。学习!结帖子
王集鹄 2006-06-27
  • 打赏
  • 举报
回复
TWidgetControl...那是CLX的控件
VLC中是TWinControl
TWinControl是有窗体句柄Handle,它才有真正的DC可以绘制图象
TGraphicControl的绘制最终是依靠Parent(TWinControl)的DC
zwjchina 2006-06-27
  • 打赏
  • 举报
回复
恩,zswang说的没错。
zwjchina 2006-06-27
  • 打赏
  • 举报
回复
恩,zswang说的没错。
kongguangming 2006-06-27
  • 打赏
  • 举报
回复
图像采集处理,dshow???
risingsoft 2006-06-27
  • 打赏
  • 举报
回复
to:zwjchina(蒲石)
to:zswang(伴水清清)(专家门诊清洁工)

方案1也就是zwjchina(蒲石)所说的,是可以的。未被覆盖。我试过放一个button和panel上去,都不会被覆盖。检查发现区别是控件的根类不同。
TContorl -> TGraphicControl -> ... -> TImage
TContorl -> TWidgetControl -> ... -> TPanel

那么TGraphicControl与TWidgetControl究竟差别在哪里?会导致一种被覆盖一种不会被覆盖?
王集鹄 2006-06-27
  • 打赏
  • 举报
回复
//这样做的效果是,Image的图象不能透明
这个问题可以通过不规则窗体解决
王集鹄 2006-06-27
  • 打赏
  • 举报
回复
方案1 在原来的Panel上放上一个新的Panel,在新的Panel上放Image
方案2 截获Panel的WM_PAINT消息后绘制Image

不知道是不是和这个情况一样
procedure TForm1.Button1Click(Sender: TObject);
begin
with TControlCanvas.Create do try
Control := Panel1;
FillRect(ClipRect);
TextOut(0, 0, '21312');
Image1.Repaint;
finally
Free;
end;
end;
zwjchina 2006-06-27
  • 打赏
  • 举报
回复
有点麻烦了,如果是VC使用DLL方式进行绘制
最有可能是VC的代码重新设置了Panel的窗口过程(否则不能保证重绘工作)

但是Image实际也是使用的Panel的DC进行绘制的,一个不太好的办法是,你在Panel里面
再放一个Panel,然后在新放的Panel里面放Image。

这样做的效果是,Image的图象不能透明。

就我的角度来看,目前没有想到什么好办法,除非能改一下vc的dll
risingsoft 2006-06-27
  • 打赏
  • 举报
回复
OK。
绘图是调用另外一个VC的DLL。这个DLL负责图像采集处理。我只是调用。现在在它显示的Panel面板上加一个图像标记。这个Panel是Delphi的,由我把句柄提供给DLL。

dll_open(pnlHandle,pchar(fileName));

pnlHandle是pnlMain的Handle,我传递给DLL后,它获得Panel句柄绘图。怎么绘制的就不知道了。fileName是图像文件名。
summersky204608 2006-06-27
  • 打赏
  • 举报
回复
学习一下!
zwjchina 2006-06-27
  • 打赏
  • 举报
回复
"Panel上被程序调用进行绘图"

你的Panel是怎么进行绘图的!,代码我看看

5,392

社区成员

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

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