MDI问题(300分)

  • 主题发起人 主题发起人 Marlowe
  • 开始时间 开始时间
M

Marlowe

Unregistered / Unconfirmed
GUEST, unregistred user!
我想在MDI窗口中放一个背景,上面有按钮和Label,
可Panel在子窗口创建时,会覆盖子窗口。
该怎么做哪?
1必须是MDI
2必须有Label和Button。而且要有代码...
3子窗口不能被覆盖



 
做成浮动窗口行不行?就像Delphi IDE一样。





 
Delphi里面的MDI Form是一个比较特殊的Form, 他在Form的Client区域内加了一个
ClientWindow, 而这个Window不是一个TWinControl, 是通过WinApi函数建立的.
由于该Window的WndProc功能较弱, 不支持你所要的功能.
解决方法是把按钮和label放到ToolBar或者Panel中, 但是Toolbar/panel必须
Align到四个边中的一个. 要想画背景, 可以通过重写它的ClientWndProc过程, 让
他能够画图.

下面式从Delphi 32深度历险中下载过来的 MDI_BKGRD.ZIP 里面的文字说明文件:

HereI are the steps to add a wallpaper to the client area of of a
MDI parent form:

1) Create a new project
2) Set the form's FormStyle to fsMDIForm
3) Drop an image on the form and select a bitmap into it.
4) Find the { Private Declarations } comment in the form's
definition and add these lines right after it:

FClientInstance,
FPrevClientProc : TFarProc;
PROCEDURE ClientWndProc(VAR Message: TMessage);

5) Find the "implementation" line and the {$R *.DFM} line that
follows it. After that line, enter this code:

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;

6) Start an OnCreate method for the form and put these lines in it:

FClientInstance := MakeObjectInstance(ClientWndProc);
FPrevClientProc := Pointer(GetWindowLong(ClientHandle, GWL_WNDPROC));
SetWindowLong(ClientHandle, GWL_WNDPROC, LongInt(FClientInstance));

7) Add a new form to your project and set its FormStyle to
fsMDIChild.

Now you have a working MDI project with "wallpaper". The image
component is not visible, but its bitmap is replicated to cover
the MDI form's client area.

There is still one problem
when you minimize the child window its
icon will be drawn against a gray rectangle.

要提供完整的如同普通TWinControl的功能, 几乎的重写TCustom, 太麻烦了.
 
同意会长的看法, 最多只能给mainform加上背景
像你的提法恐怕要自己写一个外形像,但实际不是MDI FROM 的APPLICATION了

 
我其实是想做一个类似《金蝶》的界面。
 
加背景我有办法。但放其它控件,我试了又试,真不容易。
 
你的要求不太可能达到,是否继续讨论?
 
《金蝶》有按钮及Label的"背景"其实也是一个MDI Form, 只不过最大化了,
试试看, 你也能做到.
 
delphi程序员大本营里有着样的控件,you try
 
你用d5看看能否解决吧。
请继续讨论或结束此问题!
 
加上TPanel,在子窗体Create时TPanel.Visible:=False,
在子窗体OnClose时TPanel.Visible:=True
如有多个子窗体,应判断子窗体是否已全部Close.
 
看来okmy的方法比较好.
 
用Windows API设置PANEL的窗体属性,如SETWINDOWORD, 或用SHOWWINDOW设置PANEL的参数。
 
给你二个关键字
CreateParams
Inheriet
 
多人接受答案了。
 
后退
顶部