VC MFC按钮(CButton)控件

VC MFC按钮(CButton)控件

2012年11月11日 19:15   作者:TCEO   分类:技术文章   浏览:4,298

按钮控件

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”

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

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

时间: 2024-08-19 05:50:23

VC MFC按钮(CButton)控件的相关文章

[VC/MFC]虚拟列表控件

[VC/MFC]虚拟列表控件 一.什么是虚拟列表控件 虚拟列表控件是指带有LVS_OWNERDATA风格的列表控件.. 二.为什么使用虚拟列表控件 我们知道,通常使用列表控件CListCtrl,需要调用InsertItem把要显示的数据插入列表中,之后我们就不必关心数据在哪里了,这是因为控件自己开辟了内存空间来保存这些数据.现在假设我们要显示一个数据库,里面的信息量很大,有几十万条记录.通常有两种方法解决这个问题:1是仅仅在ListCtrl中插入少量的数据,比如100个,然后通过[上一页][下一

VC/MFC 在ListCtl 控件中随鼠标移动提示单元格信息

[cpp] view plaincopy BEGIN_MESSAGE_MAP(CTipListCtrl, CListCtrl) //{{AFX_MSG_MAP(CTipListCtrl) ON_WM_MOUSEMOVE() ON_WM_DESTROY() //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CTipLis

VC/MFC 使edit控件不能进行粘贴操作

[cpp] view plaincopy 这里使用消息拦截的方法 [cpp] view plaincopy BOOL PersonDlg::PreTranslateMessage(MSG* pMsg) { if (GetDlgItem(IDC_EDIT_USER_ID)->m_hWnd == pMsg->hwnd || GetDlgItem(IDC_EDIT_USER_NAME)->m_hWnd == pMsg->hwnd || GetDlgItem(IDC_EDIT_PHONE)

VC/MFC之ListCtrl控件使用经验总结

以下未经说明,listctrl默认view 风格为report 相关类及处理函数 MFC:CListCtrl类 SDK:以 "ListView_"开头的一些宏.如 ListView_InsertColumn -------------------------------------------------------------------------------- 1. CListCtrl 风格      LVS_ICON: 为每个item显示大图标      LVS_SMALLIC

MFC动态创建控件及添加消息响应

MFC动态创建控件及添加消息响应 分类: 控件技术2013-01-24 14:12 7020人阅读 评论(0) 收藏 举报 转载地址:http://blog.csdn.net/luy3728000/article/details/8193918 动态控件是指在需要时由Create()创建的控件,这与预先在对话框中放置的控件是不同的. 一.创建动态控件: 为了对照,我们先来看一下静态控件的创建. 放置静态控件时必须先建立一个容器,一般是对话框,这时我们在对话框编辑窗口中,从工具窗口中拖出所需控件放

MFC之ComboBox控件

添加内容 ComboBox_AddString(hwndCtl,lpsz) hwndCtl为此组合框的句柄,lpsz为需要添加的字符串,组合框不能直接通过id添加内容,所以需要得到这个控件的句柄,还得使用GetDlgItem()函数. 举例: HWND hwndCombo1 = GetDlgItem(hwnd,IDC_C1); //建立一个组合框,ID可以设置为IDC_C1,然后通过GetDlgItem获取这个组合框的句柄 //如果无法正常显示,需要调整此组合框的最大显示范围,在向下箭头上出现上

VC2005从开发MFC ActiveX ocx控件到发布到.net网站的全部过程

开篇语:最近在弄ocx控件发布到asp.net网站上使用,就是用户在使用过程中,自动下载安装ocx控件.(此文章也是总结了网上好多人写的文章,我只是汇总一下,加上部分自己的东西,在这里感谢所有在网上发表相关内容的朋友们.) ActiveX控件用于Web的过程是将控件嵌入主页中,用户通过浏览器访问该主页时,将主页中的控件下载,并在用户机器上注册,以后就可在用户的浏览器上运行.控件下载一次后就驻留在用户本地机器上,下次再访问相同的主页时,可不再下载该控件,而是直接运行用户本地的控件.这里控件容器就是

[activeX]VC2005开发MFC ActiveX ocx控件全过程[转]

ActiveX控件用于Web的过程是将控件嵌入主页中,用户通过浏览器访问该主页时,将主页中的控件下载,并在用户机器上注册,以后就可在用户的浏览器上运行.控件下载一次后就驻留在用户本地机器上,下次再访问相同的主页时,可不再下载该控件,而是直接运行用户本地的控件.这里控件容器就是浏览器,用户不需要通过浏览器调用控件的属性或方法.因此,开发面向Web的ActiveX控件比开发桌面的控件还要简单些,所复杂的是如何将该控件很好地嵌入主页,使用户能正常浏览.下面介绍这个问题. 一.        创建MFC

【VC编程技巧】控件?4.1位图Button

4.1位图Button 给按钮增加位图,或改变按钮字体,可以让按钮达到跟炫的效果:如何给按钮增加位图,和改变按钮上文字的字体?请看下面示例! 1>创建对话框程序,建立如下对话框: 图1 资源ID说明: 左边按钮ID:IDC_BUTTON1 右边按钮ID:IDCANCEL 2>设置button属性,设置选项如下图箭头处: 图2 3>添加位图到工程,如下图箭头处: 图3 4>给左边按钮添加控件变量(利用类向导); CBitmapButton m_bitmapButton; ※如果类向导