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
將停止枚舉,否則將繼續到所有頂層窗口枚舉完為止。
