MFC——分页功能


在这里插入图片描述

项目介绍

  1. 程序主页:
    🔸展示注册的用户信息;
    🔸点击注册按钮,会出现一个新的注册的界面;
    🔸点击退出按钮,此界面消失;

  2. 注册界面:


一、创建项目

创建一个基于MFC对话框的项目,项目名称为PagingProject

📢📢📢注意:
用汉字给项目命名存在安全隐患,设置不当的话,容易引起汉字乱码。所以最好不要使用汉字命名。



直接点击完成即可。

运行程序:
下面的界面是程序生成的一个默认主界面。
在这里插入图片描述

二、添加3个分页对话框资源

创建一个注册对话框,作为3个分页的父对话框:

界面标题(Caption) ID
用户注册 IDD_REG

创建三个分页,分页对话框的ID,border及Style如下:

分页 ID Border Style 功能
分页1 IDD_PAGE1 None Child 填写用户的账号、暱称和性别
分页2 IDD_PAGE2 None Child 填写用户的生日、血型
分页3 IDD_PAGE3 None Child 填写用户的邮箱和电话

1. 创建注册对话框

右键资源视图下的Dialog,点击插入Dialog
在这里插入图片描述
修改属性ID:IDD_REG,Caption:用户注册。

2. 创建三个分页

2.1 第一个分页

插入一个dialog资源。


右键属性,修改ID标识为:IDD_PAGE1
在这里插入图片描述
修改其Border属性为:None

修改对话框的Style属性为:child

2.2 第二个分页

复制IDD_PAGE1对话框,并右键点击资源视图的Dialog,选择粘贴按键。


在这里插入图片描述

2.3 第三个分页

复制IDD_PAGE1对话框,并右键点击资源视图的Dialog,选择粘贴按键。

操作步骤同上。

最终:

三、定制对话框界面内容

1. 默认生成的父对话框内容定制

页面两个button按钮:

Caption ID 功能
注册 IDC_ADD 点击注册按钮,进入注册界面
退出 IDCANCEL 点击退出按钮,关闭页面,退出程序


添加一个List Control控件:

View ID 功能
Report IDC_LIST 展示用户注册的信息列表

在这里插入图片描述
在这里插入图片描述
调整控件位置如图:

2. 注册对话框内容定制

此页面包含如下4个Button按钮:

控件类型 Caption ID 功能
Button 上一页 IDC_BACK 进入上一个分页界面
Button 下一页 IDC_NEXT 进入下一个分页界面
Button 完成 IDOK 完成注册,跳到程序主页面,即展示用户注册信息的页面,刚刚注册的信息增加到信息展示界面
Button 退出 IDCANCEL 退出注册信息界面,进入展示用户信息的界面,刚刚注册的信息不在显示信息界面展示

注册对话框的界面:
在这里插入图片描述

2. 分页1对话框内容定制

控件类型 Caption ID 功能
Static Text 账号 IDC_STATIC(不变) 提示信息
Static Text 暱称 IDC_STATIC(不变) 提示信息
Edit Control 无此属性 IDC_NUM 用户可以输入账号信息
Edit Control 无此属性 IDC_NAME 用户可以输入暱称信息
Group Box 性别 IDC_STATIC(不变) 提示信息
Radio Box IDC_SEX 男性单选按钮
Radio Box IDC_RADIO2(不变) 女性单选按钮

修改单选按钮的Group属性,本例程共有一组单选按钮,需要设定一个组,每一组的第一个单选按钮的Group属性需要设置为真。即设置Caption为“男”的单选按钮的Group属性:True。

📢📢📢注意:
单选按钮最重要的属性就是Group,需要在同一组的按钮必须ID连续,这就要求添加同组按钮时连续。


同时需要设定一个组长作为默认值,此时可以通过Tab键的顺序进行默认值的设置:

组长的Tab键值要在前,即同一个组内的所有单选按钮中的组长的Tab键要最小,否者无法实现单选按钮的单选功能。


分页1对话框的界面:

3. 分页2对话框内容定制

控件类型 Caption ID 功能
Static Text 生日 IDC_STATIC(不变) 提示信息
Static Text 血型 IDC_STATIC(不变) 提示信息
Date Time Picker 无此属性 IDC_BIRTH 出生年月日的选择
Combo Box 无此属性 IDC_BLOOD 血型的选择

为Combo Box添加Data属性值:A;B;AB;O;其它

分页2对话框的界面:

4. 分页3对话框内容定制

控件类型 Caption ID 功能
Static Text 联系电话 IDC_STATIC(不变) 提示信息
Static Text 邮箱地址 IDC_STATIC(不变) 提示信息
Edit Control 无此属性 IDC_PHONE 输入联系电话
Edit Control 无此属性 IDC_EMALL 输入邮箱地址

分页3对话框的界面:

四、为每个对话框添加MFC类

1. 添加注册MFC类

右键点击注册对话框的添加类选项:

2. 添加页面1的MFC类

3. 添加页面2的MFC类

4. 添加页面3的MFC类

5. 在pch.h中添加头文件的声明

注意:CRegDlg头文件声明必须放在分页类的头文件声明之前,否者会报错。

#include "CPage1.h"
#include "CPage2.h"
#include "CPage3.h"
#include "CRegDlg.h"
#include "resource.h"

五、关联变量

页面1添加类型的关联变量:

控件ID 类别 变量类型 访问权限
IDC_NAME CString m_name
IDC_NUM CString m_num
IDC_SEX int m_sex


页面2添加类型的关联变量:

控件ID 类别 变量类型 访问权限
IDC_BIRTH COleDateTime m_birth
IDC_BLOOD int m_blood

在这里插入图片描述
页面3添加类型的关联变量:

控件ID 类别 变量类型 访问权限
IDC_EMALL CString m_emall
IDC_PHONE CString m_phone


在注册界面自定义三个分页对话框的变量以及,以便在注册对话框的类中对分页类进行操作,获取到每个分页内输入的值:

变量名 变量类型 访问权限
m_p1 CPage1 public
m_p2 CPage2 public
m_p3 CPage3 public
m_pos int public

六、实现注册对话框

  1. 重写OnInitDialog

    BOOL CRegDlg::OnInitDialog()
    {
    	CDialogEx::OnInitDialog();
    
    	// TODO:  在此添加额外的初始化
    
    	return TRUE;  // return TRUE unless you set the focus to a control
    				  // 异常: OCX 属性页应返回 FALSE
    }
    
  2. 关联页面

    BOOL CRegDlg::OnInitDialog()
    {
    	CDialogEx::OnInitDialog();
    
    	// TODO:  在此添加额外的初始化
    	//关联页面
    	//将变量与3个分页对话框相关联,因此可以通过变量对分页对话框进行操作
    	m_p1.Create(IDD_PAGE1, this);
    	m_p2.Create(IDD_PAGE2, this);
    	m_p3.Create(IDD_PAGE3, this);
    
    
    	//在注册界面显示第一个分页内容
    	m_p1.ShowWindow(SW_SHOW);
    
    
    	return TRUE;  // return TRUE unless you set the focus to a control
    				  // 异常: OCX 属性页应返回 FALSE
    }
    
    
  3. 添加一个函数,用于查看当前页面

    void CRegDlg::SelectPage()
    {
    	// TODO: 在此处添加实现代码.
    	//存分页的下标
    	int i = 0;
    	CWnd* ps[] = { &m_p1, &m_p2, &m_p3 };
    	while (i < sizeof(ps) / sizeof(ps[0]))
    	{
    		ps[i]->ShowWindow(i == m_pos ? SW_SHOW : SW_HIDE);
    		i++;
    	}
    	ps[m_pos]->SetFocus();
    	//当前页面下标小于2时,下一页按钮可以点击
    	GetDlgItem(IDC_NEXT)->EnableWindow(m_pos < 2);
    	//当前页面下标大于0,可以点击上一页按钮
    	GetDlgItem(IDC_BACK)->EnableWindow(m_pos);
    }
    
  4. 查看下一页

    void CRegDlg::OnBnClickedNext()
    {
    	// TODO: 在此添加控件通知处理程序代码
    	if (m_pos < 2) {
    		m_pos++;
    		SelectPage();
    	}
    }
    
  5. 查看上一页

    void CRegDlg::OnBnClickedBack()
    {
    	// TODO: 在此添加控件通知处理程序代码
    	if (m_pos) {
    		m_pos--;
    		SelectPage();
    	}
    }
    
  6. 完成

    void CRegDlg::OnBnClickedOk()
    {
    	// TODO: 在此添加控件通知处理程序代码
    	int i = 0;
    	CWnd* ps[] = { &m_p1,&m_p2,&m_p3 };
    	while (i < sizeof(ps) / sizeof(ps[0]))
    	{
    		ps[i]->UpdateData();
    		i++;
    	}
    	CDialog::EndDialog(IDOK);
    }
    
    

五、程序主页代码实现

1. 为list控件添加控件变量


2. 列表添加属性项

在 CPagingProjectDlg的OnInitDialog函数中添加属性项,对应注册界面的所有信息:

m_list.InsertColumn(0, L"账号", 0, 100);
m_list.InsertColumn(1, L"暱称", 0, 100);
m_list.InsertColumn(2, L"性别", 0, 80);
m_list.InsertColumn(3, L"生日", 0, 120);
m_list.InsertColumn(4, L"血型", 0, 80);
m_list.InsertColumn(6, L"电话", 0, 120);
m_list.InsertColumn(7, L"电子邮件", 0, 200);


改变列表的外观为表格型,同样在CPagingProjectDlg的OnInitDialog函数中添加表格样式:

//设置列表的表格样式
m_list.SetExtendedStyle(LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT);


点击注册,进行注册操作:

void CPagingProjectDlg::OnBnClickedAdd()
{
	// TODO: 在此添加控件通知处理程序代码
	CRegDlg  dlg;
	if (IDCANCEL == dlg.DoModal()) {
		return;
	}
	int nCount = m_list.GetItemCount();
	//插入账号
	m_list.InsertItem(nCount, dlg.m_p1.m_num);
	//插入暱称
	m_list.SetItemText(nCount, 1, dlg.m_p1.m_name);
	//插入性别
	m_list.SetItemText(nCount, 2, dlg.m_p1.m_sex == 0 ? _T("男") : _T("女"));
	//插入生日
	CString birth;
	birth.Format(_T("%d-%d-%d"), dlg.m_p2.m_birth.GetYear(), dlg.m_p2.m_birth.GetMonth(), dlg.m_p2.m_birth.GetDay());
	m_list.SetItemText(nCount, 3, birth);
	//插入血型
	char* p[] = { "A","B","AB","O","其它" };
	CString blood = (CString)p[dlg.m_p2.m_blood];
	m_list.SetItemText(nCount, 4, blood);
	//插入电话
	m_list.SetItemText(nCount, 5, dlg.m_p3.m_phone);
	//插入电子邮件
	m_list.SetItemText(nCount, 6, dlg.m_p3.m_emall);
}

总结

最终的程序运行界面:
在这里插入图片描述
该程序源码的资源地址:PagingProject.rar

PS:该程序只是简单的实例,因此就简单的实现,未做错误判断等。主要起引导作用。


  • 在这里插入图片描述

学习:

MFC对话框使用标签页控件
MFC单选按钮
单选按钮
mfc 中如何添加标签页(超详细)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章