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; }
該函數最終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; }
進行資源的釋放。
對應的在__ControlProc函數,該函數在注冊RegisterSuperclass的時候設置的回掉函數。
如果是普通的創建則在對應的回掉__WndProc函數。
同理:CEduiUI控件也做了跟時間空間類似的處理方式,只是在CEditUI類中多添加了相應的設置屬性等函數。