QQ登录

只需一步,快速开始

51上位机VC MFC实现自绘的图文按钮

[ 复制链接 ]

51上位机VC MFC实现自绘的图文按钮

51上位机VC MFC实现自绘的图文按钮

51上位机VC MFC实现自绘的图文按钮


功能展示

按钮是我们程序中极为常用的控件,自绘是我们美化控件常用的方法,图文并茂的按钮MFC并不自带,得我们自行完成,我们当前例程用自绘方法实现了图文并茂的功能,效果如图
要点提示
在MFC中实现控件的自绘可以通过控件的DrawItem函数来实现:virtual void DrawItem( LPDRAWITEMSTRUCT lpDrawItemStruct );当控件带有属性BS_OWNERDRAW时,应用程序就会自动调用DrawItem函数,实现我们按钮的自绘; BS_OWNERDRAW风格可以在对话框资源中对控件进行设置,也可以在自己派生的控件类中添加一个函数PreSubclassWindow()再函数内部调用ModifyStyle(0,BS_OWNERDRAW)实现属性的设置;
LPDRAWITEMSTRUCT带有系统返回的一些自信供我们使用,其结构成员有CtlType表示控件类型 值可以为ODT_BUTTON ODT_COMBOBOX ODT_LISTBOXODT_LISTVIEW ODT_MENU ODT_STATIC ODT_TAB; CtlID表示控件的ID;itemID表示菜单项ID或列表框,组合框 中的项目索引;ItemAction表示绘制的动作,可选值为ODA_DRAWENTIRE 整个旁若无人要被绘制时设置该标识;ODA_FOCUS控件获得或失去焦点时设置该标识; ODA_SELECT控件 处于选中状态时设置该标识;
itemState 表示需要绘画的状态,可选值如下ODS_CHECKED The menu item is to bechecked. This bit is used only in a menu. ODS_COMBOBOXEDIT The drawing takesplace in the selection field (edit control) of an owner-drawn combo box.ODS_DEFAULT The item is the default item. ODS_DISABLED The item is to be drawnas disabled. ODS_FOCUS The item has the keyboard focus. ODS_GRAYED The item isto be grayed. This bit is used only in a menu. ODS_SELECTED The menu item‘sstatus is selected.; hwndItem 表示控件的句柄; hDC  表示控件的DC; rcItem 表示控件的矩形区域; itemData 控件的附加信息;

实现功能
1.新建基于对话框的应用程序
2.从Cbutton派生一个自已的类CImageBtn;并添加三个变量private:CImageList*m_pImagelist;  //图像列表指针 int        m_nImageIndex; //图标索引BOOL        m_bIsPressed; //按钮是否被按下;构造函数中初始化m_bIsPressed = FALSE;

3.添加另两个变量的设置函数
  1. void CImageBtn::SetImageIndex(UINT index)
  2. {
  3.         m_nImageIndex = index;
  4. }

  5. void CImageBtn::SetImageList(CImageList *pImage)
  6. {
  7.         m_pImagelist = pImage;
  8. }
复制代码
3.添加与处理鼠标按下,放开,移动及控件子类化消息消息

  1. void CImageBtn::OnLButtonDown(UINT nFlags, CPoint point)
  2. {
  3.         m_bIsPressed = TRUE;
  4.         CButton::OnLButtonDown(nFlags, point);
  5. }
  6. void CImageBtn::OnLButtonUp(UINT nFlags, CPoint point)
  7. {
  8.         m_bIsPressed = FALSE;
  9.         CButton::OnLButtonUp(nFlags, point);
  10. }
  11. void CImageBtn::OnMouseMove(UINT nFlags, CPoint point)
  12. {
  13.         CRect rect;
  14.         GetClientRect(rect);
  15.         if (!rect.PtInRect(point)) //判断当前鼠标点是否在按钮区域内
  16.         {
  17.                 if (m_bIsPressed) //如果鼠标不在按钮的区域内,并且按钮处于按下状态,将按钮设置为正常状态
  18.                         m_bIsPressed = FALSE;
  19.         }
  20.         CButton::OnMouseMove(nFlags, point);
  21. }
  22. void CImageBtn::PreSubclassWindow()
  23. {
  24.         ModifyStyle(0,BS_OWNERDRAW);
  25.         CButton::PreSubclassWindow();
  26. }
复制代码
4.添加自绘函数DrawItem
  1. void CImageBtn::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
  2. {
  3.         CDC dc ;
  4.         dc.Attach(lpDrawItemStruct->hDC);        
  5.         if (m_pImagelist)
  6.         {
  7.                 UINT state = lpDrawItemStruct->itemState; //获取状态
  8.                 UINT action = lpDrawItemStruct->itemAction;
  9.                 //获取图像列中图像大小
  10.                 IMAGEINFO imageinfo;
  11.                 m_pImagelist->GetImageInfo(m_nImageIndex,&imageinfo);
  12.                 CSize imagesize;
  13.                 imagesize.cx = imageinfo.rcImage.right-imageinfo.rcImage.left;
  14.                 imagesize.cy = imageinfo.rcImage.bottom - imageinfo.rcImage.top;
  15.                 //在按钮垂直方向居中显示位图
  16.                 CRect rect;
  17.                 GetClientRect(rect);
  18.                 CPoint point;
  19.                 point.x = 5;
  20.                 point.y = (rect.Height() - imagesize.cy)/2;
  21.                 m_pImagelist->Draw(&dc,m_nImageIndex,point,ILD_NORMAL|ILD_TRANSPARENT);
  22.                 //按钮被选中或者获得焦点时
  23.                 if ((state&ODS_SELECTED)||(state&ODS_FOCUS))
  24.                 {               
  25.                         CRect focusRect (rect); //焦点矩形
  26.                         focusRect.DeflateRect(4,4,4,4);
  27.                         CPen pen(PS_DASHDOTDOT,1,RGB(0,0,0));
  28.                         CBrush brush;
  29.                         brush.CreateStockObject(NULL_BRUSH);
  30.                         dc.SelectObject(&brush);
  31.                         dc.SelectObject(&pen);
  32.                         //绘制焦点矩形
  33.                         dc.DrawFocusRect(focusRect);
  34.                         //绘制立体效果
  35.                         dc.DrawEdge(rect,BDR_RAISEDINNER|BDR_RAISEDOUTER,BF_BOTTOMLEFT|BF_TOPRIGHT);                        
  36.                         //获得焦点时绘制黑色边框
  37.                         dc.Draw3dRect(rect,RGB(51,51,51),RGB(0,0,0));
  38.                 }
  39.                 else  //默认情况下
  40.                 {
复制代码
  1.         
  2.                         CRect focusRect (rect);
  3.                         focusRect.DeflateRect(4,4,4,4);               
  4.                         CPen pen(PS_DOT,1,RGB(192,192,192));
  5.                         CBrush brush;
  6.                         brush.CreateStockObject(NULL_BRUSH);
  7.                         dc.SelectObject(&brush);
  8.                         dc.SelectObject(&pen);
  9.                         dc.Rectangle(focusRect);                        
  10.                         dc.DrawEdge(rect,BDR_RAISEDINNER|BDR_RAISEDOUTER,BF_BOTTOMLEFT|BF_TOPRIGHT);        
  11.                 }
  12.                 if (m_bIsPressed) //在按钮被按下时绘制按下效果
  13.                 {

  14.                         CRect focusRect1(rect);
  15.                         focusRect1.DeflateRect(4,4,4,4);
  16.                         dc.DrawFocusRect(focusRect1);                        
  17.                         dc.DrawEdge(rect,BDR_SUNKENINNER |BDR_SUNKENOUTER ,BF_BOTTOMLEFT|BF_TOPRIGHT);

  18.                         dc.Draw3dRect(rect,RGB(51,51,51),RGB(0,0,0));        
  19.                         //dc.DrawFocusRect(focusRect1);
  20.                 }
  21.                 //绘制按钮文
  22.                 CString text;
  23.                 GetWindowText(text);
  24.                 rect.DeflateRect(point.x+imagesize.cx+2,0,0,0);
  25.                 dc.SetBkMode(TRANSPARENT);
  26.                 dc.DrawText(text,rect,DT_LEFT|DT_SINGLELINE|DT_VCENTER);
  27.         }
  28. }
复制代码
5.在主对话框中添加一个CImageList m_images;和几个按钮关联CImageBtn变量,并初始化设置  m_images.Create(24,24,ILC_COLOR24|ILC_MASK,1,0);
  m_images.Add(AfxGetApp()->LoadIcon(IDI_ICON1));
  m_images.Add(AfxGetApp()->LoadIcon(IDI_ICON2));
  m_images.Add(AfxGetApp()->LoadIcon(IDI_ICON3));
  m_images.Add(AfxGetApp()->LoadIcon(IDI_ICON4));

  m_Btn.SetImageList(&m_images);
  m_Btn2.SetImageList(&m_images);
  m_Btn3.SetImageList(&m_images);
  m_Btn4.SetImageList(&m_images);

  //设置按钮显示的图像索引
  m_Btn.SetImageIndex(0);
  m_Btn2.SetImageIndex(1);
  m_Btn3.SetImageIndex(2);
  m_Btn4.SetImageIndex(3);
我们来演示下功能实现过程

请点击此处下载

请先注册会员后在进行下载

已注册会员,请先登录后下载

文件名称:51.上位机VC MFC实现自绘的图文按钮.rar 
文件大小:143.52 KB  售价:10金币
下载权限: 不限 以上或 VIP会员   [购买捐助会员]   [充值积分]   有问题联系我

  

您的支持是我们创作的动力!  

  

您可花点闲钱积分自助任意充值

  

成为VIP会员 全站资源任意下载永久更新!


回复

使用道具 举报

点击查看
快速回复 返回列表 客服中心 搜索