2017-08-24 33 views
0

所以我正在创建一个包含在D3DApp类中的方法中的WNDCLASSEX,我将从另一个类派生出来,例如引擎,游戏,等...称为InitMainWindow(这也是在基类保护):D3DApp类问题

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变量I接收C2440错误,指出以下

'=':无法从“LRESULT(转换__cdecl d 3DApp :: *)(HWND,UINT,WPARAM,LPARAM)”到 'WNDPROC'

我必须从D3DApp类派生来创建我的WNDPROC回调的定义吗?还是必须从基类和派生类中完全移除此回调,并将其放在我的WinMain函数的范围之外?我一直在研究如何解决这个错误大约2天,并没有找到任何可能的修复方法的运气......我认为我的C++技能可能不如我认为的那么出色。但如果任何人都可以帮助我理解我的问题在哪里,那将是惊人的!

PS是的,我知道我有一些错误检查可以做,但我只是想确保它适合我的编译器首先:)

+0

你应该声明窗口过程为静态,并从中删除虚拟关键字或声明和定义它,它的类为外解析为__stdcall调用约定非成员函数 – Asesh

+0

修复了我收到的错误,非常感谢您的帮助。 MSDN格式的文档仍然让我很难理解,我真的很感谢像你这样的人愿意帮助解决这些问题。 @Asesh – Sharpie

+0

已在下面的答案中添加更多信息 – Asesh

回答

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); 

或声明它为静态并删除虚拟关键字。还要注意,你应该添加回调为您的项目配置为使用__cdecl调用约定