D3DApp Class 问题

D3DApp Class Problems

所以我正在 D3DApp class 中包含的方法中创建一个 WNDCLASSEX,我将从另一个 class 派生,例如引擎、游戏等...称为 InitMainWindow(它也在基础 class 中受到保护):

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 基 class 中,定义如下:

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

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

'=': cannot convert from 'LRESULT (__cdecl D3DApp::* )(HWND,UINT,WPARAM,LPARAM)' to 'WNDPROC'

我是否必须在派生自 D3DApp 的 class 中创建我的 WNDPROC 回调的定义?或者我是否必须从基础 class 和派生 class 中完全删除此回调并将其放置在我的 WinMain 函数范围之外和之上?我已经研究了大约 2 天如何修复此错误,但没有找到任何可能的修复方法……我认为我的 C++ 技能可能并不像我认为的那样出色。但是,如果有人能帮助我了解我的问题出在哪里,那就太好了!

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

这是 WNDPROC 的签名:

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

但您的声明不同:

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

您应该像这样在 class 之外声明它:

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

或将其声明为静态并删除 virtual 关键字。另请注意,您应该添加解析为 __stdcall calling convention as your project is configured to use __cdecl 调用约定

的 CALLBACK