首页 文章

D3DApp类问题

提问于
浏览
0

因此,我正在使用D3DApp类中包含的方法创建WNDCLASSEX,我将从另一个类派生出来,例如引擎,游戏等......称为InitMainWindow(在基类中也受到保护):

bool D3DApp::InitMainWindow() {

    WNDCLASSEX wc;

    ZeroMemory(&wc, sizeof(WNDCLASSEX));

    wc.cbSize = sizeof(WNDCLASSEX);
    wc.style = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc = WindowProc; // This is where the error is!
    wc.hInstance = mAppInst;
    wc.hCursor = LoadCursor(mAppInst, IDC_ARROW);
    wc.lpszClassName = L"MainWindow";

    RegisterClassEx(&wc);
    RECT rect = { 0,0,SCREEN_WIDTH,SCREEN_HEIGHT };
    AdjustWindowRect(&rect, WS_OVERLAPPEDWINDOW, FALSE);
    mMainWnd = CreateWindowEx(NULL, L"MainWindow", L"Test", WS_OVERLAPPEDWINDOW, 300, 300, rect.right - rect.left, rect.bottom - rect.top, NULL, NULL, mAppInst, NULL);
    ShowWindow(mMainWnd, NULL);

    return true;
}

我的WNDPROC回调声明和定义在InitMainWindow()所在的同一D3DApp基类中,定义如下:

virtual LRESULT WindowProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);

当我在WNDCLASSEX结构中填写lpfnWndProc变量时,我收到一个C2440错误,说明以下内容

'=':无法将'LRESULT(__ cdecl D3DApp :: *)(HWND,UINT,WPARAM,LPARAM)'转换为'WNDPROC'

我是否必须在源自D3DApp的类中创建我的WNDPROC回调的定义?或者我是否必须从基类和派生类中完全删除此回调并将其放在WinMain函数范围之外和之上?我已经研究了大约2天如何解决这个错误,并且没有找到任何可能的修复工具......我认为我的C技能可能不如我认为的那么优秀 . 但是,如果有人能帮我理解我的问题在哪里会很棒!

p.s和是的我知道我有一些错误检查要做,但我只是想确保它适用于我的编译器:)

1 回答

  • 0

    这是WNDPROC的签名:

    typedef LRESULT (CALLBACK* WNDPROC)(HWND, UINT, WPARAM, LPARAM);
    

    但你的声明是不同的:

    LRESULT WindowProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
    

    您应该在类之外声明它,如下所示:

    LRESULT CALLBACK WindowProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
    

    或者将其声明为静态并删除虚拟关键字 . 另请注意,您应该添加CALLBACK,它解析为__stdcall调用约定,因为您的项目已配置为使用__cdecl调用约定

相关问题