为什么构造函数不使用WinAPI执行所有代码?

时间:2013-08-29 08:46:03

标签: c++ windows winapi constructor

这是我的类构造函数:

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);
}

我使用了debuger并发现它执行CreateWindowEx()但是在按下F11程序之后跳出了构造函数(我只使用了一个线程)。我的代码有问题吗?


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

1 个答案:

答案 0 :(得分:3)

在执行CreateWindow[Ex]时,系统会调用与窗口类相关联的窗口过程,以获取多条消息(WM_GETMINMAXINFOWM_NCCREATEWM_NCCALCSIZEWM_CREATE)它返回。窗口过程处理这些消息时,GWLP_USERDATA尚未设置。但是,系统保证GWLP_USERDATA是零初始化的,因此您可以安全地查询和处理未初始化的GWLP_USERDATA

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

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