创建框架和子窗口

【勇芳软件工作室】汉化HomePreviousNext

注册窗口类后,MDI应用程序可以创建其窗口。首先,它使用CreateWindowCreateWindowEx功能创建其框架窗口。创建框架窗口后,应用程序再次使用CreateWindowCreateWindowEx创建其客户端窗口。应用程序应指定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客户端窗口,以防止窗口在其子窗口上绘制。