C++ C2440 Can';t将LRESULT转换为C+中的WNDPROC+;WinApi

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

我正试图用WinApi编写这个win32程序,我被卡住了,因为我下面的教程似乎有问题

MainWindow.h:

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);