【问题标题】:C2440 Can't convert LRESULT to WNDPROC in C++ WinApiC2440 无法在 C++ WinApi 中将 LRESULT 转换为 WNDPROC
【发布时间】:2011-11-11 05:52:42
【问题描述】:

我正在尝试使用 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'

【问题讨论】:

  • 你在哪一行得到这个错误?我不认为它在你发布的内容中。
  • 请参阅 Raymond Chens scratch program,了解将窗口消息传递给类方法的惯用方式(回答 static 之后的下一个逻辑问题,添加到方法签名中)。

标签: c++ windows winapi


【解决方案1】:

替换

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

由

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2012-12-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多