在我工作的Windows应用程序中,我们有一个直接位于Win32上方的自定义框架(不要问).当我们创建一个窗口时,我们通常的做法是将this窗口的用户数据区域放入SetWindowLong(hwnd, GWL_USERDATA, this),这样我们就可以进行类似MFC的回调或紧密集成WndProc.问题是这不适用于Win64,因为LONG只有32位宽.什么是解决这个问题的更好的解决方案适用于32位和64位系统?
我试图在类中声明一个回调函数,然后在某处我读取函数需要是静态的,但它没有解释为什么?
#include <iostream>
using std::cout;
using std::endl;
class Test
{
public:
Test() {}
void my_func(void (*f)())
{
cout << "In My Function" << endl;
f(); //Invoke callback function
}
static void callback_func()
{cout << "In Callback function" << endl;}
};
int main()
{
Test Obj;
Obj.my_func(Obj.callback_func);
}
Run Code Online (Sandbox Code Playgroud) 将winAPI消息回调函数设置为类的方法是否可行.如果是这样,这将如何最好地实施?我想知道它是否有可能.
很抱歉这个简短的问题,希望您能够提供有用的回复.
提前致谢 :).
此文章解释了出色的选项调用类成员的WndProc.我在stackoverflow中看到了这个响应,但是在CreateWindow之后关联类成员WndProc的主要问题是某些消息将丢失(包括重要的WM_CREATE),如上所述.
我的问题:我想听听专家的意见,即下面公开的方法或新方法是最好的(性能,维护性......)来创建一个类成员WndProc.
简要介绍文章中公开的两个最终解决方案(假设它存在一个带WndProc方法的Window类):
具有this全局指针存储的每窗口数据,使用CRITICAL_SECTION保护它以使其线程安全(从此处提取):
// The helper window procedure
// It is called by Windows, and thus it's a non-member function
// This message handler will only be called after successful SetWindowLong call
// We can assume that pointer returned by GetWindowLong is valid
// It will route messages to our member message handler
LRESULT CALLBACK WndProc2(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp) {
// Get …Run Code Online (Sandbox Code Playgroud)