duilib 時間控件的認識


CDateTimeUI

 

1、該控件繼承了CLabelUI控件,該空間並無重寫SetAttribute的函數。全部屬性跟CLabelUI控件一樣。

2、該控件又有CDateTimeWnd類的一個指針用來顯示具體讓你選擇的時間,該類就是創建的是SysDateTimePick32的控件。

也許會疑惑,為什么Init函數里面的Create沒有關於DateTimePick32的相關說明,但是卻能創建出這樣一個控件。主要要看CWindowWnd::Create函數,該函數的第一個判斷語句在GetSuperClassName()獲取到了CDateTimeWnd函數的字符串,因為不為空則調用對應的RegisterSuperclass進行注冊DateTimePicker控件。

這是RegisterSuperClass函數的獲取對應DateTimerPicker控件的Wndclassex   ::GetClassInfoEx(NULL, GetSuperClassName(), &wc)

3、該控件在被選中的時候就New一個CDateTimeWnd的實例,並顯示。(見DoEvent)

4、CDatetimeWnd在失去焦點之后會自動銷毀自身,並把時間設置給CDateTimeUI

    LRESULT CDateTimeWnd::OnKillFocus(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
    {
        LRESULT lRes = ::DefWindowProc(m_hWnd, uMsg, wParam, lParam);
        if (m_pOwner->m_nDTUpdateFlag == DT_NONE)
        {
            ::SendMessage(m_hWnd, DTM_GETSYSTEMTIME, 0, (LPARAM)&m_pOwner->m_sysTime);
            m_pOwner->m_nDTUpdateFlag = DT_UPDATE;
            m_pOwner->UpdateText();
        }
        PostMessage(WM_CLOSE);
        return lRes;
    }
View Code

該函數最終PostMessage(WM_CLOSE); 

然后該函數就會調用OnFinalMessage

void CDateTimeWnd::OnFinalMessage(HWND /*hWnd*/)
    {
        // Clear reference and die
        if( m_hBkBrush != NULL ) ::DeleteObject(m_hBkBrush);
        m_pOwner->m_pWindow = NULL;
        delete this;
    }
View Code

進行資源的釋放。

對應的在__ControlProc函數,該函數在注冊RegisterSuperclass的時候設置的回掉函數。

如果是普通的創建則在對應的回掉__WndProc函數。

 

同理:CEduiUI控件也做了跟時間空間類似的處理方式,只是在CEditUI類中多添加了相應的設置屬性等函數。


免責聲明!

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



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