MFC——对话框的创建及使用(上)

简介: MFC——对话框的创建及使用

文章目录

MFC对话框的创建实例

对话框程序的创建过程:

对话框应用程序框架介绍

设计界面和工具箱

MFC常用控件

静态文本框CStatic

普通按钮 CButton

编辑框 CEdit

组合框(下拉框)CComboBox

列表控件 CListCtrl

树控件 CTreeCtrl

标签控件 CTabCtrl

综合案例

项目总体框架

文件处理

登录对话框

静态拆分窗口

左侧选择界面树视图实现

功能节点消息处理

个人信息管理窗口

销售管理窗口

库存信息窗口

库存添加窗口

库存删除窗口

菜单栏实现

最终实现


MFC对话框的创建实例

对话框程序的创建过程:

  • 选择“文件 | 新建 | 项目”菜单;


  • 在“新建项目”对话框中,选择“ MFC 应用程序 ”,输入工程名称,选择“确定”。

20200406205946284.png


  • 选择“ 基于对话框”,即创建基于对话框的应用程序,选择“完成”。

20200406205952239.png


对话框应用程序框架介绍

资源视图

用 AppWizard 创建基于对话框的应用程序框架(假定工程名为 Dialog )后,项目工作区上增加了一个“资源视图”选项卡。

20200406210018269.png

或者,通过视图找到“资源视图”选项卡:


20200406210024545.png

在 MFC中,与用户进行交互的对话框界面被认为是一种资源。展开“Dialog”,可以看到有一个ID为IDD_ DIALOG _DIALOG(中间部分(DIALOG)与项目名称相同)的资源,对应中间的对话框设计界面。不管在何时,只要双击对话框资源的ID,对话框设计界面就会显示在中间。


类视图

在类视图中,可以看到生成了3 个类:CAboutDlg、CDialogApp和CDialogDlg。


20200406210039447.png

  • CAboutDlg:对应生成的版本信息对话框。
  • CDialogApp:应用程序类,从 CWinApp 继承过来,封装了初始化、运行、终止该程序的代码。
  • CDialogDlg:对话框类,从CdialogEx继承过来的,在程序运行时看到的对话框就是它的一个具体对象。
  • DoDataExchange函数:该函数主要完成对话框数据的交换和校验。
  • OnInitDialog函数:相当于对对话框进行初始化处理。

设计界面和工具箱

20200406210117612.png

模态对话框

当模态对话框显示时,程序会暂停执行,直到关闭这个模态对话框之后,才能执行程序中的其他任务。


  • 1)通过工具箱在界面上放一个Button,双击此按钮即可跳转到按钮处理函数:


20200406210152424.png

//按钮处理函数
void CDialogDlg::OnBnClickedButton1()
{
  // TODO:  在此添加控件通知处理程序代码
}


  • 2)资源视图 -> Dialog -> 右击 -> 插入 Dialog:


20200406210158467.png20200406210215724.png

3)修改对话框ID:

20200406210239839.png


4)点击对话框模板 -> 右击 -> 添加类:

20200406210249642.png20200406210255289.png


5)类视图中多了一个自定义类:

20200406210304264.png


6)按钮处理函数创建对话框,以模态方式运行。

实现模态对话框的创建需要调用CDialog类的成员函数CDialog::DoModel,该函数的功能就是创建并显示一个对话框:


//启动模态对话框按钮
void CDialogDlg::OnBnClickedButton1()
{
  //需要包含头文件:#include "DlgExec.h"
  CDlgExec dlg;
  dlg.DoModal(); //以模态方式运行
}


非模态对话框

当非模态对话框显示时,运行转而执行程序中的其他任务,而不用关闭这个对话框。


图形界面操作过程和模态对话框一样,只是,非模态对话框实现方式不一样,先创建(CDialog::Create)一次,然后再显示(CWnd::ShowWindow)。


  • 1)主对话框.h类中声明对话框对象:


20200406210331410.png

  • 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

20200406211953332.png

静态文本框是最简单的控件,它主要用来显示文本信息,不能接受用户输入,一般不需要连接变量,也不需要处理消息。


静态文本框的重要属性有:


  • ID:所有静态文本框的缺省ID都是IDC_STATIC,静态ID,不响应任何消息(事件)
  • Caption:修改显示的内容

接口 功能

CWnd::SetWindowText 设置控件内容

CWnd::GetWindowText 获取控件内容

CStatic::SetBitmap 设置位图(后缀为bmp的图片)

关联控件变量

由于XXX_STATIC静态ID是不能关联变量,故需把ID修改后,再关联变量:


20200406212154223.png

2020040621215866.png

20200406212203315.png

在主对话框类OnInitDialog()中,完成相应接口测试:20200406212216594.png


//设置静态控件内容为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

20200406212326127.png

按钮是最常见的、应用最广泛的一种控件。在程序执行期间,当单击某个按钮后就会执行相应的消息处理函数。


按钮的主要属性是Caption,来设置在按钮上显示的文本。


命令按钮处理的最多的消息是:BN_CLICKED,双击按钮即可跳转到处理函数。或者,通过按钮属性 -> 控制事件 -> 选择所需事件,添加处理函数:

20200406212349687.png


//按钮BN_CLICKED事件处理函数
void CMFCApplication2Dlg::OnBnClickedButton1()
{
  // TODO:  在此添加控件通知处理程序代码
}



常用接口:


接口 功能

CWnd::SetWindowText 设置控件内容

CWnd::GetWindowText 获取控件内容

CWnd::EnableWindow 设置控件是否变灰

关联控件变量

20200406212510342.png

在主对话框类OnInitDialog()中,完成相应接口测试:

20200406212519313.png


//获取按钮的内容
  CString str;
  m_button.GetWindowText(str);
  MessageBox(str);
  //设置按钮内容
  m_button.SetWindowText(TEXT("^_^"));
  //设置按钮状态为灰色
  m_button.EnableWindow(FALSE);
  m_button.EnableWindow(TRUE);


编辑框 CEdit

20200406212601169.png

常用属性设置:


属性 含义

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 获取控件内容

关联控件变量

20200406212809284.png

在主对话框类OnInitDialog()中,完成相应接口测试:


//设置按钮内容
  m_edit.SetWindowText(TEXT("this is a test"));
  //获取按钮的内容
  CString str;
  m_edit.GetWindowText(str);
  MessageBox(str);


管理基本类型变量

20200406212853102.png

若一个编辑框连接了一个Value类别的变量,则该变量就表示这个编辑框,编辑框中显示的内容就是变量的值。


但是,改变了编辑框的内容并不会自动更新对应的变量的值,同样,改变了变量的值也不会自动刷新编辑框的内容。若要保持一致,需要使用UpdateData()函数更新:


  • 若编辑框的内容改变了,则应使用语句UpdateData(TRUE) 获取对话框数据
  • 若变量的值改变了,则应使用语句UpdateData(FALSE) 初始化对话框控件

20200406212915251.png

在主对话框类OnInitDialog()中,完成相应代码测试:

m_e1 = 10.11;
  UpdateData(FALSE); //FALSE说明把m_e1的值更新到对应的控件中
  UpdateData(TRUE); //TRUE说明把控件的值更新到m_e1变量中


组合框(下拉框)CComboBox

20200406213402854.png

常用属性设置:


属性 含义

data 设置内容,不同内容间用英文的分号“;”分隔

type 显示风格

Sort True 内容自动排序

常用接口:


接口 功能

CComboBox::AddString 组合框添加一个字符串

CComboBox::SetCurSel 设置当前选择项(当前显示第几项),下标从0开始

CComboBox::GetCurSel 获取组合框中当前选中项的下标

CComboBox::GetLBText 获取指定位置的内容

CComboBox::DeleteString 删除指定位置的字符串

CComboBox::InsertString 在指定位置插入字符串

关联控件变量后,测试接口:


20200406213544950.png

//添加字符串内容
  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,当选择组合框某一项时,自动触发此事件。

20200406213632743.png

void CMFCApplication2Dlg::OnCbnSelchangeCombo1()
{
  // TODO:  在此添加控件通知处理程序代码
}


列表控件 CListCtrl

20200406213701652.png

常用属性设置:view -> Report(报表方式)

20200406213713148.png

常用接口:


接口 功能

CListCtrl::SetExtendedStyle 设置列表风格

CListCtrl::GetExtendedStyle 获取列表风格

CListCtrl::InsertColumn 插入某列内容,主要用于设置标题

CListCtrl::InsertItem 在某行插入新项内容

CListCtrl::SetItemText 设置某行某列的子项内容

CListCtrl::GetItemText 获取某行某列的内容

关联控件变量后,测试接口:

20200406213807924.png

//设置风格样式
  //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"));
  }


程序效果图:

20200406213830254.png

树控件 CTreeCtrl

2020040621385840.png

常用属性设置:


属性 含义

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 获取某项内容

关联控件变量

20200406214111889.png

添加图标资源(icon)

20200406214127466.png

资源视图 -> Icon -> 添加资源:

20200406214145124.png

  • 导入ico文件

20200406214155721.png

20200406214200997.png20200406214205321.png


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);


程序效果图

20200406214425901.png

树控件常用事件为:TVN_SELCHANGED,当选择某个节点时,自动触发此事件。

20200406214439237.png

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

20200406214513683.png

  • 在UI工具箱拖放 Tab Control

20200407201807903.png

  • 把 TabSheet.h和TabSheet.cpp 放在项目文件同级目录,并且添加到工程目录中

20200407201833818.png


  • 给UI上 Tab Control 关联Control类型(CTabSheet)


20200407201854304.png

  • 添加对话框


  • 资源视图 -> 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();


程序效果图

20200407202051546.png



相关文章
|
XML 编解码 自然语言处理
不需要熟悉,但需要了解的libiconv库
但是很多老式的计算机还在使用当地的传统的字符编码方式。而一些程序,例如邮件程序和浏览器必须能在这些不同的用户编码之间作转换。其他的一些程序则内置支持Unicode,以顺利支持国际化的处理,但是仍然有在Unicode和其他的传统编码之间转换的需求。GNU的libiconv就是为这两种应用设计的编码转换库。
不需要熟悉,但需要了解的libiconv库
SVN 将文件还原到之前的指定版本
SVN 将文件还原到之前的指定版本
3783 1
SVN 将文件还原到之前的指定版本
|
IDE Java 数据库连接
IntelliJ IDEA安装使用教程——社区免费版——附中文插件安装
IntelliJ IDEA安装使用教程——社区免费版——附中文插件安装
6895 0
|
API PHP C++
Windows下用vs2017编译和配置libcurl库(手把手教,适合新人)
Windows下用vs2017编译和配置libcurl库(手把手教,适合新人)
3154 0
|
11月前
|
人工智能 算法 调度
端侧宠物识别+拍摄控制智能化:解决设备识别频次识别率双低问题
随着宠物成为家庭重要成员,其影像创作需求激增。传统相机“人脸优先”逻辑难以应对宠物拍摄的复杂场景,如毛发模糊、动态多变、光照反差大等。本文基于端侧AI与影像工程经验,系统梳理宠物识别驱动的对焦曝光重构技术,结合算法与产业实践,构建从检测到参数调度的完整解决方案,推动拍摄技术向“宠物优先”转型。
409 0
|
6月前
|
人工智能 自然语言处理 数据可视化
2025年有哪些好用的BI产品,哪家BI工具值得推荐
2025年,BI工具加速智能化与国产化。本文深度解析瓴羊Quick BI、Power BI、华为云智能BI等五款主流产品,从能力、行业适配与案例出发,助力企业精准选型,实现数据驱动决策。
|
12月前
|
存储 关系型数据库 MySQL
【赵渝强老师】使用select...into outfile语句备份MySQL
本文介绍了MySQL中使用`SELECT...INTO OUTFILE`语句将表数据导出为文本文件的方法。通过示例演示了如何备份员工表(emp)的数据,包括创建存储目录、设置权限、配置参数`secure_file_priv`以及解决相关错误的过程。字段分隔符和行终止符可自定义,确保数据格式符合需求。最后展示了备份文件的内容,验证操作成功。
692 36
MFC基本控件-静态文本的使用
MFC基本控件-静态文本的使用
|
Shell 开发工具 git
上传文件到gitee(小白都能学会)
上传文件到gitee(小白都能学会)
6388 13
|
域名解析 负载均衡 网络协议
DNS 的应用场景|学习笔记
快速学习DNS 的应用场景
DNS 的应用场景|学习笔记

热门文章

最新文章