SOUI真消息分析

在SOUI里,CSimpleWnd处理了整个真窗口消息的的核心。

对比win32。CSimpleWnd也是可以和win32的骤一一对应。对应实现,src\core\CSimpleWnd.cpp

第一步:注册一个窗口类

ATOM CSimpleWnd::RegisterSimpleWnd( HINSTANCE hInst,LPCTSTR pszSimpleWndName )

这个函数注册一个窗口类。

这里有一个非常重要的东西wcex.lpfnWndProc  = StartWindowProc; // 第一个处理函数,这里是消息处理的关键点。

第二步:StartWindowProc

LRESULT CALLBACK CSimpleWnd::StartWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
    CSimpleWnd* pThis=(CSimpleWnd*)CSimpleWndHelper::GetInstance()->GetSharePtr();

    pThis->m_hWnd=hWnd;
    // 初始化Thunk,做了两件事:1、mov指令替换hWnd为对象指针,2、jump指令跳转到WindowProc
    pThis->m_pThunk->Init((DWORD_PTR)WindowProc, pThis);

    // 得到Thunk指针
    WNDPROC pProc = (WNDPROC)pThis->m_pThunk->GetCodeAddress();
    // 调用下面的语句后,以后消息来了,都由pProc处理
    ::SetWindowLongPtr(hWnd, GWLP_WNDPROC, (LONG_PTR)pProc);

    return pProc(hWnd, uMsg, wParam, lParam);
}

第三步:WindowProc

由上一步的SetWindowLongPtr之后所有的消息将由WNDPROC pProc = (WNDPROC)pThis->m_pThunk->GetCodeAddress();处理,对应函数为 WindowProc,在这个函数里第一步调用 CSimpleWnd* pThis = (CSimpleWnd*)hWnd; // 强转为对象指针

这里的转换是由 Thunk技术实现了参数替换,从而实现HWND到类指针的转换。如果想深入了解可以以关键字WTL Thunk使用搜索引擎。

第四步:ProcessWindowMessage

调用窗口对应类的ProcessWindowMessage处理消息。

 

最新SOUI里CSimpleWnd已经更名为 SNativeWnd其原理不变。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值