您的位置:首页 > 其它

枚举子窗口EnumChildWindows()的应用

2016-06-28 16:04 351 查看
1、
EnumChildWindows()函数的作用枚举子窗口(按顺序调用回调函数,并将子窗口的句柄传递给了回调函数)。函数原型:

BOOL WINAPI EnumChildWindows(
HWND hWndParent, //父窗口句柄
WNDENUMPROC lpEnumFunc, //回调函数
LPARAM lParam //自定义参数
);
回调函数的返回值将会影响到这个API函数的行为:如果回调函数返回true,则枚举继续直到枚举完成;如果返回false,则将会中止枚举

。函数原型如下:

BOOL CALLBACK EnumChildProc(HWND hwndChild,//子窗口句柄
LPARAM lParam //参数
)。

应用举例1:一个父窗口,当窗口改变大小时它的子窗口也要跟着改变,可以利用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;
}


MoveWindow()函数不仅能够移动窗口的位置,而且能够改变窗口的大小。

应用举例2:一个父窗口,当窗口移动时它的子窗口也要跟着移动位置,也可以利用EnumChildWindows()。

2、
EnumWindows()函数枚举屏幕上所有的顶层窗口,并将窗口句柄传递给自定义的回调函数。与EnumChildWindows类似,回调函数返回FALSE

将停止枚举,否则将继续到所有顶层窗口枚举完为止。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: