加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 如何使用WndProc作为类函数

发布时间:2020-12-16 10:41:01 所属栏目:百科 来源:网络整理
导读:参见英文答案 Win32 WndProc as class member????????????????????????????????????3个 我正在尝试创建一个包含WndProc的类,但是我收到一个错误: 错误2错误C2440:’=’:无法从’LRESULT(__stdcall Client :: *)(HWND,UINT,WPARAM,LPARAM)’转换为’WNDPRO
参见英文答案 > Win32 WndProc as class member????????????????????????????????????3个
我正在尝试创建一个包含WndProc的类,但是我收到一个错误:

错误2错误C2440:’=’:无法从’LRESULT(__stdcall Client :: *)(HWND,UINT,WPARAM,LPARAM)’转换为’WNDPROC’

我在网上搜索它,看到你需要让WndProc静态,但是,它编译并且一切都很好,但如果我想改变一些东西,它不会让我:

错误3错误C2352:’Client :: CreateMen’:非静态成员函数的非法调用

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

这是我的职称:

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

我能做什么?我真的很困惑……

谢谢!

解决方法

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

在WndProc回调的特定情况下,您可以将对象指针存储在HWND本身中(使用SetWindowLong / Ptr(GWL_USERDATA)或SetProp()),然后静态方法可以从hWnd参数中检索该对象指针(使用GetWindowLong) / Ptr(GWL_USERDATA)或GetProp())并根据需要使用该对象指针访问非静态成员.例如:

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

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

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

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

    return DefWindowProc(hwnd,msg,wParam,lParam);
}
m_Wnd = CreateWindowEx(...,this);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读