有没有办法将WndProc包装为私有成员?
如果我有这个:
class Window
{
public:
Window();
virtual ~Window();
void create();
private:
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
};
在我的create()
中:
WNDCLASSEX wc;
wc.lpfnWndProc = (WNDPROC) &Window::WndProc;
我收到了这个警告:
warning: converting from 'LRESULT (Window::*)(HWND, UINT, WPARAM, LPARAM) {aka long int (Window::*)(HWND__*, unsigned int, unsigned int, long int)}' to 'WNDPROC {aka long int (__attribute__((__stdcall__)) *)(HWND__*, unsigned int, unsigned int, long int)}' [-Wpmf-conversions]
我的窗口HWND
为NULL
,GetLastError()
也返回0.
如何解决这个问题?
答案 0 :(得分:5)
您应该为其添加static
修饰符。
原因是,当它是一个成员函数(我认为它是Visual C ++中的__thiscall
)时,它实际上只是一个以this
作为第一个参数的C函数。这看起来像这样:
LRESULT CALLBACK WndProc(Window& this, HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
如果将其设为静态,编译器将删除第一个Window& this
参数,使其与lpfnWndProc
兼容。
答案 1 :(得分:4)
让它静止:
static LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
答案 2 :(得分:0)
是的,可以将WndProc包含为类成员。此外,您可以从中修改其他类成员。诀窍是使用两个WndProc函数,其中一个是静态的。