2013 duilib入門簡明教程 -- 自繪標題欄(5)


    如果大家有做過標題欄的自繪,肯定會感慨各種不容易,並且現有的一些資料雖然完美的實現了功能,但是代碼比較亂,需要自行整理。如果用duilib,就是小case啦。
    duilib其實並沒有區分標題欄和客戶區,它的實現方法是屏蔽了系統自帶的標題欄,用客戶區來模擬標題欄,所以想怎么畫就怎么畫,非常方便。
    1、我們首先屏蔽一下系統自帶的標題欄,
         在HandleMessage函數里屏蔽以下三個消息即可 WM_NCACTIVATE、WM_NCCALCSIZE、WM_NCPAINT
代碼如下:    
    virtual LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
    {
        LRESULT lRes = 0;

        if( uMsg == WM_CREATE ) 
        {
            CControlUI *pWnd = new CButtonUI;
            pWnd->SetName(_T("btnHello"));      // 設置控件的名稱,這個名稱用於標識每一個控件,必須唯一,相當於MFC里面的控件ID
            pWnd->SetText(_T("Hello World"));   // 設置文字
            pWnd->SetBkColor(0xFF00FF00);       // 設置背景色

            m_PaintManager.Init(m_hWnd);
            m_PaintManager.AttachDialog(pWnd);
            m_PaintManager.AddNotifier(this);   // 添加控件等消息響應,這樣消息就會傳達到duilib的消息循環,我們可以在Notify函數里做消息處理
            return lRes;
        }
        // 以下3個消息WM_NCACTIVATE、WM_NCCALCSIZE、WM_NCPAINT用於屏蔽系統標題欄
        else if( uMsg == WM_NCACTIVATE ) 
        {
            if( !::IsIconic(m_hWnd) ) 
            {
                return (wParam == 0) ? TRUE : FALSE;
            }
        }
        else if( uMsg == WM_NCCALCSIZE ) 
        {
            return 0;
        }
        else if( uMsg == WM_NCPAINT ) 
        {
            return 0;
        }

        if( m_PaintManager.MessageHandler(uMsg, wParam, lParam, lRes) ) 
        {
            return lRes;
        }

        return __super::HandleMessage(uMsg, wParam, lParam);
    }

即可看到如下效果

 
    2、對於加入最小化最大化按鈕等操作會在后面的教程里講到,因為duilib已經提供了一個基礎的類來實現常用的功能,所以這里就略過了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM