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)之前声明了它。另外,出于好奇,您为什么建议避免使用静态变量?它将变量的范围扩大到单个函数调用之外,特别是在全局调用的情况下。这使得通过代码的工作进行推理变得更加困难。如果使用得当,这不是一个无法克服的问题。对于这个特定的用例,它可能不会有任何区别,但它仍然是一个很好的遵循规则;然而,由于我的名声不好,我无法回答我自己的问题!谢谢乔纳森,我在发帖后不久就意识到了这一点;然而,由于我的名声不好,我无法回答我自己的问题!