本文需要的主要工具:
VC6.0
MSDN
MFC类库详解(网上可以下载,对于英文不过关的人很方便) 等等…
本例源代码:vc++按钮应用大全
I按钮应用大全
按钮是最常用的控件,使用也比较简单,因此介绍控件的用法就从按钮开始。本文计划通过四个阶段对按钮的使用进行详细阐述,即基础、进阶、高级、特殊。
(一)在视图中创建按钮
示例程序:Button
1、普通按钮
在视图中创建按钮非常简单,需要以下步骤:
(1)在视图类中定义成员变量或CButton指针
在CButtonView类上点击右键,选择Add Member Variable…,添加成员变量m_Btn,*p_Btn;
(2)为按钮分配ID号
我们可以为按钮分配超过100以上的任意ID号,但是规范的做法是在资源视图中选择String Table,在其中添加资源ID及其注解或标题。
(图I-1)
(3)为视图类添加windows消息处理函数OnCreate(…)
一个窗口创建之后发送的第一个消息就是WM_CREATE消息,其消息响应函数为OnCreate(),因此在这个函数中创建按钮最合适。在CButtonView类上点击右键,选择Add Windows Message Handle…,在生成的对话框中选择WM_CREATE消息,生成函数。
(4)首先获取资源中按钮的标题(当然也可以用任意标题,例如第二个按钮),如果定义的是成员变量,则直接调用Create函数创建按钮;如果是指针,则先new一个对象,然后用Create函数创建按钮。
在OnCreate函数中添加如下代码(附注释):
//定义字符串,用来存储按钮标题
CString str_push1;
//获取按钮1标题
str_push1.LoadString(IDC_BUTTON_PUSH1);
//创建按钮1
m_Btn.Create(str_push1,WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_PUSHBUTTON ,CRect(10,10,200,60),
this,IDC_BUTTON_PUSH1);
//生成按钮对象
p_Btn=new CButton();
//创建按钮2
p_Btn->Create(_T("第二个按钮"),WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_PUSHBUTTON ,CRect(10,70,200,120),
this,IDC_BUTTON_PUSH2);
Create函数具体用法这里就不赘述了,需要注意的是,按钮窗口风格包括以下内容:
BS_3STATE 与复选框一样本样式按钮可被单击变暗。变暗状态通常用于指示本样式的按键正处于禁用状态。
*.
BS_AUTO3STATE 与三状态的复选框一样当用户选中它本按钮样式状态外观会改变。
*.
BS_AUTOCHECKBOX 与复选框一样,除了在用户点控件后会出现一个选中标志,当用户在下一次点选时,该标志会消失。
*.
BS_AUTORADIOBUTTON 与单先框一样,不同的是,用户点选它时会高亮显示,同时,会把同一组的其它同样的按钮的高亮状态转移到自己身上。
*.
BS_BITMAP 指定按钮以一张位图显示。
*.
BS_BOTTOM 把按钮标题放置到按钮矩形区域的底部。
*.
BS_CENTER 按钮标题在按钮的矩形区域中央显示。
*.
BS_CHECKBOX 在按钮的右边创建一个小方块(此样式必须与BS_LEFTTEXT结合使用。)
*.
BS_DEFPUSHBUTTON 创建一个通用的默认按钮该按钮有一个厚重的黑色边框。用户可以通过按回车键来点选本按钮,该按钮可以实现用户通常要使用的功能(即默认执行动作功能)。
*.
BS_FLAT 指定按钮为2D按钮,不采用3D控件所使用的阴影。
*.
BS_GROUPBOX 创建一个分组框来给控件分组,如果使用了标题,则标题会出现在分组框的左上角位置。
*.
BS_ICON 指定按钮上显示一个图标。
*.
BS_LEFT 在控件的矩形区域内左对齐标题。如果按钮是一个没有 BS_RIGHTBUTTON 样式的复选框或单选框 ,那么文本居将在复选框或单选框的右边居左对齐(这话有些多余,意思文本在复选框或单选框的那个可选被小方框或圆圈的右边。)。
*.
BS_LEFTTEXT 当按钮是单选或是复选框时,标题文本将出现在单选或复选框的客户区(即复选框的矩形框,单选框的圆形框)的左边。
*.
BS_MULTILINE 如果标题文本太长,将在绘制区域内对文本进行折行处理。
*.
BS_NOTIFY 激活按钮,使之可对父窗口发送BN_DBLCLK, BN_KILLFOCUS, BN_SETFOCUS 消息,注意:不管有没有使用本样式,按钮都有一个 BN_CLICKED 可发送消息。
*.
BS_OWNERDRAW 创建一个自绘风格的按钮。当按钮的外观发生改变时,框架会调用DrawItem成员函数。本样式在使用CBitmapButton类时必须设置。
*.
BS_PUSHBUTTON 创建一个按钮(即最常见的按钮),该按钮在点击时,将向父窗口发送一个WM_COMMAND 消息。
*.
BS_PUSHLIKE 把(多选框,三态多选框,单选框)以按钮的形式显示,该按钮在未选种状态时是浮起的,但在选中状态时是陷入状态的。
*.
BS_RADIOBUTTON 创建单选框,该按钮有一个圆形的客户区,(在本样式不与 BS_LEFTTEXT 样式结合使用的情况下)标题文本在其右方。单选框通常用于有相关联的多个可选项里面,但相互之间只有作一个选择的情况下。
*.
BS_RIGHT 在按钮的绘制区域内右对齐文本。但如果按钮是一个没有BS_RIGHTBUTTON样式的单选或复选框,标题文本将在单选或复选框可点选区的右边居右对齐。
*.
BS_RIGHTBUTTON 设定单选框的圆形可选区或复选框的方开形复选区出现在按钮的矩形区域的右边。与 BS_LEFTTEXT 的效果一样。
*.
BS_TEXT 指定按钮将显示文本标题。
*.
BS_TOP 将标题文本显示在按钮的绘制区域的顶边。
*.
BS_USERBUTTON 已废弃不用,只作为兼容16位系统版本的Windows,基于32位windows系统的请用 BS_OWNERDRAW 样式取代。
*.
BS_VCENTER 设定按钮的标题在绘制区域的垂直方向居中。
我们可以使用上述按钮风格的组合,创造出不同样式和种类的按钮。
(5)使用指针的情况下,在析构函数中释放对象。
delete p_Btn;
2、复选按钮
创建复选按钮的方法与普通按钮相同,只需要调整按钮风格即可,创建代码如下:
//创建三态复选按钮
m_BtnC.Create(_T("三态复选按钮"),WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_AUTO3STATE,CRect(10,130,200,180),this,IDC_BUTTON_CHECK);
3、单选按钮
创建方法与前类似,但是由于单选按钮往往是成组出现的,需注意创建时第一个按钮必须加上windows风格WS_GROUP。创建代码如下:
//创建单选按钮1
m_BtnR1.Create(_T("单选按钮1"),WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_AUTORADIOBUTTON | WS_GROUP,CRect(10,190,200,240), this,IDC_BUTTON_RADIO1);
//创建单选按钮2
m_BtnR2.Create(_T("单选按钮2"),WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_AUTORADIOBUTTON,CRect(10,250,200,300),
this,IDC_BUTTON_RADIO2);
(二)为按钮添加消息响应函数
由于是动态创建的按钮,因此不能简单的使用ClassWizard添加消息响应函数,只能手动添加,以第一个按钮为例,添加单击消息响应函数步骤如下:
(1)在MESSAGE_MAP中添加响应函数。
ON_BN_CLICKED(IDC_BUTTON_PUSH1,OnBtnClk)
(2)在头文件中添加函数定义。
//消息响应函数定义
afx_msg void OnBtnClk();
(3)正常编写消息响应函数的实现部分。例如:
void CButtonView::OnBtnClk()
{
MessageBox(_T("点击了普通按压式按钮!"));
}
运行效果如图I-2
前文已经对按钮的创建和使用方法进行了介绍,通过上文我们已经可以在自己的程序中使用按钮了,但是如果想要更好的运用按钮,还必须对其中的函数有比较深刻的了解。
(一)按钮的成员函数
CButton类的成员函数比较少,而且简单,主要包括获取按钮状态(或风格)和设置按钮状态(或风格)两个方面内容。另外还有一个DrawItem()函数,在高级应用中我们将重点讲到它。按钮的成员函数主要包括如下内容:
函数名称 |
用途 |
GetState |
检索按钮控件的选中状态、加亮状态和获得焦点状态 |
SetState |
设置按钮控件的加亮状态 |
GetCheck |
检索按钮控件的选中状态 |
SetCheck |
设置按钮控件的选中状态 |
GetButtonStyle |
检索按钮控件的风格 |
SetButtonStyle |
设置按钮控件的风格 |
GetIcon |
检索此前调用SetIcon设置的图标句柄 |
SetIcon |
指定一个在按钮上显示的图标 |
GetBitmap |
检索此前调用SetBitmap设置的位图的句柄 |
SetBitmap |
设置在按钮上显示的位图 |
GetCursor |
检索此前调用SetCursor设置的光标图像的句柄 |
SetCursor |
设置在 |