MFC自繪按鈕的實現,按鈕動態效果


最近項目需要實現按鈕的動態效果,多方學習,現在終於能實現一些功能了。

過程如下:

  第一,新建一MFC對話框應用程序。

  第二,刪除自帶按鈕,並添加兩個按鈕,button1,button2,ID為IDB_BUTTON1,IDB_BUTTON2.同時響應鼠標單擊按鈕事件。如下

void Cbutton_fly3Dlg::OnBnClickedButton2()//video2
{
    // TODO: 在此添加控件通知處理程序代碼
    MessageBox(L"video2");//這里簡單測試一下
}

  第三,添加位圖資源,在資源視圖下添加幾張圖片,如下圖

  第四,設置按鈕參數OwnerDraw為true,此參數說明,按鈕的繪制有使用者自己繪制。我的環境是VS2010,位置如下:

                            

  第五,添加消息響應函數WM_DRAWITEM,相應用戶的按鍵操作,如圖

  在OnDrawItem()函數內部添加處理函數,我打算加載兩個位圖,在按鈕按下以及釋放時顯示圖片。

 1     CDC buttonDC;
 2     CBitmap bitmapTrans;
 3     BITMAP bmp;
 4     CDC mem;
 5     CRect rc;
 6     buttonDC.Attach(lpDrawItemStruct->hDC);//得到用於繪制按鈕的DC
 7     mem.CreateCompatibleDC(&buttonDC);//准備向按鈕區域傳輸圖形    
 8     
 9     if (lpDrawItemStruct->CtlID == IDC_BUTTON1)
10     {
11         rc = lpDrawItemStruct->rcItem;//獲取按鈕所占的矩形大小
12         UINT state  = lpDrawItemStruct->itemState;//獲取按鈕當前的狀態,不同狀態繪制不同的按鈕    
13         if (state & ODS_FOCUS)//如果按鈕已經取得焦點,繪制選中狀態下的按鈕
14         {
15             bitmapTrans.LoadBitmap(IDB_BITMAP2);
16             bitmapTrans.GetBitmap(&bmp);
17             CBitmap * old = mem.SelectObject(&bitmapTrans);
18             //向按鈕傳輸位圖,使用stretcnblt可以使圖片隨按鈕大小而改變
19             buttonDC.StretchBlt(rc.left,rc.top,rc.right,rc.bottom,&mem,0,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY);
20             mem.SelectObject(old);
21             bitmapTrans.DeleteObject();
22         }
23         else //如果按鈕已經取得焦點,繪制選中狀態下的按鈕
24         {
25             bitmapTrans.LoadBitmap(IDB_BITMAP3);
26             CBitmap *old2 = mem.SelectObject(&bitmapTrans);
27             bitmapTrans.GetBitmap(&bmp);
28             CBitmap *old=mem.SelectObject(&bitmapTrans);
29             buttonDC.StretchBlt(rc.left,rc.top,rc.right,rc.bottom,&mem,0,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY);
30             mem.SelectObject(old2);
31             bitmapTrans.DeleteObject();
32         }
33     }

  我只是把圖片的顏色稍微變了一下,但是效果在運行時可以明顯看出來。效果如圖:

        

 部分重要代碼:

 1 void Cbutton_fly3Dlg::OnBnClickedButton1()//video1
 2 {
 3     // TODO: 在此添加控件通知處理程序代碼
 4     MessageBox(L"video1");
 5 
 6 }
 7 
 8 
 9 void Cbutton_fly3Dlg::OnBnClickedButton2()//video2
10 {
11     // TODO: 在此添加控件通知處理程序代碼
12     MessageBox(L"video2");
13 }
14 
15 
16 void Cbutton_fly3Dlg::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)
17 {
18     // TODO: 在此添加消息處理程序代碼和/或調用默認值
19     //自繪按鈕的實現
20     CDC buttonDC;
21     CBitmap bitmapTrans;
22     BITMAP bmp;
23     CDC mem;
24     CRect rc;
25     buttonDC.Attach(lpDrawItemStruct->hDC);//得到用於繪制按鈕的DC
26     mem.CreateCompatibleDC(&buttonDC);//准備向按鈕區域傳輸圖形    
27     
28     if (lpDrawItemStruct->CtlID == IDC_BUTTON1)
29     {
30         rc = lpDrawItemStruct->rcItem;//獲取按鈕所占的矩形大小
31         UINT state  = lpDrawItemStruct->itemState;//獲取按鈕當前的狀態,不同狀態繪制不同的按鈕    
32         if (state & ODS_FOCUS)//如果按鈕已經取得焦點,繪制選中狀態下的按鈕
33         {

 

 


免責聲明!

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



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