有没有办法将WndProc包装为私有成员?
如果我有这个:
class Window
{
public:
Window();
virtual ~Window();
void create();
private:
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
};
Run Code Online (Sandbox Code Playgroud)
而在我的create()这个:
WNDCLASSEX wc;
wc.lpfnWndProc = (WNDPROC) &Window::WndProc;
Run Code Online (Sandbox Code Playgroud)
我收到这个警告:
warning: converting from 'LRESULT (Window::*)(HWND, UINT, WPARAM, LPARAM) {aka long int (Window::*)(HWND__*, unsigned int, unsigned int, long int)}' to 'WNDPROC {aka long int (__attribute__((__stdcall__)) *)(HWND__*, unsigned int, unsigned int, long int)}' [-Wpmf-conversions]
我的窗口HWND也是NULL,GetLastError()也返回0.
怎么解决这个问题?
使其静态:
static LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
Run Code Online (Sandbox Code Playgroud)
您应该static为其添加修改器.
这样做的原因是,当它是一个成员函数(我相信它是__thiscall在Visual C++中)时,它实际上只是一个C函数this作为第一个参数.这看起来像这样:
LRESULT CALLBACK WndProc(Window& this, HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
Run Code Online (Sandbox Code Playgroud)
如果你使它静态,编译器将摆脱第一个Window& this参数,使其兼容lpfnWndProc.
| 归档时间: |
|
| 查看次数: |
4788 次 |
| 最近记录: |