1、日期控件的自繪
這裏需要介紹幾個日期控件的事件:
(1)OnDropdown
此消息是點擊右側按鈕,彈出月曆控件時的響應函數。
(2)OnSetfocus
此事件是右側按鈕獲得焦點時候的響應函數,它在OnDropdown之前執行。
(3)OnCloseup
此事件是當選擇完日期關閉月曆控件時的響應函數。
日期控件的自繪包括右側按鈕的自繪和月曆控件的自繪,比較麻煩。本人只針對右側按鈕控件自繪詳細說明。
CDateTimeCtrl派生類CNewDateTimeCtrl在OnPaint()函數中實現按鈕的自繪:
// CPaintDC dc(this); // device context for painting
CDateTimeCtrl::OnPaint();
CDC* dc = GetDC();
// TODO: Add your message handler code here
CRect rcPic;
GetClientRect(&rcPic);
rcPic.left = rcPic.right - 17;
rcPic.bottom = 17;
// rcPic.Width()= rcPic.right - rcPic.left;
if (m_bDown || (GetMonthCalCtrl() != NULL))
{
CBitmap *pOldBitmap;
CDC* pMemDC = new CDC;
CDC *pDC = dc;
int iwidth = rcPic.Width();
int iheight = rcPic.Height();
//讀位圖到內存
pMemDC->CreateCompatibleDC(pDC);
pOldBitmap = pMemDC->SelectObject(&m_bmpDownBtn);
pDC->BitBlt(rcPic.left, rcPic.top, rcPic.Width(), rcPic.Height(), pMemDC, rcPic.Width()*2, 0, SRCCOPY);
pMemDC->SelectObject(pOldBitmap);
//釋放內存
ReleaseDC(pMemDC);
delete pMemDC;
}
else
{
CBitmap *pOldBitmap;
CDC* pMemDC = new CDC;
CDC *pDC = dc;
int iwidth = rcPic.Width();
//讀位圖到內存
pMemDC->CreateCompatibleDC(pDC);
pOldBitmap = pMemDC->SelectObject(&m_bmpDownBtn);
pDC->BitBlt(rcPic.left, rcPic.top, rcPic.Width(), rcPic.Height(), pMemDC, rcPic.Width(), 0, SRCCOPY);
pMemDC->SelectObject(pOldBitmap);
//釋放內存
ReleaseDC(pMemDC);
delete pMemDC;
}
ReleaseDC(dc);
這樣就實現了按鈕的自繪,但是存在問題:
左鍵點擊按鈕,再鬆開時按鈕變回默認狀態。我查了一下日期時間控件沒有OnLButtonUp事件,似乎只能通過子類化按鈕的方法來解決。
注意:GetMonthCalCtrl() 用於獲得月曆控件的窗口句柄。同事告訴我一個新方法:定時器。也就是在OnLButtonDown()時,SetTimer(1,200,NULL)這裏設置200ms比較合適,不會讓用戶覺得很假:)
然後在OnTimer函數裏Invalidate()強制重繪。在OnKillFocus()裏面關閉定時器即可。
好了,時間控件下次介紹。。