Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Win32 WndProc as class member [duplicate]

Tags:

c++

mingw

winapi

Is there a way to wrap WndProc as private member?

If I have this:

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

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

And in my create() this:

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

I get this warning:

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]

And my window HWND is NULL, GetLastError() also returns 0.

How can this be fixed?

like image 827
das_j Avatar asked Oct 21 '25 20:10

das_j


2 Answers

You should add the static modifier to it.

The reason for this, is that when it's a member function (which I believe is a __thiscall in Visual C++), it's actually just a C function taking this as the first parameter. This would look like this:

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

If you make it static, the compiler gets rid of the first Window& this parameter, making it compatible with lpfnWndProc .

like image 86
antonijn Avatar answered Oct 24 '25 11:10

antonijn


Make it static:

static LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
like image 34
user1610015 Avatar answered Oct 24 '25 10:10

user1610015



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!