我在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吧在线等。
代码://定义
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吧在线等。
解决方案 »
- 关于图片框画线的问题
- 请问引用调用和原值调用的区别,用下面的实例解释,谢谢啦先@^@
- 简单的数据库问题
- delphi 7 与 RealOne播放器冲突???
- delphi中调用外部程序(ShellExecute)为什么老说没有定义呀,各位帮忙解释一下!
- 谁有DELPHI Professional 的序列号和注册码阿??在线求帮!!
- 请问TADODataSet为什么没有执行语句?? 在线等待! 急。
- 再次请教各位高手:怎样动态加载窗体?
- 关于Oracle存储过程的问题[400分]
- 帮我看一下这段程序是否有问题?
- group by 为什么不能执行???
- 解释一下(((SENDER AS TCHECKBOX).NAME)[10])什么意思
Panel的Canvas用不了.
Image.Refresh;
Image.Repaint;
Image.Update;这些都试过了,都是Image一闪就消失了。
我要的效果是Image换图像后正常显示在Panel上
绘图是调用另外一个VC的DLL。这个DLL负责图像采集处理。我只是调用。现在在它显示的Panel面板上加一个图像标记。这个Panel是Delphi的,由我把句柄提供给DLL。dll_open(pnlHandle,pchar(fileName));pnlHandle是pnlMain的Handle,我传递给DLL后,它获得Panel句柄绘图。怎么绘制的就不知道了。fileName是图像文件名。
最有可能是VC的代码重新设置了Panel的窗口过程(否则不能保证重绘工作)但是Image实际也是使用的Panel的DC进行绘制的,一个不太好的办法是,你在Panel里面
再放一个Panel,然后在新放的Panel里面放Image。这样做的效果是,Image的图象不能透明。就我的角度来看,目前没有想到什么好办法,除非能改一下vc的dll
方案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;
这个问题可以通过不规则窗体解决
to:zswang(伴水清清)(专家门诊清洁工) 方案1也就是zwjchina(蒲石)所说的,是可以的。未被覆盖。我试过放一个button和panel上去,都不会被覆盖。检查发现区别是控件的根类不同。
TContorl -> TGraphicControl -> ... -> TImage
TContorl -> TWidgetControl -> ... -> TPanel那么TGraphicControl与TWidgetControl究竟差别在哪里?会导致一种被覆盖一种不会被覆盖?
VLC中是TWinControl
TWinControl是有窗体句柄Handle,它才有真正的DC可以绘制图象
TGraphicControl的绘制最终是依靠Parent(TWinControl)的DC