C2440用于重载函数MsgProc

时间:2013-02-06 23:07:13

标签: c++ directx-9

这是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 );

2 个答案:

答案 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将失败。确保该功能在这些情况下均可使用。