MFC自绘按钮的实现,按钮动态效果

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