典型的模式是在消息回调(WndProc
)中通过消息WM_CREATE
创建子窗口:
LRESULT APIENTRY WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {
...
switch (message) {
case WM_CREATE:
....
hwndChild[i] = CreateWindow (szChildClass[i], NULL, WS_CHILDWINDOW | WS_BORDER ...
我完全理解这是一个很好的机会,但是以后随时都可以解决这个问题吗?这样做的一个原因是子窗口是在同一个线程中创建的。但还有其他原因吗?
在同一个线程(作为父线程)中创建子窗口有多重要?截至“Can a child thread of parent GUI dialog thread create a child window?”,这似乎不是一般问题?
答案 0 :(得分:1)
稍后创建子窗口没有问题,但正如您所提到的,它应该从同一个线程创建。
例如,您可以在WM_COMMAND消息处理程序中创建子窗口(例如,当用户单击按钮时)或作为对WM_TIMER的响应。
从另一个线程创建子窗口是个坏主意,因为每个线程都有自己的消息队列。但是,如果您希望另一个线程启动创建窗口,您可以通过向窗口发送用户定义的消息来解决此问题:
从另一个帖子发布到你的窗口:
PostMessage(g_hWnd, WM_CREATEMYWINDOW, 0, 0);
在窗口过程中创建子窗口:
if (message == WM_CREATEMYWINDOW)
hwndChild[i] = CreateWindow(...);