我正在尝试为WM_LBUTTONDOWN消息发生一个事件(仅使用带有随机文本的简单消息框进行测试)。如果它是该过程的同一类的成员,它可以正常工作 - 除非它是虚拟的。嗯,这有用,但我有点需要它是虚拟的,所以我可以在实际的场景中实现它。
我试着查找一些东西,但我并没有真正找到确切的问题。所以,我希望你们能帮助我。我不认为我在这里需要我的代码,因为这是一个相当普遍的问题。
编辑: 哇,我没想到会有这么多答案!对不起,我花了这么长时间才回来。 差不多,我想要做的就是当用户点击窗口时,会弹出一个消息框 - 除了从窗口过程所在的不同的类中执行此操作。
示例:
class One{
// Other stuff
virtual void Function() {}
LRESULT WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam){
// Other messages
case WM_LBUTTONDOWN:
Function();
break;
}
}
class Two : public One{
void Function(){ MessageBoxA(0, "Hi!", "Hello", MB_OK); }
}
这样,我可以用不同的方式实现这个功能。
答案 0 :(得分:5)
抱歉,不能(不是直接):Windows需要C函数,并且不会为您提供this
指针。但是,您可以使用this
存储GWLP_USERDATA
,然后在常规函数中检索它。 (使用Get/SetWindowLongPtr
)。然后,您可以调用虚拟函数。
在幕后,所有Windows编译器都使用vtable进行虚拟调用,但是Windows无法找到并且不能使用该vtable来调用Window过程。