0

这是我的类构造函数:

ActionButton::ActionButton(CallbackFunction function, void* param, HWND parent, int x, int y, int heigth, int width) :
    m_function(function), m_parameters(param), m_window(NULL)
{
    HWND m_window = CreateWindowEx(0, L"Action button", NULL, WS_CHILD | WS_VISIBLE, 
        x, y, width, heigth, parent, NULL, NULL, NULL);

    DWORD dw = GetLastError();

    SetWindowLongPtr(m_window, GWLP_USERDATA, (LONG_PTR)this);
    ShowWindow(m_window, SW_NORMAL);
}

我使用了调试器,发现它可以执行CreateWindowEx(),但是在按 F11 后程序跳出了构造函数(而且我只使用一个线程)。我的代码有问题吗?


CreateWindowEx执行带有参数的窗口过程之后,例如WM_CREATE,因此步骤之后CreateWindowEx不在构造函数中,在执行一些窗口过程回调后,它会返回到构造函数。

4

1 回答 1

3

在执行时,系统在返回之前CreateWindow[Ex]调用与窗口类关联的窗口过程以获得若干消息(WM_GETMINMAXINFOWM_NCCREATEWM_NCCALCSIZE、 )。WM_CREATE虽然窗口过程处理这些消息,GWLP_USERDATA但尚未设置。但是,系统保证它GWLP_USERDATA是零初始化的,因此您可以安全地查询和处理未初始化的GWLP_USERDATA.

如果要在返回GWLP_USERDATA之前设置,则必须使用和处理事件CreateWindow[Ex]设置 CBT 挂钩。这使您可以在使用消息调用窗口过程之前存储附加到 a 的任何数据。SetWindowsHookExHCBT_CREATEWNDHWNDWM_NCCREATE

与您的问题无关,GWLP_USERDATA是相当不可靠的。许多应用程序会在那里存储自己的数据,从而覆盖彼此的数据。由于这似乎是您控制的私有窗口类,您应该在额外窗口内存中分配空间并将您的数据存储在那里。

于 2013-08-29T10:46:18.647 回答