Я работаю только с приложением WinAPI.Я хочу создать дочернее окно STATIC, которое будет использоваться в качестве «контейнера» для дочерних элементов управления.В примерах, которые я нашел до сих пор, создается окно «контейнера», перехватывающее WM_CREATE в процедуре главного окна.Я предположил, что лучшее место для создания дочерних элементов управления дочерним окном - перехват WM_CREATE для дочернего окна.Чтобы сделать это, мне сначала нужно создать подкласс дочернего окна, чтобы указать на новую оконную процедуру.Дело в том, что окно создается до его подкласса, поэтому WM_CREATE отправляется исходной процедуре, а не моей пользовательской процедуре.Конечно, я могу создать дочерние элементы управления после создания дочернего статического окна в процедуре главного окна, но я не считаю, что это лучший способ сделать это.Какой вариант лучше?
Рабочий пример кода:
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_CREATE:
{
HWND hContainer = CreateWindow(WC_STATIC, L"Container", WS_CHILD, 0, 0, 100, 50, hWnd, (HMENU)ID_CONTAINER, NULL, NULL);
WNDPROC wpOldProc = (WNDPROC)SetWindowLongPtr(hContainer, GWLP_WNDPROC, (LONG_PTR)ChildWindowProc);
HWND hButton = CreateWindow(WC_BUTTON, L"Button", WS_CHILD | BS_PUSHBUTTON, 0, 0, 20, 10, hContainer, (HMENU)ID_BUTTON, NULL, NULL); // This works well
}
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
INT_PTR CALLBACK ChildWindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_CREATE:
{
// HWND hButton = CreateWindow(WC_BUTTON, L"Button", WS_CHILD | BS_PUSHBUTTON, 0, 0, 20, 10, hContainer, (HMENU)ID_BUTTON, NULL, NULL);
// This point is never reached because the WM_CREATE message is sent before subclassing of the window
}
break;
default:
break;
}
return CallWindowProc(gsHdl.wpTE, hWnd, message, wParam, lParam);
}