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



相关文章
|
5月前
14 MFC - 普通按钮 CButton
14 MFC - 普通按钮 CButton
20 0
|
5月前
|
C++ Windows
09 MFC - 创建基于对话框的 MFC 应用程序框架
09 MFC - 创建基于对话框的 MFC 应用程序框架
45 0
|
2月前
|
C++
MFC创建带窗口的DLL
MFC创建带窗口的DLL
14 0
|
4月前
[MFC] A对话框调用B对话框
[MFC] A对话框调用B对话框
17 0
|
10月前
|
程序员 Windows
【windows编程之对话框】对话框原理,对话框的创建
【windows编程之对话框】对话框原理,对话框的创建
|
数据安全/隐私保护
MFC——对话框的创建及使用(下)
MFC——对话框的创建及使用
196 0
MFC——对话框的创建及使用(下)
MFC设置窗体大小SetWindowPos
SetWindowPos(NULL,0,0,200,300,SWP_NOMOVE);     表示不考虑(0,0),仅仅将大小改为200x300,位置不变    SetWindowPos(NULL,0,0,200,300,SWP_NOMOVE);    表示不考虑200X300,只是把位置挪到(0,0).
4059 0
|
测试技术
MFC中为菜单或按钮添加快捷键功能
1、新建一快捷键资源,ACCELERATOR,关联相应的ID号,下图所示中,其中,第一个ID为自定义快捷键ID,按CTRL+R,此时响应该ID以应的消息响应函数, 第二个ID为菜单ID,此时按CTRL+V,调出ID_NETWORK_PING菜单对应的响应函数。
1315 0
MFC弹出对话框几种方法总结
一、点击菜单按钮弹出对话框 1、在资源视图中(.rc文件夹下)找到menu,选择需要弹框的菜单项; 2、点击菜单项,修改菜单ID,在主程序中用ON_COMMAND()将ID和函数关联,要在主程序的头文件中声明被关联函数; ...
3589 0
|
区块链
MFC创建单文档工程(左上角名称前的mfc图标修改为其他需求图标)
资源视图——VT_Ards.rc——右键选择添加资源,选择menu,然后导入 (提前最好把ico图标放到工程文件下的res文件夹下) 图标属性ID为:IDR_MAINFRAME ...
1426 0