要创建MDI子窗口,应用程序可以调用CreateMDIWindow函数或发送WM_MDICREATE消息到MDI客户端窗口。(应用程序可以使用带有WS_EX_MDICHILD样式的CreateWindowEx函数来创建MDI子窗口。)单线程MDI应用程序可以使用任一方法创建子窗口。多线程MDI应用程序中的线程必须使用CreateMDIWindow或CreateWindowEx函数在不同的线程中创建子窗口。
WM_MDICREATE消息的【lParam的】参数是指向MDICREATESTRUCT结构的远程指针。该结构包括四个维度成员:x和y,它们表示窗口的水平和垂直位置,cx和cy表示窗口的水平和垂直范围。任何这些成员可以由应用程序显式分配,或者可以设置为CW_USEDEFAULT,在这种情况下,Windows根据级联算法选择位置,大小或两者。在任何情况下,所有四个成员必须被初始化。Multipad对所有维度使用CW_USEDEFAULT。
MDICREATESTRUCT结构的最后一个成员是样式成员,可能包含窗口的样式位。要创建可以具有任何窗口样式组合的MDI子窗口,请指定MDIS_ALLCHILDSTYLES窗口样式。当未指定此样式时,MDI子窗口具有WS_MINIMIZE,WS_MAXIMIZE,WS_HSCROLL和WS_VSCROLL样式作为默认设置。
Multipad通过使用其本地定义的AddFile函数(位于源文件MPFILE.C)中创建其MDI子窗口。AddFile函数通过将窗口的MDICREATESTRUCT结构的szTitle成员分配给要编辑的文件的名称或“Untitled”来设置子窗口的标题。 szClasspl成员设置为在Multipad的InitializeApplication函数中注册的MDI子窗口类的名称。hOwner成员设置为应用程序的实例句柄。
以下示例显示Multipad中的AddFile函数。
HWND APIENTRY AddFile(pName)en
CHAR * pName;
{
HWND hwnd;
CHAR sz[160];
MDICREATESTRUCT mcs;
if(!pName){en
//如果pName参数为NULL,则加载“Untitled”
// string from the STRINGTABLE资源并设置szTitle
// MDICREATESTRUCT的会员
LoadString(hInst, IDS_UNTITLED, sz, sizeof(sz));
mcs.szTitle = (LPCTSTR) sz;
}
其他
//标题具有完整路径和文件名的窗口,
//通过调用OpenFile函数获得
// OF_PARSE标志,在AddFile()之前调用。
mcs.szTitle = of.szPathName;
mcs.szClass = szChild;
mcs.hOwner = hInst;
//使用子窗口的默认大小。
mcs.x = mcs.cx = CW_USEDEFAULT;
mcs.y = mcs.cy = CW_USEDEFAULT;
//将子窗口赋予默认样式。styleDefault
//变量在MULTIPAD.C中定义。
mcs.style = styleDefault;
//告诉MDI客户机窗口创建子窗口。
hwnd = (HWND) SendMessage (hwndMDIClient, WM_MDICREATE, 0,
(LONG) (LPMDICREATESTRUCT) &mcs);
//如果找到该文件,请将其内容读入该小孩
//窗口的客户区。
if(pName){en
if(!LoadFile(hwnd,pName)){
//无法加载文件;关闭窗口。
SendMessage(hwndMDIClient,WM_MDIDESTROY,
(DWORD) hwnd, 0L);
}
}
return hwnd;
}
在WM_MDICREATE消息的【lParam的】参数中传递的指针传递给CreateWindow功能,并显示为CREATESTRUCT结构中的第一个成员,在WM_CREATE消息中传递。在Multipad中,子窗口在WM_CREATE消息处理期间通过初始化其额外数据中的文档变量并创建编辑控件的子窗口来初始化自身。