在我看来,窗口过程的WM_CREATE消息的一个用途是减轻调用者在窗口初始化时执行静态代码的负担。我的窗口是执行WM_CREATE消息中的一些代码,包括ShowWindow函数。我还希望ShowWindow能够根据WinMain中的nCmdShow参数正常运行。下面是伪代码,用来展示我是如何进行设置的:
int g_nCmdShow;
WinMain(..., int nCmdShow)
{
g_nCmdShow = nCmdShow;
...
CreateWindow(..., WM_OVERLAPPEDWINDOW, ...)
...
}
WndProc()
{
...
WM_CREATE:
...
ShowWindow(hWnd, g_nCmdShow);
...
...
}因此,我将程序设置为最小化运行(使用Windows XP,我创建了一个指向.exe的快捷方式,并相应地设置了它的属性),它显示在最小化的任务栏上,但当我单击它时,它不会恢复。同样,如果我将其最大化,当我单击最大化按钮(取消最大化)时,它也不会正确运行。
在WM_CREATE消息中使用与nCmdShow兼容的ShowWindow的正确方式是什么?
发布于 2010-10-31 04:17:15
问题是窗口的恢复范围会受此影响。在WM_CREATE返回后,它们变成了窗口的大小。您将不得不修改您的代码来重新建立这些恢复边界:
hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, 300, 200, NULL, NULL, hInstance, NULL);
WINDOWPLACEMENT wp;
GetWindowPlacement(hWnd, &wp); // <= Note wp.rcNormalPosition after this call!
RECT rc = {100, 100, 400, 300};
wp.rcNormalPosition = rc;
SetWindowPlacement(hWnd, &wp);你这样做是不会领先的。
发布于 2010-10-31 09:07:13
如果您一定要将其保存在WndProc中,请尝试
case WM_CREATE:
PostMessage(hwnd,WM_APP,0,0);
break;
case WM_APP:
ShowWindow(hwnd,SW_SHOW);
break;但是如果这很重要,为什么不使用一个辅助函数来创建窗口并调用ShowWindow呢?MyWindowType_Create(...)等
发布于 2010-10-31 04:35:18
您可以处理WM_WINDOWPOSCHANGED并在第一次恢复窗口时覆盖窗口大小吗?使用GetWindowPlacement找出窗口是否已恢复。
https://stackoverflow.com/questions/4060380
复制相似问题