【发布时间】: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)之前声明了它。另外,出于好奇,您为什么建议避免使用静态变量?
-
它将变量的范围提升到单个函数调用之外,特别是如果它是全局的。这使得通过代码的工作原理进行推理变得更加困难。如果使用得当,这不是一个不可克服的问题。对于这个特定的用例,它可能没有任何区别,但它仍然是一个很好的规则。