Win32 WndProc作为类成员

das*_*s_j 1 c++ winapi mingw

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

怎么解决这个问题?

use*_*015 5

使其静态:

static LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
Run Code Online (Sandbox Code Playgroud)

  • 嗯,这很有趣……它对我有用。但是我从 wndProc 调用了许多函数,它们都不是静态的,那么如何实现呢?我不想让它们静态.. (3认同)

ant*_*ijn 5

您应该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.