C2440 無法在 C++ WinApi 中將 LRESULT 轉換為 WNDPROC
C2440 Can't convert LRESULT to WNDPROC in C++ WinApi
我正在尝试用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
参数。
相关文章:
- "LRESULT CALLBACK WinProc"和"LRESULT WINAPI WinProc"的区别
- WM_DESTROY没有在包裹的WndProc内部调用
- 如何在控制台应用中注册WNDProc
- 在API中控制WNDProc功能的问题
- WNDPROC处理事件更少的代码
- 异步 Winsock Server 的 WndProc 未被调用
- 如何让 wndproc 处理发送到多个窗口的消息
- WndProc的类方法
- C++:如何为控制台应用程序设置新的 wndProc
- Win32 ListBox WNDProc从未打电话
- Win32获取从窗口WNDProc发送事件的对象的HWND
- 如何将WndProc用作类函数
- 在WNDClasSex中断代码中将代码添加到WNDPROC回调中
- 将 LRESULT 输出到控制台
- 将 WndProc 替换为另一个函数来处理消息
- 使用类成员作为带有或不带有全局的WNDPROC/DLPROC
- WNDCLASSEX未采用WNDPROC参数
- 从 Win32 包装器 WndProc 调用另一个类中的函数
- 无法从"LRESULT (__stdcall *)(HWND,const wchar_t,WPARAM,LPARAM)"转换为"WNDPROC"
- C2440 無法在 C++ WinApi 中將 LRESULT 轉換為 WNDPROC