我正在使用Win32 API,以及一些包装本机Win32 API函数的C++类,并管理窗口和应用程序本身。
因此,我还需要窗口过程(WndProc()
)来获取和处理一些消息。
为了处理这些消息,我使用类实例指针访问类的一些成员函数:
Window* this_window = (Window*)GetWindowLongPtr(hWnd, GWLP_USERDATA);
但这里我有一个问题,可能不是问题,但我不确定C++标准是如何定义这种情况的。我使用CREATESTRUCT
结构将this
指针保存在创建窗口的成员函数中。最后一个参数保存this
指针:
CreateWindowExW(dwExStyle, lpClassName, lpWindowName, dwStyle, x, y, width, height, hWndParent, hMenu, hInstance, this);
对于此方法,this
指针不得更改。如果是这样,我将使用WndProc()
函数中的无效指针。
我可以相信this
指针不会改变吗?
指针不会改变,但您必须确保它一开始就指向正确的东西。
CreateWindowEx()
的lpParam
参数是void*
,因此它将按原样接受任何指针。但是,您的WndProc()
需要一个Window*
指针,因此请确保您首先存储的是Window*
指针。
例如,如果在从Window
派生的类MyWindow
中调用CreateWindowEx()
,则this
将是MyWindow*
而不是Window*
。根据MyWindow
的实际实现方式,指向相同MyWindow
对象的Window*
指针和MyWindow*
指针不能保证指向相同的内存地址。因此,在将this
传递给SetWindowLongPtr(GWLP_USERDATA)
之前,您应该将其从MyWindow*
向上转换为Window*
,例如:
CreateWindowExW(..., static_cast<Window*>(this));
或者:
CreateWindowExW(..., this);
...
Window* this_window = static_cast<MyWindow*>(pcs->lpCreateParams);
SetWindowLongPtr(..., reinterpret_cast<LONG_PTR>(this_window));
...