C++ WM#U创建不';t似乎在子窗口中处理
我有一个窗口C++ WM#U创建不';t似乎在子窗口中处理,c++,winapi,C++,Winapi,我有一个窗口HWND assignWnd,它是主窗口的子窗口。此窗口似乎没有处理WM_CREATE消息。例如,下面是在我的窗口过程中创建WM_消息 case WM_CREATE: { hdc = GetDC(assignWnd); GetTextMetrics(assignWnd,&tm); cyChar = tm.tmHeight + tm.tmExternalLeading; ReleaseDC(assign
HWND assignWnd
,它是主窗口的子窗口。此窗口似乎没有处理WM_CREATE消息。例如,下面是在我的窗口过程中创建WM_消息
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
是窗口过程的本地部分。这不是WM\u CREATE
没有被处理的问题,而是在WM\u CREATE
中指定的cyChar
与在WM\u PAINT
中使用的cyChar
不同。您需要将变量设置为全局变量或静态变量,以便它能够在对窗口过程的一次调用到另一次调用中存活。大概cyChar
是窗口过程的局部变量。这不是WM\u CREATE
没有被处理的问题,而是在WM\u CREATE
中指定的cyChar
与在WM\u PAINT
中使用的cyChar
不同。您需要将变量设置为全局变量或静态变量,以便它能够在对窗口过程的一次调用到另一次调用中幸存下来。Nevermind。我发现问题在于“cyChar”不是声明为静态的,因此它对其他消息无效。如果这是消息处理循环的一部分,那么它是否是静态的就无关紧要了,因为代码从未离开循环。如果可能的话,应该避免使用静态变量。Mark,我在window过程中和用于处理各种消息的开关(msg)之前声明了它。另外,出于好奇,您为什么建议避免使用静态变量?它将变量的范围扩大到单个函数调用之外,特别是在全局调用的情况下。这使得通过代码的工作进行推理变得更加困难。如果使用得当,这不是一个无法克服的问题。对于这个特定的用例,它可能不会有任何区别,但它仍然是一个值得遵循的好规则。我发现问题在于“cyChar”不是声明为静态的,因此它对其他消息无效。如果这是消息处理循环的一部分,那么它是否是静态的就无关紧要了,因为代码从未离开循环。如果可能的话,应该避免使用静态变量。Mark,我在window过程中和用于处理各种消息的开关(msg)之前声明了它。另外,出于好奇,您为什么建议避免使用静态变量?它将变量的范围扩大到单个函数调用之外,特别是在全局调用的情况下。这使得通过代码的工作进行推理变得更加困难。如果使用得当,这不是一个无法克服的问题。对于这个特定的用例,它可能不会有任何区别,但它仍然是一个很好的遵循规则;然而,由于我的名声不好,我无法回答我自己的问题!谢谢乔纳森,我在发帖后不久就意识到了这一点;然而,由于我的名声不好,我无法回答我自己的问题!