C++ C2440 Can';t将LRESULT转换为C+中的WNDPROC+;WinApi
我正试图用WinApi编写这个win32程序,我被卡住了,因为我下面的教程似乎有问题 MainWindow.h:C++ C2440 Can';t将LRESULT转换为C+中的WNDPROC+;WinApi,c++,windows,winapi,C++,Windows,Winapi,我正试图用WinApi编写这个win32程序,我被卡住了,因为我下面的教程似乎有问题 MainWindow.h: class MainWindow { public: MainWindow(HINSTANCE); ~MainWindow(void); LRESULT CALLBACK WndProcedure(HWND, UINT, WPARAM, LPARAM); // [...] MainWindow.cpp: MainWindow::MainWind
class MainWindow
{
public:
MainWindow(HINSTANCE);
~MainWindow(void);
LRESULT CALLBACK WndProcedure(HWND, UINT, WPARAM, LPARAM);
// [...]
MainWindow.cpp:
MainWindow::MainWindow(HINSTANCE hInstance) : hwnd(0)
{
WNDCLASSEX WndClsEx;
// [...]
WndClsEx.lpfnWndProc = &MainWindow::WndProcedure;
// [...]
}
LRESULT CALLBACK MainWindow::WndProcedure(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
// [...]
}
我一定是引用MainWindow::WndProcedure时出错了,因为我完全按照教程中所述的签名进行操作,但是构造函数中的lpfnWndProcedure行给出了编译时错误:
错误C2440:“=”:无法从“LRESULT(\uu stdcall main window::*)(HWND、UINT、WPARAM、LPARAM)”转换为“WNDPROC”不能将非静态成员函数用作窗口过程。如果将
WndProcedure
声明为static
,则应编译它。非成员函数也可以工作
非静态成员函数的签名与静态成员不同。这是因为除了显式定义的参数外,它们还接收到隐式此
参数。替换
LRESULT CALLBACK WndProcedure(HWND, UINT, WPARAM, LPARAM);
借
this指针是函数调用中的隐藏参数,通过声明它为静态,this指针不再是参数,并且两个函数的签名匹配。这是因为WndProcedure函数必须是全局函数或静态成员函数。您得到的错误是哪一行在…上我不认为这与您发布的内容有关。有关将窗口消息传递给类方法的惯用方法,请参见Raymond Chens(在方法签名中添加了
static
之后回答下一个逻辑问题)。
static LRESULT CALLBACK WndProcedure(HWND, UINT, WPARAM, LPARAM);