注册窗口类后,MDI应用程序可以创建其窗口。首先,它使用CreateWindow或CreateWindowEx功能创建其框架窗口。创建框架窗口后,应用程序再次使用CreateWindow或CreateWindowEx创建其客户端窗口。应用程序应指定MDICLIENT作??为客户端窗口的类名; MDICLIENT是由Windows定义的预注册窗口类。【lpvParam】或CreateWindowEx的【lpvParam】参数应指向CLIENTCREATESTRUCT结构。此结构包含下表中描述的成员:
会员 | 描述 |
hWindowMenu | 标识用于控制MDI子窗口的窗口菜单。随着子窗口的创建,应用程序将其标题添加到窗口菜单中作为菜单项。然后,用户可以通过从“窗口”菜单中选择其标题来激活子窗口。 |
idFirstChild | 指定第一个MDI子窗口的标识符。创建的第一个MDI子窗口被分配此标识符。使用增加的窗口标识符创建其他窗口。当子窗口被破坏时,Windows会立即重新分配窗口标识符以保持其范围相邻。 |
当窗口菜单中添加子窗口的标题时,Windows会向子窗口分配标识符。当用户选择子窗口的标题时,帧窗口将收到WM_COMMAND参数中的标识符的WM_COMMAND消息。您应该为idFirstChild成员指定与框架窗口菜单中的菜单项标识符不冲突的值。
Multipad的框架窗口过程在处理WM_CREATE消息时创建MDI客户端窗口。以下示例显示如何创建客户端窗口。
case WM_CREATE:
{
CLIENTCREATESTRUCT ccs;
//检索Window菜单的句柄并分配
//第一个子窗口标识符。
ccs.hWindowMenu = GetSubMenu(GetMenu(hwnd), WINDOWMENU);
ccs.idFirstChild = IDM_WINDOWCHILD;
//创建MDI客户端窗口。
hwndMDIClient = CreateWindow( "MDICLIENT", (LPCTSTR) NULL,
WS_CHILD | WS_CLIPCHILDREN | WS_VSCROLL | WS_HSCROLL,
0, 0, 0, 0, hwnd, (HMENU) 0xCAC, hInst, (LPSTR) &ccs);
ShowWindow(hwndMDIClient, SW_SHOW);
}
break;
子窗口的标题被添加到窗口菜单的底部。如果应用程序使用AppendMenu功能将字符串添加到窗口菜单,则当窗口菜单被重新绘制时(每当创建或销毁子窗口时),这些字符串可以被子窗口的标题覆盖。一个向其Window菜单添加字符串的MDI应用程序应该使用InsertMenu函数,并验证子窗口的标题是否未覆盖这些新字符串。
使用WS_CLIPCHILDREN样式创建MDI客户端窗口,以防止窗口在其子窗口上绘制。