你不用调用Image1.Invalidate,你在Image.Canvas上画图后它会自动调用.而这个函数会导致它所在的TWinControl重绘背景,引发闪烁.由于Image是个GraphicControl,所以是由它的父控件重画背景,难以取消.
你可以这样试试:
Component|New Component...
0A在New Component对话框中:
Ancestor type中选择TCustomControl
Class Name中填写TWinImage
点击Install...
然后打开TWinImage的单元,再打开extctrls.pas(在...\Dephi5或6\Source\Vcl),把TImage的类声明和实现代码复制过来,代替TWinImage中的相应代码,再把所有的TImage替换成TWinImage.
然后为TWinImage增加一个函数:
procedure WMEraseBkgnd(var Message:TMessage);message WM_ERASEBKGND;
在其实现中什么也不写(尤其不要写inherited).
最后编译你的控件,用它来代替Image.

解决方案 »

  1.   

    MyRgn := CreateRectRgn((ACol-1)*16,(ARow-1)*16,ACol*16,ARow*16);
        SelectClipRgn(form1.Image1.Canvas.Handle,MyRgn);
        form1.imagelist1.draw(Form1.image1.Canvas, (ACol-1)*16,(ARow-1)*16,Flag);
        SelectClipRgn(form1.Image1.Canvas.Handle,hrgn(nil));
        DeleteObject(MyRgn);
      

  2.   

    谢谢大家指点,结贴了!
    我自己也找到了一个解决的办法,跟大家共享一下:
    procedure Draws(ACol,ARow,Flag:Integer);
    var MyRgn:HRGN;
    begin
        MyRgn := CreateRectRgn((ACol-1)*16-1,(ARow-1)*16-1,ACol*16+1,ARow*16+1);
        form1.imagelist1.draw(Form1.image1.Canvas, (ACol-1)*16,(ARow-1)*16,Flag);
        windows.InvalidateRgn(form1.Panel2.Handle,MyRgn,true);
    end;