今天汇总下MFC中Button的常用技巧
上图片
按照惯例先拖进Dialog中
1.常规Button控件——按钮
添加方式拖拽,属性界面可以改ID,可以改显示内容;
(1) 设置/获取 文本 : SetWindowText()/GetWindowText()
(2) 设置图标:button类是不能设置背景色或背景图片的,只能设置"图标" + “文本” 的格式
双击添加响应事件OnBnClickedButton1()。
按钮是常用的控件,可以用来实现各种交互式指令。这里样例展示的是按钮1按下,按钮2可以被选中,同时在静态文本框中显示操作内容。
代码
void CMFCDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
GetDlgItem(IDC_BUTTON2)->EnableWindow(TRUE);
GetDlgItem(IDC_BUTTON1)->EnableWindow(FALSE);
SetDlgItemTextW(IDC_STATIC_LOG, _T("BUTTON1被按下"));
}
void CMFCDlg::OnBnClickedButton2()
{
// TODO: 在此添加控件通知处理程序代码
GetDlgItem(IDC_BUTTON1)->EnableWindow(TRUE);
GetDlgItem(IDC_BUTTON2)->EnableWindow(FALSE);
SetDlgItemTextW(IDC_STATIC_LOG, _T("BUTTON2被按下"));
}
2.Radio Button Control控件
这不是什么收音机,无线电,这个是单选按钮。提供由两个或多个互斥选项组成的选项集,供你选择。就像做单选题,你只能选择其中一个选项。
当单击 RadioButton 控件时,其 Checked 属性设置为 true,同时调用 Click 事件处理程序。当 Checked 属性的值更改时,将引发 CheckedChanged 事件。
控件内显示的文本使用 Text 属性进行设置,该属性可以包含访问键快捷方式。也可以使用指令
SetDlgItemText( IDC_XXX, TEXT(“我是控件显示的文字”) );
拖拽控件到对话框里
这里建了五个,按照行分两组。
因为是单选按钮,分组时按照控件顺序来,在资源界面Ctrl+D可以看控件顺序,也可以按照想要的顺序进行单击控件排序。
这里radio1,radio2,radio5,分别对应5,6,7;
radio3,radio4,分别对应8,9。这里我手动改过顺序,将radio5的次序排到radio3和radio4前边。目的是为了将radio1,radio2和radio5放在一组。
设置分组。选中radio1控件,打开属性界面,将【Group】/【组】的属性置为true;radio3也一样设置,其他radio都为false;这样就完成了分组。在类向导成员变量里只能看到IDC_RADIO1和IDC_RADIO3。
分别给每个radio添加单击事件OnBnClickedRadio(),双击控件完成添加;
void CMFCDlg::OnBnClickedRadio1()
{
// TODO: 在此添加控件通知处理程序代码
//SetDlgItemTextW(IDC_STATIC_LOG, _T("Radio1被选中"));
int radioID = myRadioCtrl.GetCheck();
int radioID2 = myRadioCtrl2.GetCheck();
int radioID3 = myRadioCtrl.GetCheck();
int radioID4 = myRadioCtrl2.GetCheck();
int radioID5 = myRadioCtrl.GetCheck();
CString str;
str.Format(_T("Radio控件选中情况是\rRadio1-%d\rRadio2-%d\rRadio3-%d\rRadio4-%d\rRadio5-%d\r"),
radioID, radioID2,radioID3, radioID4, radioID5);
SetDlgItemTextW(IDC_STATIC_LOG, _T("Radio1被选中\r") + str);
}
void CMFCDlg::OnBnClickedRadio2()
{
// TODO: 在此添加控件通知处理程序代码
//SetDlgItemTextW(IDC_STATIC_LOG, _T("Radio2被选中"));
int radioID = myRadioCtrl.GetCheck();
int radioID2 = myRadioCtrl2.GetCheck();
int radioID3 = myRadioCtrl.GetCheck();
int radioID4 = myRadioCtrl2.GetCheck();
int radioID5 = myRadioCtrl.GetCheck();
CString str;
str.Format(_T("Radio3被选中\rRadio控件选中情况是\rRadio1-%d\rRadio2-%d\rRadio3-%d\rRadio4-%d\rRadio5-%d\r"), radioID, radioID2, radioID3, radioID4, radioID5);
SetDlgItemTextW(IDC_STATIC_LOG, str);
}
void CMFCDlg::OnBnClickedRadio3()
{
// TODO: 在此添加控件通知处理程序代码
//SetDlgItemTextW(IDC_STATIC_LOG, _T("Radio3被选中"));
CString str;
str.Format(_T("Radio3被选中\rRadio控件选中情况是\rRadio1-%d\rRadio2-%d\rRadio3-%d\rRadio4-%d\rRadio5-%d\r"),
myRadioCtrl.GetCheck(), myRadioCtrl2.GetCheck(), myRadioCtrl3.GetCheck(), myRadioCtrl4.GetCheck(), myRadioCtrl5.GetCheck());
SetDlgItemTextW(IDC_STATIC_LOG, str);
}
void CMFCDlg::OnBnClickedRadio4()
{
// TODO: 在此添加控件通知处理程序代码
//SetDlgItemTextW(IDC_STATIC_LOG, _T("Radio4被选中"));
CString str = RadioLogShow(_T("Radio4"));
SetDlgItemTextW(IDC_STATIC_LOG, str);
}
效果展示
分别给radio1,radio3添加int型变量
int m_RadioValue;
int m_RadioValue2;
控件传递的值将变为,每组radio中选中的是第几个控件。如第一组中radio1对应0;radio2对应1,radio5对应2。
这里设计了button按钮进行指令显示
UpdateData(TRUE);
CString str;
str.Format(_T("第一组选中ID是%d\r第二组选择ID是%d。\r"), m_RadioValue, m_RadioValue2);
SetDlgItemTextW(IDC_STATIC_LOG, str);
3.Slipt Button Control控件
Split Button实际上是Button跟Menu的组合,样式跟Windows关机按钮一样,点击可以展开菜单按钮,再分别选择其他功能按钮
老规矩,先拖一个Slipt Button到Dialog里。设定变量CSplitButton 类型的变量
CSplitButton mySplitBtn;
双击按钮创建命令。随便写点什么。比如
void CMFCDlg::OnBnClickedSplit1()
{
// TODO: 在此添加控件通知处理程序代码
AfxMessageBox(_T("Split按钮被选中"));
}
然后,它是什么?【Button跟Menu的组合】,搞一个Menu出来。
打开资源视图,右键项目,点击【添加资源(A)…】,在弹出的对话框里选择Menu
进入下图的界面,键入内容。看心情添加。这里参照了VS的工具栏。
然后给打开添加个COMMAND做测试。右键【打开】->【添加事件处理程序(A)…】
重点来了这里一定要在类列表里选择你控件所在的Dialog类。然后再点确定,默认是消息对话框的CAboutDlg类,如果你创建项目的时候有勾选。
编辑命令
void CMFCDlg::OnOpenFile()
{
// TODO: 在此添加命令处理程序代码
CFileDialog fileDialog(
TRUE, // TRUE表示要选择文件夹,FALSE则为选择文件
NULL, // 使用默认的文件扩展名
NULL, // 使用默认的初始目录
OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST, // 设置文件必须存在和路径必须有效的条件
NULL, // 使用默认的过滤器
NULL // 不指定父窗口
);
// 显示对话框
if (fileDialog.DoModal() == IDOK)
{
CString selectedFolderPath = fileDialog.GetPathName(); // 获取选中的文件夹路径
// 处理选中的文件夹路径
}
}
这样就编辑完了,展示效果
单击效果
下键选择效果
欲知剩余Button,请看下篇介绍。