文章目录
MFC对话框的创建实例
对话框程序的创建过程:
对话框应用程序框架介绍
设计界面和工具箱
MFC常用控件
静态文本框CStatic
普通按钮 CButton
编辑框 CEdit
组合框(下拉框)CComboBox
列表控件 CListCtrl
树控件 CTreeCtrl
标签控件 CTabCtrl
综合案例
项目总体框架
文件处理
登录对话框
静态拆分窗口
左侧选择界面树视图实现
功能节点消息处理
个人信息管理窗口
销售管理窗口
库存信息窗口
库存添加窗口
库存删除窗口
菜单栏实现
最终实现
MFC对话框的创建实例
对话框程序的创建过程:
- 选择“文件 | 新建 | 项目”菜单;
- 在“新建项目”对话框中,选择“ MFC 应用程序 ”,输入工程名称,选择“确定”。
- 选择“ 基于对话框”,即创建基于对话框的应用程序,选择“完成”。
对话框应用程序框架介绍
资源视图
用 AppWizard 创建基于对话框的应用程序框架(假定工程名为 Dialog )后,项目工作区上增加了一个“资源视图”选项卡。
或者,通过视图找到“资源视图”选项卡:
在 MFC中,与用户进行交互的对话框界面被认为是一种资源。展开“Dialog”,可以看到有一个ID为IDD_ DIALOG _DIALOG(中间部分(DIALOG)与项目名称相同)的资源,对应中间的对话框设计界面。不管在何时,只要双击对话框资源的ID,对话框设计界面就会显示在中间。
类视图
在类视图中,可以看到生成了3 个类:CAboutDlg、CDialogApp和CDialogDlg。
- CAboutDlg:对应生成的版本信息对话框。
- CDialogApp:应用程序类,从 CWinApp 继承过来,封装了初始化、运行、终止该程序的代码。
- CDialogDlg:对话框类,从CdialogEx继承过来的,在程序运行时看到的对话框就是它的一个具体对象。
- DoDataExchange函数:该函数主要完成对话框数据的交换和校验。
- OnInitDialog函数:相当于对对话框进行初始化处理。
设计界面和工具箱
模态对话框
当模态对话框显示时,程序会暂停执行,直到关闭这个模态对话框之后,才能执行程序中的其他任务。
- 1)通过工具箱在界面上放一个Button,双击此按钮即可跳转到按钮处理函数:
//按钮处理函数 void CDialogDlg::OnBnClickedButton1() { // TODO: 在此添加控件通知处理程序代码 }
- 2)资源视图 -> Dialog -> 右击 -> 插入 Dialog:
3)修改对话框ID:
4)点击对话框模板 -> 右击 -> 添加类:
5)类视图中多了一个自定义类:
6)按钮处理函数创建对话框,以模态方式运行。
实现模态对话框的创建需要调用CDialog类的成员函数CDialog::DoModel,该函数的功能就是创建并显示一个对话框:
//启动模态对话框按钮 void CDialogDlg::OnBnClickedButton1() { //需要包含头文件:#include "DlgExec.h" CDlgExec dlg; dlg.DoModal(); //以模态方式运行 }
非模态对话框
当非模态对话框显示时,运行转而执行程序中的其他任务,而不用关闭这个对话框。
图形界面操作过程和模态对话框一样,只是,非模态对话框实现方式不一样,先创建(CDialog::Create)一次,然后再显示(CWnd::ShowWindow)。
- 1)主对话框.h类中声明对话框对象:
- 2)创建对话框放在主对话框类的构造函数或OnCreate()函数,目的只创建一次对话框:
//主对话框构造函数 CDialogDlg::CDialogDlg(CWnd* pParent /*=NULL*/) : CDialogEx(CDialogDlg::IDD, pParent) { m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); m_dlg.Create(IDD_DIALOG_SHOW); //IDD_DIALOG_SHOW为对话框ID }
- 3)按钮处理函数显示对话框:
//启动非模态对话框按钮 void CDialogDlg::OnBnClickedButton2() { // TODO: 在此添加控件通知处理程序代码 m_dlg.ShowWindow(SW_SHOWNORMAL); //显示非模态对话框 }
MFC常用控件
静态文本框CStatic
静态文本框是最简单的控件,它主要用来显示文本信息,不能接受用户输入,一般不需要连接变量,也不需要处理消息。
静态文本框的重要属性有:
- ID:所有静态文本框的缺省ID都是IDC_STATIC,静态ID,不响应任何消息(事件)
- Caption:修改显示的内容
接口 功能
CWnd::SetWindowText 设置控件内容
CWnd::GetWindowText 获取控件内容
CStatic::SetBitmap 设置位图(后缀为bmp的图片)
关联控件变量
由于XXX_STATIC静态ID是不能关联变量,故需把ID修改后,再关联变量:
在主对话框类OnInitDialog()中,完成相应接口测试:
//设置静态控件内容为Tom m_label.SetWindowText(TEXT("Tom")); //获取静态控件的内容 CString str; m_label.GetWindowText(str); MessageBox(str); //设置静态控件窗口风格为位图居中显示 m_label.ModifyStyle(0xf, SS_BITMAP | SS_CENTERIMAGE); //通过路径获取bitmap句柄 #define HBMP(filepath,width,height) (HBITMAP)LoadImage(AfxGetInstanceHandle(),filepath,IMAGE_BITMAP,width,height,LR_LOADFROMFILE|LR_CREATEDIBSECTION) //静态控件设置bitmap m_label.SetBitmap(HBMP(TEXT("./1.bmp"), 300, 250));
普通按钮 CButton
按钮是最常见的、应用最广泛的一种控件。在程序执行期间,当单击某个按钮后就会执行相应的消息处理函数。
按钮的主要属性是Caption,来设置在按钮上显示的文本。
命令按钮处理的最多的消息是:BN_CLICKED,双击按钮即可跳转到处理函数。或者,通过按钮属性 -> 控制事件 -> 选择所需事件,添加处理函数:
//按钮BN_CLICKED事件处理函数 void CMFCApplication2Dlg::OnBnClickedButton1() { // TODO: 在此添加控件通知处理程序代码 }
常用接口:
接口 功能
CWnd::SetWindowText 设置控件内容
CWnd::GetWindowText 获取控件内容
CWnd::EnableWindow 设置控件是否变灰
关联控件变量
在主对话框类OnInitDialog()中,完成相应接口测试:
//获取按钮的内容 CString str; m_button.GetWindowText(str); MessageBox(str); //设置按钮内容 m_button.SetWindowText(TEXT("^_^")); //设置按钮状态为灰色 m_button.EnableWindow(FALSE); m_button.EnableWindow(TRUE);
编辑框 CEdit
常用属性设置:
属性 含义
Number True只能输入数字
Password True密码模式
Want return True接收回车键,自动换行,只有在多行模式下,才能换行
Multiline True多行模式
Auto VScroll True 当垂直方向字符太多,自动出现滚动条,同时设置Vertical Scroll才有效
Vertical Scroll True当垂直方向字符太多,自动出现滚动条,和Auto VScroll配合使用
Horizontal Scroll True当垂直方向字符太多,自动出现滚动条,和Auto HScroll配合使用
Read Only True 只读
常用接口:
接口 功能
CWnd::SetWindowText 设置控件内容
CWnd::GetWindowText 获取控件内容
关联控件变量
在主对话框类OnInitDialog()中,完成相应接口测试:
//设置按钮内容 m_edit.SetWindowText(TEXT("this is a test")); //获取按钮的内容 CString str; m_edit.GetWindowText(str); MessageBox(str);
管理基本类型变量
若一个编辑框连接了一个Value类别的变量,则该变量就表示这个编辑框,编辑框中显示的内容就是变量的值。
但是,改变了编辑框的内容并不会自动更新对应的变量的值,同样,改变了变量的值也不会自动刷新编辑框的内容。若要保持一致,需要使用UpdateData()函数更新:
- 若编辑框的内容改变了,则应使用语句UpdateData(TRUE) 获取对话框数据
- 若变量的值改变了,则应使用语句UpdateData(FALSE) 初始化对话框控件
在主对话框类OnInitDialog()中,完成相应代码测试:
m_e1 = 10.11; UpdateData(FALSE); //FALSE说明把m_e1的值更新到对应的控件中 UpdateData(TRUE); //TRUE说明把控件的值更新到m_e1变量中
组合框(下拉框)CComboBox
常用属性设置:
属性 含义
data 设置内容,不同内容间用英文的分号“;”分隔
type 显示风格
Sort True 内容自动排序
常用接口:
接口 功能
CComboBox::AddString 组合框添加一个字符串
CComboBox::SetCurSel 设置当前选择项(当前显示第几项),下标从0开始
CComboBox::GetCurSel 获取组合框中当前选中项的下标
CComboBox::GetLBText 获取指定位置的内容
CComboBox::DeleteString 删除指定位置的字符串
CComboBox::InsertString 在指定位置插入字符串
关联控件变量后,测试接口:
//添加字符串内容 m_combo.AddString(TEXT("可乐")); m_combo.AddString(TEXT("雪碧")); m_combo.SetCurSel(1);//显示显示第1项 //获取组合框中当前选中项的下标 int index = m_combo.GetCurSel(); CString str; m_combo.GetLBText(index, str); //获取指定下标的内容 MessageBox(str); m_combo.DeleteString(0); //删除第0项字符串 m_combo.InsertString(0, _T("hello")); //在第0位置插入“hello”
组合框常用的事件为:CBN_SELCHANGE,当选择组合框某一项时,自动触发此事件。
void CMFCApplication2Dlg::OnCbnSelchangeCombo1() { // TODO: 在此添加控件通知处理程序代码 }
列表控件 CListCtrl
常用属性设置:view -> Report(报表方式)
常用接口:
接口 功能
CListCtrl::SetExtendedStyle 设置列表风格
CListCtrl::GetExtendedStyle 获取列表风格
CListCtrl::InsertColumn 插入某列内容,主要用于设置标题
CListCtrl::InsertItem 在某行插入新项内容
CListCtrl::SetItemText 设置某行某列的子项内容
CListCtrl::GetItemText 获取某行某列的内容
关联控件变量后,测试接口:
//设置风格样式 //LVS_EX_GRIDLINES 网格 //LVS_EX_FULLROWSELECT 选中整行 m_list.SetExtendedStyle(m_list.GetExtendedStyle() | LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT); //插入标题 CString head[] = { TEXT("姓名"), TEXT("年龄"), TEXT("性别") }; //插入列 m_list.InsertColumn(0, head[0], LVCFMT_LEFT, 100); m_list.InsertColumn(1, head[1], LVCFMT_LEFT, 100); m_list.InsertColumn(2, head[2], LVCFMT_LEFT, 100); //插入正文内容,先确定行,再确定列 for (int i = 0; i < 10; i++) { CString str; str.Format(TEXT("张三_%d"), i ); //确定行 m_list.InsertItem(i, str); //设置列 int j = 0; m_list.SetItemText(i, ++j, TEXT("男")); m_list.SetItemText(i, ++j, TEXT("23")); }
程序效果图:
树控件 CTreeCtrl
常用属性设置:
属性 含义
has buttons True 有展开按钮
has lines True 有展开线
lines at root True 有根节点
常用接口:
接口 功能
AfxGetApp() 获取应用程序对象指针
CWinApp::LoadIcon 加载自定义图标
CImageList::Create 创建图像列表
CImageList::Add 图像列表追加图标
CTreeCtrl::SetImageList 设置图形状态列表
CTreeCtrl::InsertItem 插入节点
CTreeCtrl::SelectItem 设置默认选中项
CTreeCtrl::GetSelectedItem 获取选中项
CTreeCtrl::GetItemText 获取某项内容
关联控件变量
添加图标资源(icon)
资源视图 -> Icon -> 添加资源:
- 导入ico文件
3)通过代码加载图标
//加载图标 HICON icon[3]; icon[0] = AfxGetApp()->LoadIconW(IDI_ICON1); icon[1] = AfxGetApp()->LoadIconW(IDI_ICON2); icon[2] = AfxGetApp()->LoadIconW(IDI_ICON3);
- 创建图像列表
.h文件中定义图形列表(CImageList)对象
CImageList m_imageList; //图像列表
.cpp文件中OnInitDialog()函数中完成图像列表的创建、图标的追加
//图像列表,程序完毕不能释放, 创建 //30, 30: 图片的宽度和高度 //ILC_COLOR32:样式 // 3, 3: 有多少图片写多少 m_imageList.Create(30, 30, ILC_COLOR32, 3, 3); //给图像列表添加图片 for (int i = 0; i < 3; i++) { //图片列表加载图标 m_imageList.Add(icon[i]); }
- 树控件的相应操作
//树控件设置图片列表 m_treeCtrl.SetImageList(&m_imageList, TVSIL_NORMAL); //给树创建节点 //根节点,父节点,子节点 HTREEITEM root = m_treeCtrl.InsertItem(TEXT("中国"), 0, 0, NULL); HTREEITEM fathter = m_treeCtrl.InsertItem(TEXT("北京"), 1, 1, root); HTREEITEM son = m_treeCtrl.InsertItem(TEXT("海淀"), 2, 2, fathter); //设置某个节点被选中 m_treeCtrl.SelectItem(fathter);
程序效果图
树控件常用事件为:TVN_SELCHANGED,当选择某个节点时,自动触发此事件。
void CMy01_TreeCtrlDlg::OnTvnSelchangedTree1(NMHDR *pNMHDR, LRESULT *pResult) { LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR); // TODO: 在此添加控件通知处理程序代码 *pResult = 0; HTREEITEM selItem; //获得选择项 selItem = m_treeCtrl.GetSelectedItem(); //获取选中的内容 CString cs = m_treeCtrl.GetItemText(selItem); MessageBox(cs); }
标签控件 CTabCtrl
- 在UI工具箱拖放 Tab Control
- 把 TabSheet.h和TabSheet.cpp 放在项目文件同级目录,并且添加到工程目录中
- 给UI上 Tab Control 关联Control类型(CTabSheet)
- 添加对话框
- 资源视图 -> Dialog -> 右击 -> 插入 Dialog
- 设置相应属性:
- Style -> Child (子窗口)
- Border -> None (无边框)
- 自定义类:点击对话框模板 -> 右击 -> 添加类(MyDlg1、MyDlg2)
- 主对话框类中, 定义自定义类对象,需要相应头文件
//给tab控件添加对话框 //IDD_DIALOG1为dlg1资源ID m_tabCtrl.AddPage(TEXT("系统管理"), &dlg1, IDD_DIALOG1); //IDD_DIALOG1为dlg2资源ID m_tabCtrl.AddPage(TEXT("系统设置"), &dlg2, IDD_DIALOG2); //显示tab控件 m_tabCtrl.Show();
程序效果图