我在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吧在线等。

解决方案 »

  1.   

    怎么绘的?
    Panel的Canvas用不了.
      

  2.   

    在作完绘画之后,立刻调用Image.Invalidate;看看能否解决你的问题
      

  3.   

    Image.Invalidate;
    Image.Refresh;
    Image.Repaint;
    Image.Update;这些都试过了,都是Image一闪就消失了。
    我要的效果是Image换图像后正常显示在Panel上
      

  4.   

    "Panel上被程序调用进行绘图"你的Panel是怎么进行绘图的!,代码我看看
      

  5.   

    OK。
    绘图是调用另外一个VC的DLL。这个DLL负责图像采集处理。我只是调用。现在在它显示的Panel面板上加一个图像标记。这个Panel是Delphi的,由我把句柄提供给DLL。dll_open(pnlHandle,pchar(fileName));pnlHandle是pnlMain的Handle,我传递给DLL后,它获得Panel句柄绘图。怎么绘制的就不知道了。fileName是图像文件名。
      

  6.   

    有点麻烦了,如果是VC使用DLL方式进行绘制
    最有可能是VC的代码重新设置了Panel的窗口过程(否则不能保证重绘工作)但是Image实际也是使用的Panel的DC进行绘制的,一个不太好的办法是,你在Panel里面
    再放一个Panel,然后在新放的Panel里面放Image。这样做的效果是,Image的图象不能透明。就我的角度来看,目前没有想到什么好办法,除非能改一下vc的dll
      

  7.   

    方案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;
      

  8.   

    //这样做的效果是,Image的图象不能透明
    这个问题可以通过不规则窗体解决
      

  9.   

    to:zwjchina(蒲石)
    to:zswang(伴水清清)(专家门诊清洁工)   方案1也就是zwjchina(蒲石)所说的,是可以的。未被覆盖。我试过放一个button和panel上去,都不会被覆盖。检查发现区别是控件的根类不同。
       TContorl -> TGraphicControl -> ... -> TImage
       TContorl -> TWidgetControl ->  ... -> TPanel那么TGraphicControl与TWidgetControl究竟差别在哪里?会导致一种被覆盖一种不会被覆盖?
      

  10.   

    TWidgetControl...那是CLX的控件
    VLC中是TWinControl
    TWinControl是有窗体句柄Handle,它才有真正的DC可以绘制图象
    TGraphicControl的绘制最终是依靠Parent(TWinControl)的DC