【问题标题】:WM_CREATE doesn't seem to be processed in child windowWM_CREATE 似乎没有在子窗口中处理
【发布时间】:2013-12-12 02:30:56
【问题描述】:

我有一个窗口HWND assignWnd,它是主窗口的子窗口。此窗口似乎不处理 WM_CREATE 消息。例如,这是我的窗口过程中的 WM_CREATE 消息。

case WM_CREATE:
    {
        hdc = GetDC(assignWnd);

        GetTextMetrics(assignWnd,&tm);
        cyChar = tm.tmHeight + tm.tmExternalLeading;

        ReleaseDC(assignWnd,hdc);
        return 0;
    }

变量cyChar 是一个int,并在窗口过程中声明。它稍后在 WM_PAINT 消息中使用。每当我编译程序时,我都会收到一个运行时错误,指出在初始化之前正在使用cyChar。但是,如果我将上述代码放在 WM_PAINT 消息中,程序将按预期工作。

明显的问题是我不希望每次绘制窗口时都进行这些调用。我希望在 WM_CREATE 消息期间处理这些命令(以及稍后的其他命令)。

非常感谢您解释为什么没有在这个子窗口中处理 WM_CREATE 消息。

【问题讨论】:

  • 没关系。我发现问题是“cyChar”没有被声明为静态的,因此它对其他消息无效。
  • 如果这是您的消息处理循环的一部分,它是否是静态的并不重要,因为代码永远不会离开循环。应尽可能避免使用静态变量。
  • 马克,我在窗口过程中和用于处理各种消息的开关(msg)之前声明了它。另外,出于好奇,您为什么建议避免使用静态变量?
  • 它将变量的范围提升到单个函数调用之外,特别是如果它是全局的。这使得通过代码的工作原理进行推理变得更加困难。如果使用得当,这不是一个不可克服的问题。对于这个特定的用例,它可能没有任何区别,但它仍然是一个很好的规则。

标签: c++ winapi


【解决方案1】:

大概cyChar 是窗口过程的本地。这不是WM_CREATE 未被处理的问题,而是您在WM_CREATE 中分配的cyChar 与您在WM_PAINT 中使用的cyChar 不同。您需要将变量设置为全局变量或静态变量,以便它从一次调用窗口过程到另一次调用仍然存在。

【讨论】:

  • 谢谢乔纳森,我在发布后不久就意识到了这一点;但是,由于我的声誉低下,我无法回答我自己的问题!
猜你喜欢
  • 2016-09-02
  • 1970-01-01
  • 2015-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多