windows C2440 无法在 C++ WinApi 中将 LRESULT 转换为 WNDPROC
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/7318893/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
C2440 Can't convert LRESULT to WNDPROC in C++ WinApi
提问by Ozzah
I'm trying to write this win32 program with WinApi and I'm stuck because the tutorial I'm following seems to have a problem.
我正在尝试用 WinApi 编写这个 win32 程序,但我被卡住了,因为我遵循的教程似乎有问题。
MainWindow.h:
主窗口.h:
class MainWindow
{
public:
MainWindow(HINSTANCE);
~MainWindow(void);
LRESULT CALLBACK WndProcedure(HWND, UINT, WPARAM, LPARAM);
// [...]
MainWindow.cpp:
主窗口.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)
{
// [...]
}
I must be referencing MainWindow::WndProcedure wrong because I'm following the signature exactly as the tutorial says, however the lpfnWndProc line in the constructor gives a compile-time error:
我一定是引用了 MainWindow::WndProcedure 错误,因为我完全按照教程所说的那样遵循签名,但是构造函数中的 lpfnWndProc 行给出了编译时错误:
error C2440: '=' : cannot convert from 'LRESULT (__stdcall MainWindow::* )(HWND,UINT,WPARAM,LPARAM)' to 'WNDPROC'
错误 C2440:“=”:无法从“LRESULT (__stdcall MainWindow::*)(HWND,UINT,WPARAM,LPARAM)”转换为“WNDPROC”
回答by
replace
代替
LRESULT CALLBACK WndProcedure(HWND, UINT, WPARAM, LPARAM);
by
经过
static LRESULT CALLBACK WndProcedure(HWND, UINT, WPARAM, LPARAM);
The this pointer is a hidden parameter in your function call and by declaring it static the this pointer is not a parameter anymore and the signature of the two functions match.
this 指针是函数调用中的隐藏参数,通过将其声明为静态 this 指针不再是参数,并且两个函数的签名匹配。
回答by interjay
You can't use a non-static member function as a window procedure. If you declare WndProcedure
as static
it should compile. A non-member function would work as well.
您不能将非静态成员函数用作窗口过程。如果你声明WndProcedure
作为static
它应该编译。非成员函数也可以工作。
Non-static member functions have a different signature than static members. This is because they receive an implicit this
parameter in addition to the explicitly defined parameters.
非静态成员函数与静态成员具有不同的签名。这是因为this
除了显式定义的参数之外,它们还接收一个隐式参数。
回答by rodrigo
That's because your WndProcedure function must be either a global function or a staticmember function.
那是因为您的 WndProcedure 函数必须是全局函数或静态成员函数。