当前位置:

首页 > 技术文章

VC MFC按钮(CButton)控件

按钮控件

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”

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

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

本文引用地址: