• 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         {
  • 相关阅读:
    Machine learning 第8周编程作业 K-means and PCA
    Machine learning 第7周编程作业 SVM
    Machine learning第6周编程作业
    Machine learning 第5周编程作业
    小M的作物 最小割最大流
    k-近邻算法 python实现
    编辑距离 区间dp
    Machine learning第四周code 编程作业
    MDK5报错missing closing quote
    HDU 5512
  • 原文地址:https://www.cnblogs.com/songliquan/p/3313672.html
Copyright © 2020-2023  润新知