日期時間控件自繪

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()裏面關閉定時器即可。

好了,時間控件下次介紹。。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章