Duilib 消息循环理解

windows的消息循环,具体这里不详细讨论, 这里只记录下我所理解的duilib 中对消息的处理。
CWindowWnd类 跟windows 中的MFC框架类似,有实现如下回调函数:

LRESULT CALLBACK CWindowWnd::__WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
 if( uMsg == WM_NCCREATE ) {
        LPCREATESTRUCT lpcs = reinterpret_cast(lParam);
        pThis = static_cast(lpcs->lpCreateParams);
        pThis->m_hWnd = hWnd;
        ::SetWindowLongPtr(hWnd, GWLP_USERDATA, reinterpret_cast(pThis));
    } 
	  if( pThis != NULL ) {
        return pThis->HandleMessage(uMsg, wParam, lParam);
    } 
}

此处只截取了部分实现,主要调用了自己的HandleMessage函数,此处也就是,上次所说的自己的CFrameWindowWnd 类重写的HandleMessage ,所有消息循环就可以被我们自己的类来截获,只处理我们感兴趣的消息。如下是我们一般的实现:

LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
    {
        if( uMsg == WM_CREATE ) {
            m_pm.Init(m_hWnd);
            return 0;
        }
        else if( uMsg == WM_DESTROY ) {
            ::PostQuitMessage(0L);
        }
        else if( uMsg == WM_NCACTIVATE ) {
            if( !::IsIconic(*this) ) return (wParam == 0) ? TRUE : FALSE;
        }
        LRESULT lRes = 0;
        if( m_pm.MessageHandler(uMsg, wParam, lParam, lRes) ) return lRes;
        return CWindowWnd::HandleMessage(uMsg, wParam, lParam);
    }

自己实现 WM_CREATE,WM_DESTROY,WM_DESTROY 消息,然后为
CPaintManagerUI::MessageHandler Duilib的UI管理类,最后才为默认处理
,windows的消息从产生到处理,我们也就大致明白了,WM_CREATE 消息中,创建我们需要的控件,看源码发现,鼠标消息处理在CPaintManagerUI::MessageHandler 里面,想接下来看控件的消息处理来着,但是控件的创建还没看,接下来就看CControlUI 控件基类,及其他派生控件的实现,等了解控件的基本使用后,再重新认识 ui管理类 CPaintManagerUI ,感觉还会有不少收获~

你可能感兴趣的:(duilib)