Win32程序设计(Delphi)- 多文档界面
最近学习Win32程序设计,Delphi实现.
参考书:<<Delphi Win32核心API参考>>
program MDIApp;
uses
Windows,
Messages;
var
iMSG: TMsg;
FrameWnd, ClientWnd, ChildWnd: HWND;
const
IDChildWnd = 100; //第一个MID窗口ID
//回调函数
function FrameWndProc(fHWND: HWND; imessage, wParam, lParam: LongInt): LongInt; stdcall;
var
//在建立MDI窗口用到
ClientStruct: TClientCreateStruct;
begin
case imessage of
WM_CREATE:
begin
ClientStruct.hWindowMenu := 0;
ClientStruct.idFirstChild := IDChildWnd;
//建立MDI客户窗口
Clientwnd := CreateWindowEx(0, 'MDIClient', nil, WS_CHILD or WS_CLIPSIBLINGS or
WS_VISIBLE, 0, 0, 0, 0, fHWND, 0, HInstance, @ClientStruct);
if ClientWnd = 0 then
begin
MessageBox(0, '创建MDI客户窗口失败', nil, MB_ICONINFORMATION);
Exit;
end;
end;
WM_DESTROY:
begin
PostQuitMessage(0);
Exit;
end;
end;
//对所有未处理的消息调用系统默认的框架过程
Result := DefFrameProc(fHWND, ClientWnd, imessage, wParam, lParam);
end;
var
WndCls: TWndClass;
begin
// frame主窗口类注册
WndCls.style := CS_HREDRAW or CS_VREDRAW;
WndCls.lpfnWndProc := @FrameWndProc;
WndCls.cbClsExtra := 0;
WndCls.cbWndExtra := 0;
WndCls.hInstance := HInstance;
WndCls.hIcon := LoadIcon(0, IDI_WINLOGO);
WndCls.hCursor := LoadCursor(0, IDC_ARROW);
WndCls.hbrBackground := COLOR_WINDOW;
WndCls.lpszMenuName := nil;
WndCls.lpszClassName := 'FrameClass';
if RegisterClass(WndCls) = 0 then
begin
MessageBox(0, 'Frame类创建失败', nil, MB_ICONWARNING);
Exit;
end;
FrameWnd := CreateWindowEx(0, 'FrameClass', 'Frame Window', WS_OVERLAPPEDWINDOW or WS_CLIPCHILDREN,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 0, 0, HInstance, nil);
if FrameWnd <> 0 then
begin
ShowWindow(FrameWnd, SW_SHOWNORMAL);
UpdateWindow(FrameWnd);
end
else
begin
MessageBox(0, 'Frame窗口创建失败', nil, 48);
Exit;
end;
//子窗口类注册
WndCls.style := CS_HREDRAW or CS_VREDRAW;
WndCls.lpfnWndProc := @DefMDIChildProc;
WndCls.cbClsExtra := 0;
WndCls.cbWndExtra := 0;
WndCls.hInstance := HInstance;
WndCls.hIcon := LoadIcon(0, IDI_WINLOGO);
WndCls.hCursor := LoadCursor(0, IDC_ARROW);
WndCls.hbrBackground := COLOR_WINDOW;
WndCls.lpszMenuName := nil;
WndCls.lpszClassName := 'ChildClass';
if RegisterClass(WndCls) = 0 then
begin
MessageBox(0, 'Child类创建失败', nil, MB_ICONWARNING);
Exit;
end;
ChildWnd := CreateMDIWindow('ChildClass', 'Chilld Window', WS_VISIBLE, CW_USEDEFAULT,
CW_USEDEFAULT, 470, 290, ClientWnd, HInstance, 0);
if ChildWnd <> 0 then
begin
ShowWindow(ChildWnd, SW_SHOWNORMAL);
UpdateWindow(ChildWnd);
end
else
begin
MessageBox(0, 'Child窗口创建失败', nil, MB_ICONWARNING);
Exit;
end;
while GetMessage(iMSG, 0, 0, 0) do
begin
TranslateMessage(iMSG);
DispatchMessage(iMSG);
end;
end.