【问题标题】:ShowWindow within WM_CREATEWM_CREATE 中的 ShowWindow
【发布时间】:2010-10-30 19:46:36
【问题描述】:

在我看来,窗口过程的 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 的正确方法是什么?

【问题讨论】:

  • 我觉得你在 WM_CREATE 做这样的工作有点早了。
  • 请详细说明一下?除了 WM_CREATE 之外,还有其他我应该处理的后续消息吗?

标签: c winapi


【解决方案1】:

问题是窗口的恢复范围会受此影响。在 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);

这样做你并不领先。

【讨论】:

  • 如前所述,我希望所有代码都存在于 WM_CREATE 消息中。我可以轻松地在 WinMain 中调用 ShowWindow,但我不希望这样。在 WM_CREATE 中重现您的代码后,它并没有解决我的问题。
  • 如前所述,这是行不通的。等待,比如说,WM_PAINT 来修复恢复边界是一种可能的黑客攻击。不解释为什么这是一项要求会阻止我(我们)想出更好的方法。
【解决方案2】:

如果您绝对必须将其保留在 WndProc 中,请尝试

case WM_CREATE:
    PostMessage(hwnd,WM_APP,0,0);
    break;
case WM_APP:
    ShowWindow(hwnd,SW_SHOW);
    break;

但如果这很重要,为什么不使用一个帮助函数来创建窗口并调用 ShowWindow? MyWindowType_Create(...) 等

【讨论】:

    【解决方案3】:

    您能否在第一次恢复窗口时处理WM_WINDOWPOSCHANGED 并覆盖窗口大小?使用GetWindowPlacement 查看窗口是否已恢复。

    【讨论】:

      猜你喜欢
      • 2013-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多