Win32 WndProc作为类成员

时间:2013-01-20 11:43:54

标签: c++ winapi mingw

有没有办法将WndProc包装为私有成员?

如果我有这个:

class Window
{
public:
    Window();
    virtual ~Window();
    void create();

private:
    LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
};

在我的create()中:

WNDCLASSEX wc;
wc.lpfnWndProc = (WNDPROC) &Window::WndProc;

我收到了这个警告:

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]

我的窗口HWNDNULLGetLastError()也返回0.

如何解决这个问题?

3 个答案:

答案 0 :(得分:5)

您应该为其添加static修饰符。

原因是,当它是一个成员函数(我认为它是Visual C ++中的__thiscall)时,它实际上只是一个以this作为第一个参数的C函数。这看起来像这样:

LRESULT CALLBACK WndProc(Window& this, HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);

如果将其设为静态,编译器将删除第一个Window& this参数,使其与lpfnWndProc兼容。

答案 1 :(得分:4)

让它静止:

static LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);

答案 2 :(得分:0)

是的,可以将WndProc包含为类成员。此外,您可以从中修改其他类成员。诀窍是使用两个WndProc函数,其中一个是静态的。