MFC自绘按钮 动态效果

来源:互联网 发布:python数组减1 编辑:程序博客网 时间:2024/06/01 21:51

最近项目需要实现按钮的动态效果,多方学习,现在终于能实现一些功能了。

过程如下:

  第一,新建一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()//video210 {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);//得到用于绘制按钮的DC26     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         {
复制代码