如何使用 WndProc 作为类函数[重复]

2024-04-19

我正在尝试创建一个包含 WndProc 的类,但出现错误:

Error 2 error C2440: '=' : cannot convert from 'LRESULT (__stdcall Client::* )(HWND,UINT,WPARAM,LPARAM)' to 'WNDPROC'

我在网上搜索了它,发现您需要将 WndProc 设为静态,但是随后,它会编译并且一切都很好,但如果我想更改某些内容,它不允许我:

Error 3 error C2352: 'Client::CreateMen' : illegal call of non-static member function

(CreateMen 是类中创建菜单的函数,使用 HMENU 等)。

这是我的函数标题:

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

我能做些什么?我真的很困惑...

Thanks!


非静态类方法有一个隐藏的this范围。这就是阻止该方法用作 WndProc(或任何其他 API 回调)的原因。您必须将类方法声明为static删除那个this范围。但正如您已经注意到的,您无法从静态方法访问非静态成员。您需要一个指向该对象的指针才能访问它们。

在 WndProc 回调的特定情况下,您可以将对象指针存储在 HWND 本身中(使用SetWindowLongPtr(GWLP_USERDATA) or SetProp()),那么你的静态方法就可以从hWnd参数(使用GetWindowLongPtr(GWLP_USERDATA) or GetProp())并根据需要使用该对象指针访问非静态成员。

例如:

private:
    HWND m_Wnd;
    static LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
LRESULT CALLBACK Client::WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    Client *pThis;

    if (msg == WM_NCCREATE)
    {
        pThis = static_cast<Client*>(reinterpret_cast<CREATESTRUCT*>(lParam)->lpCreateParams);

        SetLastError(0);
        if (!SetWindowLongPtr(hwnd, GWLP_USERDATA, reinterpret_cast<LONG_PTR>(pThis)))
        {
            if (GetLastError() != 0)
                return FALSE;
        }
    }
    else
    {
        pThis = reinterpret_cast<Client*>(GetWindowLongPtr(hwnd, GWLP_USERDATA));
    }

    if (pThis)
    {
        // use pThis->member as needed...
    }

    return DefWindowProc(hwnd, msg, wParam, lParam);
}
m_Wnd = CreateWindowEx(..., this);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 WndProc 作为类函数[重复] 的相关文章

随机推荐