c – 为什么我的WndProc不能上课?
发布时间:2020-12-16 05:37:26 所属栏目:百科 来源:网络整理
导读:这似乎应该很简单.我有我的班: class Simple{public: LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam) { ... }}; 和我的WinMain: int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR commandLine,int cmdS
这似乎应该很简单.我有我的班:
class Simple { public: LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam) { ... } }; 和我的WinMain: int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR commandLine,int cmdShow) { Simple *simple = new Simple(); ... wndClass.lpfnWndProc = simple->WndProc; ... } 当我尝试,我得到: error C2440: '=' :cannot convert from 'LRESULT (__stdcall Simple::* )(HWND,UINT,WPARAM,LPARAM)' to 'WNDPROC' 有没有什么理由我不能让我的WndProc在一个班级?好像这样真的很有用. 解决方法
C将成员函数和自由函数视为不同的 – 成员函数需要访问此指针,通常作为隐藏的第一个参数传入.因此,n参数成员函数将最接近于(n 1)-argument自由函数,这意味着试图调用您的WndProc的代码将传入错误的参数数.
但是,您可以将WndProc声明为静态成员函数,从而消除了此指针.这段代码应该有效: class Simple { public: static LRESULT CALLBACK WndProc(HWND hwnd,LPARAM lParam) { ... } }; int WINAPI WinMain(HINSTANCE hInstance,int cmdShow) { Simple *simple = new Simple(); ... wndClass.lpfnWndProc = simple->WndProc; ... } 当然,这意味着你不能直接访问类的字段.您可以通过将类的指针嵌入为每个窗口实例保留的额外字节,也许通过使用 class Simple { public: static LRESULT CALLBACK WndProc(HWND hwnd,LPARAM lParam) { Simple* me = static_cast<Simple*>(GetWindowLongPtr(hwnd,GWLP_USERDATA)); if (me) return me->realWndProc(hwnd,msg,wParam,lParam); return DefWindowProc(hwnd,lParam); } private: LRESULT CALLBACK realWndProc(HWND hwnd,LPARAM lParam) { // Yay! I'm a member function! } }; 希望这可以帮助! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |