在MDI中如何防止子窗体在最大化的过程中出现的闪动?(50分)

  • 主题发起人 主题发起人 yangyang2008
  • 开始时间 开始时间
Y

yangyang2008

Unregistered / Unconfirmed
GUEST, unregistred user!
我希望子窗体在打开时便是最大化的,但窗体打开时它首先是常规窗体,然后才最大化。
这个过程出现一点晃动,请问如何解决?
 
试试
form1.DoubleBuffered:=true;
 
我试了,不行。谢了。
 
在设计时设置 MDI子窗口的 windowstate 为 wsMaximized
 
jsxjd正解
 
我设了wsMaximized,但是打开时它并不是立刻最大化,而是先出现
一个常规窗体,然后再自动最大化,这个过程用户是可以看看到的,
有点晃动。
 
我的也是这样,关注,up
 
这个问题我已经解决了。现在又有新问题:我在MDI的主窗体中放置一张图片,
程序如下。但在子窗体的大小发生变化(尤其从最大化到常规时)图片闪得
厉害,请问各位高人有何解决方法。
TFrmMDIMain=Class(TForm)
private
FOldClientProc,
FNewClientProc: TFarProc;
procedure DrawStretched;
procedure ClientWndProc(var Message: TMessage);
protected
procedure CreateWnd; override;
public
end ;

procedure TFrmMDIMain.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;

procedure TFrmMDIMain.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 TFrmMDIMain.CreateWnd;
begin
inherited CreateWnd;
FNewClientProc := MakeObjectInstance(ClientWndProc);
FOldClientProc := Pointer(GetWindowLong(ClientHandle, GWL_WNDPROC));
SetWindowLong(ClientHandle, GWL_WNDPROC, LongInt(FNewClientProc));
end;




 
to yangyang2008:
能不能把你解决的方法公开一下,那么多人关注呢
 
解决的办法:
Perform(WM_SETREDRAW, 0, 0); //锁屏幕
Frm := TChildForm.Create(Self);
Perform(WM_SETREDRAW, 1, 0); //解锁屏幕并重画
RedrawWindow(Handle, nil, 0, RDW_FRAME + RDW_INVALIDATE +
RDW_ALLCHILDREN + RDW_NOINTERNALPAINT);
Frm.Show ;
 
//************************************************************************
// Author: UCSoftware zhnbo.
// 03-20-2001
// ************************************************************************

在你的MDI MainForm中声明变量:MDIWallpaper: TMDIWallpaper;
并在FormCreate中写代码:
MDIWallpaper := TMDIWallpaper.Create(Self);
MDIWallpaper.Picture.LoadFromFile('BackGround.jpg');
MDIWallpaper.Mode := wpStretch;
 
多人接受答案了。
 
后退
顶部