我在MDI父窗口中加了一个背景图,是这样布局的:
图片在TPANEL内,以防止闪烁。现在问题是:子窗体显示在图片后面了,有什么办法可以让子窗口显示在图片上面吗?问题解决了,就结贴。各位大哥帮小弟一把,谢谢啦。

解决方案 »

  1.   

    如果去掉TPANEL组件,子窗口是可以显示出来的(图片上面),但那样图片会闪烁。不知道有什么好办法解决MDI主窗体背景图不闪烁且随窗口大小变化时背景图能自动适应窗体大小?
      

  2.   

    放panel就是这样,用lockwindowupdate(handle)锁住;lockwindowupdate(0) 打开
      

  3.   

    NewPrince(Mack狼)能说说具体如何在程序中写吗?我不是很明白。
      

  4.   

    我知道,你用的肯定是DBImage,换Image然后取图就可以了.
      

  5.   

    我用的是TImage组件,用了lockwindowupdate(handle)锁住;lockwindowupdate(0)还是不能解决。我用的是7.0的Delphi,能教教我如何用吗? lockwindowupdate(self.Handle);
      Application.CreateForm(TSVRaddsp, SVRaddsp);//打开MDI子窗口
      spda.Enabled:=false;//按纽变为不可点击
     lockwindowupdate(0);
      

  6.   

    楼主,我试了不用PANEL,是不闪烁的,你是不是用了皮肤控件呀?
      

  7.   

    我在MDI主窗口中放了ControlBar组件,并在该组件内放了一个TOOLBAR组件(目的是使工具条可以像DELPHI工具条那样可以移动的),如果移动,图片就会闪烁且非常的厉害,如果使用语句:self.Brush.Bitmap:=MYBitmap则不会出现上述情况,但主窗口改变大小时,图片不会自动适应主窗体。再次求解。谢谢
      

  8.   

    longtusoft(神灯之主)你使用 PANEL+image组件时子窗口可以show出来吗?
      

  9.   

    显示子窗体的时候用FrmChild.showModal;
      

  10.   

    用下面这段代码就可以在MDI主窗口中放图片了。...
    ...
      private
        { Private declarations }
        FClientInstance, FPrevClientProc : TFarProc;
        procedure ClientWndProc(var Message: TMessage);    
    ...procedure TForm1.FormCreate(Sender: TObject);
    begin
      FClientInstance:= MakeObjectInstance(ClientWndProc);
      FPrevClientProc:= Pointer(GetWindowLong(ClientHandle, GWL_WNDPROC));
      SetWindowLong(ClientHandle, GWL_WNDPROC, LongInt(FClientInstance));
    end;procedure TForm1.ClientWndProc(var Message: TMessage);
    var
      MyDC:hDC;
      Ro,Co:Word;
    begin                                   //在窗体上画背景
      if  message.Msg<>WM_ERASEBKGND then begin
          message.Result := CallWindowProc(FPrevClientProc,ClientHandle, message.Msg,message.wParam,message.lParam);
          exit;
      end;
      MyDC := TWMEraseBkGnd(Message).DC;
      for Ro := 0 to ClientHeight div Image1.Picture.Height do begin
          for Co := 0 TO ClientWIDTH div Image1.Picture.Width do begin
              BitBlt(MyDC, Co*Image1.Picture.Width, Ro*Image1.Picture.Height,
              Image1.Picture.Width, Image1.Picture.Height,
              Image1.Picture.Bitmap.Canvas.Handle, 0, 0, SRCCOPY);
              message.Result:= 1;
          end;
      end;end;
      

  11.   

    楼上的shilinqun(群群)说的应该可以的
      

  12.   

    shilinqun(群群) 不知道能否让您的代码自动适应窗口大小(当调整MDI主窗口时)
      

  13.   

    这段代码可以自己调整大小的,我一直都是用的这个图片在TPANEL内,以防止闪烁。
    --------------------------
    这句话是什么意思?直接放在Image控件里就可以啊(如果你做的是MDI)
    (showmodal)是可以,但那样就违反了我的布局了。
    ----------------------------------------------
    你不是希望子窗体显示在图片上面么?如何违反你的布局
      

  14.   

    Image1.Picture.Height Image1.Picture.Width,这是已经是根据图片的大小来显示了呀。不过这段代码我都存了至少有3年了,现在都没有用过了,所以也不是很清楚了。我想应该是根据图片的大小来显示的。
      

  15.   

    现在只能用self.Brush.Bitmap:=MYBitmap代码了,但可惜的是不能自动适应窗口大小。高手能支支招吗?
      

  16.   

    Image的align属性设为alClient,贴我的 代码给你看看,可以自适应窗体的,不过好像跟上面的一样:
    procedure TFrmMain.FormCreate(Sender: TObject);
    begin
        Image1.Picture.LoadFromFile(extractFilePath(paramStr(0)) + 'photos\world.bmp');
        FClientInstance := MakeObjectInstance(ClientWndProc);
        FPrevClientProc := Pointer(GetWindowLong(ClientHandle, GWL_WNDPROC));
        SetWindowLong(ClientHandle, GWL_WNDPROC, LongInt(FClientInstance));
    end;
    procedure TfrmMain.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;
      

  17.   

    hellolongbin(一个人)、 shilinqun(群群) 我使用了您们的代码,如果不隐藏image1则该组件内的图像会覆盖画上去的图像,给人感觉是可以自动适应窗口大小,这只是IMAGE的Stretch作用(如果缩放窗口会内的图片会有闪烁);如果隐藏IMAGE的话,只会看到画上去的图片,是不能自动适应窗口大小的。还是没有一个完美的解决办法,再顶一下。
      

  18.   

    当然可以啊,你把image的align属性设为alclient,stretch设为true
      

  19.   

    >>>>楼主,我试了不用PANEL,是不闪烁的,你是不是用了皮肤控件呀?是的,我用了SUIPACK组件。我在MDI主窗口中放了ControlBar组件,并在该组件内放了一个TOOLBAR组件(目的是使工具条可以像DELPHI工具条那样可以移动的),如果移动,图片就会闪烁且非常的厉害,如果使用语句:self.Brush.Bitmap:=MYBitmap则不会出现上述情况,但主窗口改变大小时,图片不会自动适应主窗体。