0

这是这个问题的延续。

我有以下任务:

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: 'initializing' : 无法从 '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 );
4

2 回答 2

3

从您的声明来看,MsgProc它似乎是一个常规成员函数,这意味着它需要一个“隐藏”this指针。这使得它与 WNDPROC 不兼容,这就是编译器抱怨的原因。

尝试将其标记为static. 当然,这意味着您不能轻松访问该类的非静态成员 - 您需要在this某个地方存储您想要的实例指针的副本来执行此操作。

您可能还需要CALLBACKWINAPI但我目前无法轻松访问编译器来验证这一点。

于 2013-02-06T23:17:44.550 回答
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将会失败。确保该功能甚至在这些情况下也有效。

于 2016-09-23T16:57:41.937 回答