这是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:“正在初始化”:无法从“重载函数”转换为
  “ 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,但是目前我无法轻松访问编译器进行验证。

07-26 01:24