您可以通过使用子窗口将窗口的客户区划分为不同的功能区。创建子窗口就像创建一个主窗口__你使用CreateWindowEx函数。要创建一个应用程序定义的窗口类的窗口,您必须注册窗口类,并在创建子窗口之前提供一个窗口过程。您必须给子窗口WS_CHILD样式,并在创建子窗口时指定父窗口。
以下示例通过创建相同大小的三个子窗口将应用程序的主窗口的客户端区域分为三个功能区域。每个子窗口与主窗口的客户区域的高度相同,但每个窗口宽度的三分之一。主窗口响应于主窗口在其自己的窗口创建过程中接收的WM_CREATE消息创建子窗口。因为每个子窗口具有WS_BORDER样式,每个子窗口都有一个细线边框。另外,因为没有指定WS_VISIBLE样式,所以每个子窗口最初被隐藏。还要注意,每个子窗口都被分配一个子窗口标识符。
主窗口大小并定位子窗口以响应WM_SIZE消息,主窗口在其大小更改时接收。响应WM_SIZE,主窗口使用GetWindowRect函数检索其客户区域的维度,然后将维度传递给EnumChildWindows函数。EnumChildWindows将每个子窗口的句柄依次传递给应用程序定义的EnumChildProc回调函数。此函数通过调用MoveWindow函数来调整每个子窗口的位置和位置。大小和位置基于主窗口的客户区域的尺寸和子窗口的标识符。之后,EnumChildProc调用ShowWindow函数使窗口可见。
#define ID_FIRSTCHILD 100
#define ID_SECONDCHILD 101
#define ID_THIRDCHILD 102
LONG APIENTRY MainWndProc(hwnd,uMsg,wParam,lParam)
HWND hwnd;
UINT uMsg;
UINT wParam;
LONG lParam;
{
RECT rcClient;
int i;
开关(uMsg){
case WM_CREATE: //创建主窗口
//创建三个不可见的子窗口。
for (i = 0; i < 3; i++)
CreateWindowEx(
0,
"ChildWClass",
(LPCTSTR) NULL,
WS_CHILD | WS_BORDER,
0,0,0,0,
HWND,
(HMENU)(int)(ID_FIRSTCHILD + i),
HINST,
NULL);
return 0;
case WM_SIZE: //主窗口改变大小
//获取主窗口客户端的维度
//区域,并枚举子窗口。通过
//枚举期间子窗口的维度。
GetClientRect(hwnd, &rcClient);
EnumChildWindows(hwnd,EnumChildProc,
(LPARAM) &rcClient);
return 0;
.
. //处理其他消息。
.
}
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
BOOL CALLBACK EnumChildProc(hwndChild, lParam)
HWND hwndChild;
LPARAM lParam;
{
LPRECT rcParent;
int i, idChild;
//检索子窗口标识符。用它来设置
//子窗口的位置。
idChild = GetWindowLong(hwndChild, GWL_ID);
if (idChild == ID_FIRSTCHILD)
i = 0;
else if (idChild == ID_SECONDCHILD)
i = 1;
其他
i = 2;
//大小并定位子窗口。
rcParent = (LPRECT) lParam;
MoveWindow(hwndChild,
(rcParent- > right / 3)*我,
0,
rcParent- > right / 3,
rcParent- >底部,
TRUE);
//确保子窗口可见。
ShowWindow(hwndChild, SW_SHOW);
return TRUE;
}