WM_CREATE中的ShowWindow

时间:2010-10-30 19:46:37

标签: c winapi

我看到它的方式,使用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的正确方法是什么?

3 个答案:

答案 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查看窗口是否已恢复。