C2440用于重载函数MsgProc
C2440 for overloaded function MsgProc
这是这个问题的延续。
我有以下任务:
WNDCLASSEX wndClass =
{
sizeof( WNDCLASSEX ), CS_CLASSDC, MsgProc, 0, 0,
GetModuleHandle( NULL ), NULL, NULL, NULL, NULL,
"D3D Tutorial", NULL
};
wc = wndClass;
这给了我以下错误:
1> e:\rat_engine\rat_egine\rat_engine \rat_renderdx9.cpp(19):错误C2440:"正在初始化":无法从"重载函数"转换为'WNDPROC'
1> 作用域中没有此名称的函数匹配目标类型
将MsgProc下划线作为原因,它应该引用以下函数:
LRESULT WINAPI RAT_RendererDX9::MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
switch( msg )
{
case WM_DESTROY:
CleanUp();
PostQuitMessage( 0 );
return 0;
case WM_PAINT:
Render();
ValidateRect( hWnd, NULL );
return 0;
}
return DefWindowProc( hWnd, msg, wParam, lParam );
}
在教程中,它是这样工作的,我几乎完全复制了它。那么这个错误是从哪里来的,我该如何修复它呢?
编辑:
MsgProc的声明为:
private:
LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam );
从MsgProc
的声明来看,它似乎是一个常规成员函数,这意味着它使用了一个"隐藏"的this
指针。这使得它与WNDPROC不兼容,这就是编译器抱怨的原因。
尝试将其标记为static
。当然,这意味着您无法轻松访问类的非静态成员——您需要将实例的this
指针的副本存储在某个位置。
您可能还需要CALLBACK
而不是WINAPI
,但我现在无法轻松访问编译器来验证这一点。
对我来说,将类的实例/对象绑定到HWND似乎是最优雅的。要设置和检索指向实例的指针,可以使用SetWindowLongPtr
/GetWindowLongPtr
。
因此,在创建窗口后,您可以调用
SetWindowLongPtr(hWnd, GWLP_USERDATA, static_cast<LONG_PTR>(this));
在你的WindowProcedure
中,你打电话给
YourClass* instance = static_cast<YourClass*> (GetWindowLongPtr(hWnd, GWLP_USERDATA));
在WindowProcedure
中要小心:当您创建窗口时,它已经被调用了,但很明显,您只能在之后调用SetWindowLongPtr
。因此,当您的WindowProcedure
首先被调用时,GetWindowLongPtr
将失败。请确保该函数在这些情况下也能正常工作。
相关文章:
- "error: no matching function for call to"构造函数错误
- 什么时候调用组成单元对象的析构函数
- 继承函数的重载解析
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- C++模板来检查友元函数的存在
- 递归函数计算序列中的平方和(并输出过程)
- 对RValue对象调用的LValue ref限定成员函数
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 为什么使用 "this" 指针调用派生成员函数?
- 将对象数组的引用传递给函数
- 函数调用中参数的顺序重要吗
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用不带参数的函数访问结构元素
- 代码在main()中运行,但在函数中出现错误
- 内置函数可查看CPP中的成员变量
- 如何获取std::result_of函数的返回类型
- 如何在c++中为模板函数实例创建快捷方式
- C2440用于重载函数MsgProc