这是我的类构造函数:
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>
答案 0 :(得分:3)
在执行CreateWindow[Ex]
时,系统会调用与窗口类相关联的窗口过程,以获取多条消息(WM_GETMINMAXINFO
,WM_NCCREATE
,WM_NCCALCSIZE
,WM_CREATE
)它返回。窗口过程处理这些消息时,GWLP_USERDATA
尚未设置。但是,系统保证GWLP_USERDATA
是零初始化的,因此您可以安全地查询和处理未初始化的GWLP_USERDATA
。
如果要在GWLP_USERDATA
返回之前设置CreateWindow[Ex]
,则必须使用SetWindowsHookEx
设置CBT挂钩并处理HCBT_CREATEWND
事件。这使您可以在使用HWND
消息调用窗口过程之前存储附加到WM_NCCREATE
的任何数据。
与您的问题无关,GWLP_USERDATA
相当不可靠。很多应用程序会在那里存储自己的数据,覆盖彼此的数据。由于这似乎是您控制的私有窗口类,因此您应该在Extra Window Memory中分配空间并将数据存储在那里。