form.doublebuffered:=true
引起闪烁的主要原因是每次移动的时候,都重新画了一次背景
即默认的灰色,你也可以截掉WMERASEBKGND消息,不重画背景

解决方案 »

  1.   

    呵呵,最好你别用Image了,直接在OnPaint事件中在窗体的Canvas中画图就行了. 这样要消除闪烁,可以先用个Bitmap对象将图片装入,然后一次画出!!
    关于WMERASEBKGND消息的方法我没试过,你试吧,要在窗体中加入
      procedure OnWMERASEBKGND(var msg: TMessage);message WM_ERASEBKGND;
      

  2.   

    不对,好像应是这样,
    窗体的Private部分加入
    procedure OnWMERASEBKGND(var msg: TWMEraseBkgnd);message WM_ERASEBKGND;实现部分加入:
    procedure TForm1.OnWMERASEBKGND(var msg: TWMEraseBkgnd);
    begin
      msg.Result := 1;
    end;
    你试试吧
      

  3.   

    to weizhi(行者):" ( 呵呵,最好你别用Image了,直接在OnPaint事件中在窗体的Canvas中画图就行了.这样要消除闪烁,可以先用个Bitmap对象将图片装入,然后一次画出!!"
    具体如何做?
      

  4.   

    别用Image了,直接在OnPaint事件中在窗体的Canvas中画图就行了. 这样要消除闪烁,可以先用个Bitmap对象将图片装入,然后一次画出!!
    关于WMERASEBKGND消息的方法我没试过,你试吧,要在窗体中加入
      procedure OnWMERASEBKGND(var msg: TMessage);message WM_ERASEBKGND;
      

  5.   

    我要控制画图的范围,比如是一个bevel控件上,按照你们的说法,使用Canvas如何做?
      

  6.   

    int mainjpgw,mainjpgh;
    TJPEGImage *mainjpg=new TJPEGImage();
    mainjpg->LoadFromFile(ClientForm->currentpath+"Image\\songindex.jpg");
    mainjpgw=mainjpg->Width;
    mainjpgh=mainjpg->Height;
    for(int i=0;i<=Width/mainjpgw;i++)
       {
       for(int j=0;j<=Height/mainjpgh;j++)
         {
          Canvas->Draw(i*mainjpgw,j*mainjpgh,mainjpg);
         }
       }      
      delete mainjpg;
    探讨:我将doublebuffered=true;后,关闭form时速度很慢,是什么原因??
      

  7.   

    用BitBlt贴图吧
        函数功能:该函数对指定的源设备环境区域中的像素进行位块(bit_block)转换,以传送到目标设备环境。    函数原型:BOOL BitBlt(HDC hdcDest,int nXDest,int nYDest,int nWidth,int nHeight,HDC hdcSrc,int nXSrc,int nYSrc,DWORD dwRop);    参数:    hdcDest:指向目标设备环境的句柄。    nXDest:指定目标矩形区域左上角的X轴逻辑坐标。    nYDest:指定目标矩形区域左上角的Y轴逻辑坐标。    nWidth:指定源和目标矩形区域的逻辑宽度。    nHeight:指定源和目标矩形区域的逻辑高度。    hdcSrc:指向源设备环境的句柄。    nXSrc:指定源矩形区域左上角的X轴逻辑坐标。    nYSrc:指定源矩形区域左上角的Y轴逻辑坐标。    dwRop:指定光栅操作代码。这些代码将定义源矩形区域的颜色数据,如何与目标矩形区域的颜色数据组合以完成最后的颜色。    下面列出了一些常见的光栅操作代码:    BLACKNESS:表示使用与物理调色板的索引0相关的色彩来填充目标矩形区域,(对缺省的物理调色板而言,该颜色为黑色)。    DSTINVERT:表示使目标矩形区域颜色取反。    MERGECOPY:表示使用布尔型的AND(与)操作符将源矩形区域的颜色与特定模式组合一起。    MERGEPAINT:通过使用布尔型的OR(或)操作符将反向的源矩形区域的颜色与目标矩形区域的颜色合并。    NOTSRCCOPY:将源矩形区域颜色取反,于拷贝到目标矩形区域。    NOTSRCERASE:使用布尔类型的OR(或)操作符组合源和目标矩形区域的颜色值,然后将合成的颜色取反。    PATCOPY:将特定的模式拷贝到目标位图上。    PATPAINT:通过使用布尔OR(或)操作符将源矩形区域取反后的颜色值与特定模式的颜色合并。然后使用OR(或)操作符将该操作的结果与目标矩形区域内的颜色合并。    PATINVERT:通过使用XOR(异或)操作符将源和目标矩形区域内的颜色合并。    SRCAND:通过使用AND(与)操作符来将源和目标矩形区域内的颜色合并。    SRCCOPY:将源矩形区域直接拷贝到目标矩形区域。    SRCERASE:通过使用AND(与)操作符将目标矩形区域颜色取反后与源矩形区域的颜色值合并。    SRCINVERT:通过使用布尔型的XOR(异或)操作符将源和目标矩形区域的颜色合并。    SRCPAINT:通过使用布尔型的OR(或)操作符将源和目标矩形区域的颜色合并。    WHITENESS:使用与物理调色板中索引1有关的颜色填充目标矩形区域。(对于缺省物理调色板来说,这个颜色就是白色)。    返回值:如果函数成功,那么返回值非零;如果函数失败,则返回值为零。    Windows NT:若想获取更多错误信息,请调用GetLastError函数。    备注:如果在源设备环境中可以实行旋转或剪切变换,那么函数BitBlt返回一个错误。如果存在其他变换(并且目标设备环境中匹配变换无效),那么目标设备环境中的矩形区域将在需要时进行拉伸、压缩或旋转。    如果源和目标设备环境的颜色格式不匹配,那么BitBlt函数将源场景的颜色格式转换成能与目标格式匹配的格式。当正在记录一个增强型图元文件时,如果源设备环境标识为一个增强型图元文件设备环境,那么会出现错误。如果源和目标设备环境代表不同的设备,那么BitBlt函数返回错误。    Windows CE:在Windows CE 1.0版中,参数dwRop只可以指定为下列值:SRCCOPY、SRCAND、SRCPAINT、SRCINVERT。在Windows CE 2.0版中,参数dwRop可以是任何光栅操作代码值。    速查:Windows NT:3.1及以上版本;Windows:95及以上版本;Windows CE:1.0及以上版本;头文件:wingdi.h;库文件:gdi32.lib。
      

  8.   

    是呀,用bitmap装入位图,然后用canvas.copyrect 方法直接在窗体上绘图,
    但速度还是不够快,只有用directx了,但我还不会。