我在MDI窗口中加了一个jpg的背景图,但在程序运行阶段时我换了一幅,但窗口改变后,背景图不会自动刷新,而且浮于背景图上方的窗口在拉动的时侯,会出现尾巴现象,请问是不是我哪里没做对,以下是我的制作方法:我就是在MDI窗口中加了一个图像控件,然后,用打开图片的控件在程序运行阶段使用户可以改变背景,其它的就没能了,从现象来看,因为只要MDI窗口的大小一改变,背景图的大小是不会变的,好象是背景图没有刷新似的,但要是我在MDI窗口的paint事件中加上刷新图片,那么,程序很费系统资源。请问那位高手能帮我一下。

解决方案 »

  1.   

    这个问题是DELPHI的一个败笔,不过网上有很多相关的文章的:给MDI主窗口加背景--------------------------------------------------------------------------------在MDI程序中,由于MDI的主窗口一般的功能是提供子窗口显示的位置和提供菜单、工具条、状态条等,而窗口的客户区则一般不会有其它的用途,如果在这里画上一些软件的标志、公司的标志或者其它的背景图案的话,不仅可以使MDI的主窗口更加充实、美观,而且还可以更加突出公司的形象和增加公司标志在客户心中的地位。 由于MDI主窗口的特性,使用普通OnPaint和使用TImage等方法都不会产生作用。下面将用编写一个简单的MDI程序来介绍如何实现。 第一步:打开Delphi(Delphi 1,2,3都可以),创建一个新的工程。 
    第二步:将Form1的FormStyle设置为fsMDIForm,设置成MDI的主窗口。 
    第三步:在Form1上增加一个Image元件,并选择要设置的背景到Image的Picture中。 
    第四步:在Form1的Private中定义: 
    FClientInstance, 
    FPrevClientProc : TFarProc; 
    PROCEDURE ClientWndProc(VAR Message: TMessage); 
    第五步:在实现(implementation)中加入上述过程的具体内容: 
    PROCEDURE TForm1.ClientWndProc(VAR Message: TMessage); 
    VAR 
    MyDC : hDC; 
    Ro, Co : Word; 
    begin 
    with Message do 
    case Msg of 
    WM_ERASEBKGND: 
    begin 
    MyDC := TWMEraseBkGnd(Message).DC; 
    FOR Ro := 0 TO ClientHeight DIV Image1.Picture.Height DO 
    FOR Co := 0 TO ClientWIDTH DIV Image1.Picture.Width DO 
    BitBlt(MyDC, Co*Image1.Picture.Width, Ro*Image1.Picture.Height, 
    Image1.Picture.Width, Image1.Picture.Height, 
    Image1.Picture.Bitmap.Canvas.Handle, 0, 0, SRCCOPY); 
    Result := 1; 
    end; 
    else 
    Result := CallWindowProc(FPrevClientProc, ClientHandle, Msg, wParam, lParam); 
    end; 
    end; 第六步:在Form1的创建事件中加入: 
    FClientInstance := MakeObjectInstance(ClientWndProc); 
    FPrevClientProc := Pointer(GetWindowLong(ClientHandle, GWL_WNDPROC)); 
    SetWindowLong(ClientHandle, GWL_WNDPROC, LongInt(FClientInstance)); 上面的步骤已经完成了MDI主窗口背景图案的设置,下面可以增加一个MDIChild窗口,实现MDI程序。 第七步:新增加一个Form,并将FormStyle设置为fsMDIChild。 现在你可以编译运行这个程序,你会发现,Image元件并不会在Form上显示出来,但是整个Form的客户区域被Image中的图像所铺满。 
      

  2.   

    请问你是delphi高手吗,我们能交个朋友吗,等我试一下,行的话,就给你分
      

  3.   

    不行呀,大侠,报这里出错,然后好象进入死循环。。FOR Ro := 0 TO ClientHeight DIV Image1.Picture.Height DO 我用的是delphi6
      

  4.   

    楼上的老兄,我用了那个MDIWALLP的控件了,但这个控件只支持bmp的背景图,你说用哪个控件呢,请告诉我一下好吗。
      

  5.   

    type
      TMdiBkndForm = class(TForm)
        ImgMain: TImage;
      private
        { Private declarations }
        FOldClientProc,FNewClientProc:TFarProc;
        FDrawDC:hDc;
        Procedure ClientWndProc(var Message:TMessage);
        Procedure DrawStretched;
      Protected
        Procedure CreateWnd;Override;
      public
        { Public declarations }
      end;var
      MdiBkndForm: TMdiBkndForm;implementation{$R *.dfm}{ TMdiBkndForm }procedure TMdiBkndForm.ClientWndProc(var Message: TMessage);
    begin
       Case Message.Msg of
          WM_ERASEBKGND:
           begin
              CallWindowProc(FoldClientProc,ClientHandle,Message.Msg,
                            Message.WParam,Message.LParam);
              FDrawDc:=TWMEraseBkGnd(Message).Dc;
              DrawStretched;
              Message.Result:=1;
           end;
          WM_VSCROLL,WM_HSCROLL:
           begin
              Message.Result:=CallWindowProc(FoldClientProc,ClientHandle,
                            Message.Msg,Message.WParam,Message.LParam);
              Invalidaterect(ClientHandle,nil,True);
           end;
          else
            Message.Result:=CallWindowProc(FoldClientProc,ClientHandle,
                            Message.Msg,Message.WParam,Message.LParam);
        end;
    end;procedure TMdiBkndForm.CreateWnd;
    begin
      inherited;
      FNewClientProc:=MakeObjectInstance(ClientWndProc);
      FoldClientProc:=Pointer(GetWindowLong(ClientHandle,GWL_WNDPROC));
      SetWindowLong(ClientHandle,GWL_WNDPROC,Integer(FNewClientProc));
    end;procedure TMdiBkndForm.DrawStretched;
    var
       Cr:TRect;
    begin
       GetWindowRect(ClientHandle,Cr);
       StretchBlt(FDrawDc,0,0,Cr.Right,Cr.Bottom,
                  imgMain.Picture.Bitmap.Canvas.Handle,0,0,
                  imgMain.Picture.Width,imgMain.Picture.Height,SRCCOPY);end;
    给分吧!