按钮控件函数
1如何在按钮控件上显示图片post
首先肯定你要显示在按钮控件的图片类型是什么,这里我是ico图标,因为要在按钮里显示ico图标,因此要把按钮控件的属性改一下,ui
方法是右击按钮控件,选择属性,单击样式选项卡,把图标这一项给勾上。this
而后为这个按钮控件关联一个变量如:m_Quit,类型是”Control”,之后不作说明的话,类型都是”Control”.指针
按钮控件类(CButton)类里有个成员函数SetIcon能够设置按钮显示的图标,该函数只有一个参数,那就是图标句柄。code
而后在对话框类的初始化函数(CFirstDlg::OnInitDialog)添加以下语句:对象
m_Quit.SetIcon((HICON)::LoadImage(NULL,”e:\i.ico”,IMAGE_ICON,48,48,LR_LOADFROMFILE));//假设E盘下有一个i.ico图标blog
上面的是从磁盘加载图标文件,关于LoadImage函数的用法,能够查看VC 经常使用函数第二十八函数个。图片
第二种根据图标ID加载:ip
先从磁盘导入一个图标到工程里,假设这个图标名为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”
接着咱们编译,运行,效果以下图:
因为咱们在上面只处理了按钮的两个状态,按下,和正常状态,因此当按钮得到焦点,或处于其它状态时,则没有对应的动做。