2

有没有办法将 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。

如何解决这个问题?

4

3 回答 3

5

使其静态:

static LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
于 2013-01-20T11:45:50.187 回答
5

您应该将static修饰符添加到它。

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

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

如果将其设为静态,编译器将去掉第一个Window& this参数,使其与lpfnWndProc.

于 2013-01-20T12:01:33.520 回答
0

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

于 2015-01-24T22:55:20.963 回答