Win32程序设计(Delphi)- 多文档界面

最近学习Win32程序设计,Delphi实现.

参考书:<<Delphi Win32核心API参考>> 

 Win32程序设计(Delphi)- 多文档界面

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.