文章目录
项目介绍
-
程序主页:
🔸展示注册的用户信息;
🔸点击注册按钮,会出现一个新的注册的界面;
🔸点击退出按钮,此界面消失;
-
注册界面:
一、创建项目
创建一个基于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 |
六、实现注册对话框
-
重写OnInitDialog
BOOL CRegDlg::OnInitDialog() { CDialogEx::OnInitDialog(); // TODO: 在此添加额外的初始化 return TRUE; // return TRUE unless you set the focus to a control // 异常: OCX 属性页应返回 FALSE }
-
关联页面
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 }
-
添加一个函数,用于查看当前页面
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); }
-
查看下一页
void CRegDlg::OnBnClickedNext() { // TODO: 在此添加控件通知处理程序代码 if (m_pos < 2) { m_pos++; SelectPage(); } }
-
查看上一页
void CRegDlg::OnBnClickedBack() { // TODO: 在此添加控件通知处理程序代码 if (m_pos) { m_pos--; SelectPage(); } }
-
完成
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:该程序只是简单的实例,因此就简单的实现,未做错误判断等。主要起引导作用。
学习: