最近項目須要實現按鈕的動態效果,多方學習,如今終於能實現一些功能了。ide
過程以下:函數
第一,新建一MFC對話框應用程序。學習
第二,刪除自帶按鈕,並添加兩個按鈕,button1,button2,ID爲IDB_BUTTON1,IDB_BUTTON2.同時響應鼠標單擊按鈕事件。以下測試
void Cbutton_fly3Dlg::OnBnClickedButton2()//video2 { // TODO: 在此添加控件通知處理程序代碼 MessageBox(L"video2");//這裏簡單測試一下 }
第三,添加位圖資源,在資源視圖下添加幾張圖片,以下圖spa
第四,設置按鈕參數OwnerDraw爲true,此參數說明,按鈕的繪製有使用者本身繪製。個人環境是VS2010,位置以下:code
第五,添加消息響應函數WM_DRAWITEM,相應用戶的按鍵操做,如圖blog
在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 {