c – 如何使用WndProc作为类函数
发布时间:2020-12-16 10:41:01 所属栏目:百科 来源:网络整理
导读:参见英文答案 Win32 WndProc as class member????????????????????????????????????3个 我正在尝试创建一个包含WndProc的类,但是我收到一个错误: 错误2错误C2440:’=’:无法从’LRESULT(__stdcall Client :: *)(HWND,UINT,WPARAM,LPARAM)’转换为’WNDPRO
参见英文答案 >
Win32 WndProc as class member????????????????????????????????????3个
我正在尝试创建一个包含WndProc的类,但是我收到一个错误: 错误2错误C2440:’=’:无法从’LRESULT(__stdcall Client :: *)(HWND,UINT,WPARAM,LPARAM)’转换为’WNDPROC’ 我在网上搜索它,看到你需要让WndProc静态,但是,它编译并且一切都很好,但如果我想改变一些东西,它不会让我: 错误3错误C2352:’Client :: CreateMen’:非静态成员函数的非法调用 (CreateMen是创建菜单的类中的一个函数,使用HMENU等). 这是我的职称: LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam); 我能做什么?我真的很困惑…… 谢谢! 解决方法
非静态类方法具有隐藏的此参数.这就是阻止该方法用作WndProc(或任何其他API回调)的原因.必须将类方法声明为static才能删除该参数.但正如您已经注意到的那样,您无法从静态方法访问非静态成员.您需要一个指向该对象的指针才能访问它们.
在WndProc回调的特定情况下,您可以将对象指针存储在HWND本身中(使用SetWindowLong / Ptr(GWL_USERDATA)或SetProp()),然后静态方法可以从hWnd参数中检索该对象指针(使用GetWindowLong) / Ptr(GWL_USERDATA)或GetProp())并根据需要使用该对象指针访问非静态成员.例如: private: HWND m_Wnd; static LRESULT CALLBACK WndProc(HWND hwnd,LPARAM lParam); LRESULT CALLBACK Client::WndProc(HWND hwnd,LPARAM lParam) { Client *pThis; if (msg == WM_NCCREATE) { pThis = static_cast<Client*>(reinterpret_cast<CREATESTRUCT*>(lParam)->lpCreateParams); SetLastError(0); if (!SetWindowLongPtr(hwnd,GWL_USERDATA,reinterpret_cast<LONG_PTR>(pThis))) { if (GetLastError() != 0) return FALSE; } } else { pThis = reinterpret_cast<Client*>(GetWindowLongPtr(hwnd,GWL_USERDATA)); } if (pThis) { // use pThis->member as needed... } return DefWindowProc(hwnd,msg,wParam,lParam); } m_Wnd = CreateWindowEx(...,this); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |