1、EnumChildWindows()函数的作用是向父窗口的所有子窗口按顺序的(枚举)调用回调函数。函数原型
BOOL WINAPI EnumChildWindows(
HWND hWndParent, //父窗口句柄
WNDENUMPROC lpEnumFunc, //回调函数
LPARAM lParam //自定义参数
);
回调函数的返回值将会影响到这个API函数的行为:如果回调函数返回true,则枚举继续直到枚举完成;如果返回false,则将会中止枚举。
回调函数lpEnumFunc的函数类型如下:
BOOL CALLBACK EnumChildProc(HWND hwndChild, LPARAM lParam)。
eg:
如果一个父窗口,当窗口改变大小时,它的子窗口也要跟着改变,可以利用EnumChildWindows()。代码如下:
#define ID_FIRSTCHILD 100
#define ID_SECONDCHILD 101
#define ID_THIRDCHILD 102
LONG APIENTRY MainWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
RECT rcClient;
int i;
switch(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(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;
else
i = 2;
rcParent = (LPRECT) lParam;
MoveWindow(hwndChild,
(rcParent->right / 3) * i,
0,
rcParent->right / 3,
rcParent->bottom,
TRUE);
ShowWindow(hwndChild, SW_SHOW);
return TRUE;
}
WM_CREATE:当调用CreateWindow()或CreateWindowEx()创建窗口的时候系统会发送此消息,该消息在窗口可见之前被处理。消息附加参数wParam:该参数未被使用,lParam:一个指向包含有窗口创建时的信息的CREATESTRUCT类型的结构体指针。
WM_SIZE:当主窗口的客户区部分大小改变时,我们的应用程序将接收到 WM_SIZE 消息。当然该窗口第一次显示时,我们也将接收到该消息。我们应该把缩放编辑控件的动作放到此处。我们要把编辑控件变成和我们的窗口客户区一样大,所以先得要得到父窗口客户区的大小。可以利用函数GetClientRect获得客户区的大小,另一个方法是客户区大小值包含在参数 lParam 中, lParam 的高字部分是客户区的高,低字部分是客户区的宽(利用宏HIWORD和LOWORD分别获得高低位)。然后我们调用 MoveWindow 函数来重新调整编辑控件的大小。如果在WM_SIZE消息的处理中调用SetScrollPos()或MoveWindow()函数对子窗口进行处理,则bRedraw或bRepaint参数应设为非0从而引起窗口重绘。
MoveWindow()函数不仅能够移动窗口的位置,而且能够改变窗口的大小。
SetScrollPos()函数设置指定滚动条中的滚动按钮(滑块)的位置,如果需要,可重绘滚动条以反映出滚动按钮的新位置。
2、EnumWindows/EnumWindowsProc与EnumChildWindows/EnumChildProc类似,该函数枚举所有屏幕上的顶层窗口,并将窗口句柄传递给自定义的回调函数。回调函数回FALSE将停止枚举,否则将继续到所有顶层窗口枚举完为止。