因此,我正在使用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 回答
这是WNDPROC的签名:
但你的声明是不同的:
您应该在类之外声明它,如下所示:
或者将其声明为静态并删除虚拟关键字 . 另请注意,您应该添加CALLBACK,它解析为__stdcall调用约定,因为您的项目已配置为使用__cdecl调用约定