子窗口
全局变量
int idFocus = 0; // 判断哪个窗口被选中焦点
每个子窗口都有自己的窗口过程
main
LRESULT CALLBACK ChildWndProc(HWND, UINT, LPARAM, WPARAM);
static szClildClass = TEXT("CHILD");
wndclass.lpfnWndProc = ChildWndProc;
wndclass.cbWndExtra = sizeof(long); // 预留的格外空间
wndclass.hIcon = NULL;
wndclass.lpszClassName = szChildClass;
RegisterClass(&wndclass); // 为子窗口注册窗口类
主窗口窗口过程:
static HWND hwndChild[][]; // 存放子窗口的句柄
int cyBlock, cyBlock, x, y;
case WM_CREATE:
// 创建子窗口
for (x = 0; x < ; x++)
{
for (y = 0; y < ; y++)
{
hwnd[x][y] = CreateWindow(szChildClass,
NULL,
WS_CHILD | WS_VISIBLE,
0, 0, 0, 0,
hwnd,
(HMENU)(y << 8 | x), // 子窗口的ID, 不允许相同即可, 将y设置为ID的前8位, x设置为ID的后8位
(HINSTANCE)GetWindowLongPtr(hwnd, GWL_HINSTANCE),
NULL);
}
}
return 0;
case WM_SIZE:
// 当主窗口大小变化, 可以修改子窗口的位置和尺寸
MoveWindow();
return 0;
case WM_SETFOCUS:
SetFocus(GetDlgItem(hwnd, idFocus)); // 给子窗口焦点
基于一个窗口类,窗口过程是相同的
LRESULT CALLBACK ChildWndProc(HWND hwnd, UINT unit, LPARAM lParam, WPARAM wParam)
{
HDC hdc;
PAINTSTRUCT ps;
RECT rect;
switch (message)
{
case WM_CREATE:
SetWindowLongPtr(hwnd, 0, 0); // 初始化没被选中
return 0;
case WM_LBUTTONDOWN:
SetWindowLongPtr(hwnd, 0, 1 ^ GetWindowLongPtr(hwnd, 0)); // 判断窗口是否被点中, 1为选中
return 0;
case WM_PAINT:
return 0;
case WM_KEYDOWN:
if ()
{
SendMessage(GetParent(hwnd), message, wParam, lParam); // 将消息返回给主窗口
}
else
{
}
return 0;
case WM_SETFOCUS: // 获得焦点
idFocus = GetWindowLongPtr(hwnd, GWL_ID); // 获取子窗口的ID
case WM_KILLFOCUS: // 失去焦点
InvalidateRect(hwnd, NULL, TRUE); // 刷新窗口
return 0;
}
return DefWindowProc(hwnd, uint, lParam, wParam);
}