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
所以我正在 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