我看到它的方式,使用Window Procedure的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);
...
...
}
所以我设置程序运行Minimized(使用Windows XP我创建了.exe的快捷方式,并相应地设置了它的属性),它显示在任务栏上最小化但是当我点击它时它不会恢复在上面。同样,如果我运行它最大化,当我单击最大化按钮(以取消最大化它)时,它的行为不正确。
在WM_CREATE消息中使用与nCmdShow兼容的ShowWindow的正确方法是什么?
答案 0 :(得分:2)
问题是窗口的恢复边界会受此影响。 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);
你不是这样做的。
答案 1 :(得分:1)
如果您必须将其保留在WndProc中,请尝试
case WM_CREATE:
PostMessage(hwnd,WM_APP,0,0);
break;
case WM_APP:
ShowWindow(hwnd,SW_SHOW);
break;
但是如果这很重要,为什么不只是有一个帮助函数来创建窗口并调用ShowWindow? MyWindowType_Create(...)等
答案 2 :(得分:0)
你可以处理WM_WINDOWPOSCHANGED
并在第一次恢复窗口时覆盖窗口大小吗?使用GetWindowPlacement
查看窗口是否已恢复。