C2440 無法在 C++ WinApi 中將 LRESULT 轉換為 WNDPROC

C2440 Can't convert LRESULT to WNDPROC in C++ WinApi

本文关键字:LRESULT WNDPROC 中將 WinApi C++ C2440      更新时间:2023-10-16

我正在尝试用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错误,因为我按照教程所说的完全遵循签名,但是构造函数中的lpfnWndProc行给出了编译时错误:

错误C2440: '=':无法从'LRESULT (__stdcall MainWindow::*)(HWND,UINT,WPARAM,LPARAM)'转换为'WNDPROC'

replace

LRESULT CALLBACK WndProcedure(HWND, UINT, WPARAM, LPARAM);

static LRESULT CALLBACK WndProcedure(HWND, UINT, WPARAM, LPARAM);

this指针是函数调用中的隐藏参数,通过将其声明为静态,this指针不再是参数,并且两个函数的签名匹配

这是因为你的WndProcedure函数必须是一个全局函数或一个静态成员函数。

不能将非静态成员函数用作窗口过程。如果将WndProcedure声明为static,则应该编译。非成员函数也可以。

非静态成员函数具有与静态成员不同的签名。这是因为除了显式定义的参数之外,它们还接收一个隐式的this参数。