最近项目须要实现按钮的动态效果,多方学习,如今终于能实现一些功能了。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 {