想在MDI子窗体(登陆窗体)上加入背景图片,可是闪烁的很厉害。如果真的让客户使用的话,肯定不行!百度了一段时间了,都是在MDI主窗体上加入背景图片,就是搜索不到在子窗体上的现求方法谢谢!

解决方案 »

  1.   

    设置了窗体的Doublebuffered也一样。
      

  2.   

    楼主真勤奋,下面代码不知道能不能帮到你var
       tmpbk:tbitmap;//tmpbk为临时存储背景 
                     // **** tmpt没有用, 去掉
    begin
      // **** inherited paint;  这句去掉
       canvas.Lock ;
       if forebmp.Empty  then exit;  
           tmpbk:=tbitmap.Create ;
           tmpbk.Width:=width;
           tmpbk.Height:=height;
           tmpbk.PixelFormat:=pf24bit;
           bitblt(tmpbk.canvas.handle, 0, 0, width, height, canvas.handle, 0, 0, SRCCOPY);
          { 所有关于tmpt的操作换成上面一句就够了 
           tmpt:=tbitmap.Create ;
           tmpt.Width:=parent.Width ;
           tmpt.Height:=parent.Height;
           tmpt.Canvas.Handle :=getdc(parent.Handle);//获得parent的hdc
          //拷贝tmpt到tmpbk
           tmpbk.Canvas.CopyRect(rect(0,0,tmpbk.Width ,tmpbk.height),tmpbk.canvas,boundsrect);
           ReleaseDC(parent.Handle ,tmpt.Canvas.Handle  );
           tmpt.Free ; }
          if (not fmaskbmp.Empty) then  //掩模图片是否为空
             copymask(forebmp,fmaskbmp,tmpbk,canvas)//合成前景、背景图片 根据掩模图片
         else
             canvas.StretchDraw(rect(0,0,width,height),forebmp);
        canvas.Unlock ;
        tmpbk.free;      // 漏了这句
    end;
      

  3.   

    又是这种问题。。
    子窗体的 WM_ERASEBKGND消息重新处理一下,使之不用默认颜色清除背景。
    procedure WMEraseBKGnd(var Message:TWMEraseBKGnd);message WM_ERASEBKGND;procedure TForm1.WMEraseBKGnd(var Message:TWMEraseBKGnd);message WM_ERASEBKGND;
    begin
      Message.Result:=1;
    end;
    基本上是这个原因引起的。
    如果还有,那要考虑你的绘制方法了
      

  4.   

    DelphiTeacher正解,试试他的方法
      

  5.   


    能否经我一段重绘背景图片,并在窗体改变大小的时候使图片能够自动适应其窗体大小呢?比如1440*900的背景图片,当窗体变小时,背景图片则能自动缩放为窗体大小,将图片显示完整!效果就和Image1控件中的AutoSize属性为True,还有Stretch属性为True一样!谢谢~!
      

  6.   

    StretchBlt这个方法了。。
    Bitblt不行。。