VC MFC按钮(CButton)控件

前言:MFC可以看作是对WINDOWS API的一种封装,用面向对象,类封装的方法。里面就是各种类的集合,一个类库大全。

需要了解windows api 可参考:https://blog.csdn.net/d3582077/category_12546652.html?spm=1001.2014.3001.5482

按钮控件

1如何在按钮控件上显示图片

 首先确定你要显示在按钮控件的图片类型是什么,这里我是ico图标,由于要在按钮里显示ico图标,所以要把按钮控件的属性改一下,

方法是右击按钮控件,选择属性,单击样式选项卡,把图标这一项给勾上。

然后为这个按钮控件关联一个变量如:m_Quit,类型是"Control",以后不做说明的话,类型都是"Control".

按钮控件类(CButton)类里有个成员函数SetIcon可以设置按钮显示的图标,该函数只有一个参数,那就是图标句柄。

然后在对话框类的初始化函数(CFirstDlg::OnInitDialog)添加如下语句:

m_Quit.SetIcon((HICON)::LoadImage(NULL,"e:\\i.ico",IMAGE_ICON,48,48,LR_LOADFROMFILE));//假设E盘下有一个i.ico图标

上面的是从磁盘加载图标文件,关于LoadImage函数的用法,可以查看VC 常用函数第二十八函数个。

第二种根据图标ID加载:

先从磁盘导入一个图标到工程里,假设这个图标名为IDI_ICON1,不会导入?

首先进入ResourceView里,然后右击Icon选择插入,之后选择你要的图标。

之后添加这个语句:

m_Quit.SetIcon(LoadIcon(AfxGetResourceHandle(),MAKEINTRESOURCE(IDI_ICON1)));

记住语句添加的位置是在OnInitDialog函数所有代码之后,return TRUE;之前

2.实现鼠标停留在按钮上时显示提示信息

  前面说过如果不知道按按钮控件在控件面板里是哪个的话,把鼠标停留在控件面板的按钮上,就会有一个提示.那么这个功能是如何实现的呢?实现的方法其实也很简单。
 首先在对话框类(CFirstDlg)里添加一个m_ToolTip类对象(public:公有),如:CToolTipCtrl m_ToolTip;然后在对话框类里的OnInitDialog函数添加以下语句:
m_ToolTip.Create(this);
m_ToolTip.AddTool(&m_Quit,"文本信息");
其中m_Quit为按钮控件关联的变量
接着往对话框类添加一个虚函数,步骤是右击对话框类,选择Add Virtual Function。然后双击左边列表框里PreTranslateMessage,把它添加到右边的列表框,然后双击右边列表框里的PreTranslateMessage,这样我们就添加了虚函数,这个虚函数有一个参数MSG *pMsg;MSG这个结构在API常用函数里有解释。这里只是说一下这个函数意思,这个函数会截获所有发送到对应窗口的消息。
在这个函数添加这个语句:m_ToolTip.RelayEvent(pMsg);
完整的就是:
BOOL CFirstDlg::PreTranslateMessage(MSG* pMsg)
{
 // TODO: Add your specialized code here and/or call the base class
 m_ToolTip.RelayEvent(pMsg);
 return CDialog::PreTranslateMessage(pMsg);
}
接着编译,运行,鼠标停留在对应的按钮上,看一下,是不是出现了提示信息? 

3按钮控件自绘

自绘按钮控件的原理很简单,获取控件窗口的设备上下文(DC),然后调用相应的API画图函数进行控件自绘,所有能针对DC操作的API函数都能应用到控件里来,如Rectangle(画一个矩形),BitBlt(显示图片)函数等。

首先我们向工程导入两张位图,一张为按钮按下时显示的图片(ID号:IDB_SELECT),另一张为正常显示的图片(IDB_NORMAL)

两张位图:


我们知道按钮控件对应的类为CButton,所以我们得从这个类派生出一个类。
 派生CButton类的方法是进入ClassView选项卡,右击First Classes,选择New Class...,接着弹出了一个新建类对话框,Name项是你新建的类名称,这里类名取为CNewButton。Base class(基类)选CButton,点确定。此时First Classes下就多出了一个CNewButton类,是我们从按钮类(CButton)派生出的类。
接着给CNewButton添加虚函数DrawItem,添加虚函数方法在添加PreTranslateMessage虚函数的时候已经说明过了。
这个函数的定义如下:
void CNewButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
lpDrawItemStruct是一个DRAWITEMSTRUCT结构指针,这个结构在"网上收藏(转载)"里有介绍。

DrawItem函里的代码如下:

// TODO: Add your code to draw the specified item
 CDC dc;
 dc.Attach(lpDrawItemStruct->hDC);//CDC类里的ATTACH函数用于把HDC转换成CDC
 UINT state=lpDrawItemStruct->itemState;
 CRect ButtonRect;
 GetClientRect(&ButtonRect);//调用按钮类里的GetWindowRect函数获取按钮区域大小
 CDC memDC;
 memDC.CreateCompatibleDC(&dc);//创建兼容DC
 CBitmap bmp;
    if(state&ODS_SELECTED)//如果按钮按下
 {
  bmp.LoadBitmap(IDB_SELECT);//装载按下图片
 }
 else
 {
  bmp.LoadBitmap(IDB_NORMAL);
 }
 BITMAP bmpInfo;
 bmp.GetBitmap(&bmpInfo);//获取位图信息
 memDC.SelectObject(&bmp);//选入图片
 dc.StretchBlt(0,0,ButtonRect.right,ButtonRect.bottom,&memDC,
                 0,0,bmpInfo.bmWidth,bmpInfo.bmHeight,SRCCOPY);//显示图片
 CString str;
 GetWindowText(str);//获取按钮文本
 dc.SetBkMode(TRANSPARENT);//设置文字背景透明
 dc.DrawText(str,&ButtonRect,DT_CENTER|DT_VCENTER|DT_SINGLELINE);//输出按钮文本

 memDC.DeleteDC();
 bmp.DeleteObject();

 dc.Detach();

接着我们往对话框添加一个按钮,并为关联变量,在Add Member Variable对话框里,Variable type栏里选择类型为CNewButton.并把按钮控件的样式设置为"所有者绘制"

然后在对话框类里包含NewButton.h(派生下来的按钮类头文件):#include"NewButton.h"

接着我们编译,运行,效果如下图:

由于我们在上面只处理了按钮的两个状态,按下,和正常状态,所以当按钮获得焦点,或处于其它状态时,则没有对应的动作。

  • 16
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bczheng1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值