这是this问题的延续。
我有以下任务:
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_engine \ rat_engine \ rat_rendererdx9.cpp(19):错误 C2440:'初始化':无法从'overloaded-function'转换为 '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 );
答案 0 :(得分:3)
从MsgProc
的声明看来,它似乎是一个常规的成员函数,这意味着它需要一个“隐藏的”this
指针。这使得它与WNDPROC不兼容,这就是编译器抱怨的原因。
尝试将其标记为static
。当然,这意味着您无法轻松访问该类的非静态成员 - 您需要存储您想要在某处执行该实例的this
指针的副本。
您可能还需要CALLBACK
而不是WINAPI
,但我目前无法轻松访问编译器以进行验证。
答案 1 :(得分:0)
对我而言,如果将类的实例/对象绑定到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
将失败。确保该功能在这些情况下均可使用。