gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 00:41:51 25 4
gpt4 key购买 nike

这是我的类构造函数:

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 之后的步骤不在构造函数中,在执行几个窗口之后过程回调它返回到构造函数。

最佳答案

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

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

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

关于c++ - 为什么构造函数不使用 WinAPI 执行所有代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18506180/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com