【mfc】利用单一对话框内的分页技术实现向导功能

所谓的向导功能,在win32的程序中常常见于安装程序或者程序内的设置向导,该向导能够指引用户去完成一些事情,不用用户一次性面对一大堆复杂的设置内容。同时,最主要的功能是现实单一对话框内的分页技术,如果一次性在对话框呈现全部内容,那么这个对话框要做到很大,比较不友好。因此,如何在一个对话框中实现分页,同样是需要了解的内容。

一、基本目标

下面就实现一个简单的例子来说明这个问题,如图,在一个向导中,有三页,每一页都有一个对话框。而在每一页的下方,都有一个上一页与下一页的按钮,点击“确定”按钮,能够把用户输入的内容现实出来。

二、制作过程

1、首先新建一个什么都没有的mfc工程,基于对话框,静态DLL,具体怎么新建可以看我之前的《【mfc】学生信息管理,实现List控件节点的增删改查》(点击打开链接),然后新建三个对话框,对话框的样式设置如下图所示,注意把对话框的样式设置为内接对话框的样式,没有边框,样式为Child,同时在每一个对话框中放入一个编辑框,再加些无关重要的静态文本标识是哪个对话框,当然,你也可以弄得漂亮些。

2、之后对于每一个对话框,都按Ctrl+W建立类向导,它们的类名分别为CPage1,CPage2,...,建立完类向导之后,切换到成员变量的标签页,为里面的编辑框新建成员变量,双击IDC_EDIT1即可,除了成员变量的名字以外,其实变量类型等不需要修改,都命名为m_edit1即可,到时候可以根据是哪个对话框来区分

3、然后设置好主对话框,如下图,把自带的两个按钮拖到右下方,然后拖入两个按钮放到左下方,一个是上一步按钮,另一个自然是下一步按钮,其中“上一步”按钮一开始是禁用状态。

4、主对话框默认已经建立好类函数。我们现在要在主对话框的类函数中,为刚刚新建出来的三个对话框新建成员变量,以便能够在主对话框中操控它们。如下图所示。除了新建CPage1 m_p1,CPage2 m_p2...以外,再建立一个int nSel,用来记录是翻到第几页的变量。

5、如下图,最终新建完所有变量以后,能够在ClassView视图中,清晰地看到,下面我们要初始化这个nSel,这里不像JAVA,更不是VC,一个nSel=0就完了。

6、我们需要点击CPagingDlg::CPagingDlg(CWnd* pParent /*=NULL*/) : CDialog(CPagingDlg::IDD, pParent)为nSel初始化,否则工程会报错,无法启动。

7、以后所有准备工作做完了,就终于可以去到主对话框中的BOOL CPagingDlg::OnInitDialog()函数写代码了。

8、BOOL CPagingDlg::OnInitDialog()函数写入如下代码,整个函数的核心就是在本对话框初始化的时候,如何把生成出来的三个对话框放到主对话框以内,而且如何放好,要放到毫无违和感。同时,放好之后还要把对话框1现实出来,默认对话框是不显示的,必须调用函数。

BOOL CPagingDlg::OnInitDialog()
{
	CDialog::OnInitDialog();
	//首先生成三个对话框
	m_p1.Create(IDD_DIALOG1,this);
	m_p2.Create(IDD_DIALOG2,this);
	m_p3.Create(IDD_DIALOG3,this);
	CRect rect,rt;
	GetClientRect(rect);//求出主对话框的顶部坐标
	//求出主对话框中IDOK那个“确定”按钮的坐标
	GetDlgItem(IDOK)->GetWindowRect(rt);
	ScreenToClient(rt);
	//生成的对话框的尺寸,头部处于主对话框的头部,底部处于“确定”按钮的上方
	rect.bottom = rt.top;
	m_p1.MoveWindow(rect);
	m_p2.MoveWindow(rect);
	m_p3.MoveWindow(rect);
	m_p1.ShowWindow(SW_SHOW);

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon

	// TODO: Add extra initialization here

	return TRUE;  // return TRUE  unless you set the focus to a control
}

9、之后则是翻页函数,我们如下图,在主对话框中新建一个翻页函数void CPagingDlg::SelectPage(),当然你手写也可以,不过我们要发挥win32的图形化编程!

这个函数如下所示:

void CPagingDlg::SelectPage()
{
	//把对话框1,对话框2,对话框3放入一个数组里面,这个数组的变量类型比较奇怪,不为什么了,反正大家都这样用。
	//其中m_p1,2,..是刚刚我们刚刚在主函数中建立的是三个对话框CPage1,2,3的成员变量
	CWnd* ps[] = {&m_p1,&m_p2,&m_p3};
	//sizeof(ps)/sizeof(ps[0])相当于ps.length,ps的数组长度,不过C++这里没有封装这个方法,没有办法了,只能这样写!
	for(int i=0;i<sizeof(ps)/sizeof(ps[0]);i++)
		//看看此时全局变量m_Sel是多少,把第m_Sel页显示,其它都隐藏掉
		ps[i]->ShowWindow(i==m_Sel?SW_SHOW:SW_HIDE);
	//之后,如果翻到了最后,禁用下一页按钮,如果是第一页禁用上一页按钮,其它情况则显示
	//EnableWindow(1)能够把这个按钮启用,EnableWindow(0)则把这个按钮禁用
	//其中,这里的1与0通过m_Sel是否是2与0来判断
	GetDlgItem(IDC_BUTTON2)->EnableWindow(m_Sel!=2);
	GetDlgItem(IDC_BUTTON1)->EnableWindow(m_Sel!=0);

}

这样的分页算法,→_→不是操作系统虚拟内存哪个分页,不要想歪了,我还没这么牛,其实还能应用到Javascript的标签页,不用像我之前在《【JavaScript】原生态的兼容IE6的标签页》(点击打开链接)把一个标签页写得这么复杂。迟点找个机会把Javascript的标签页代码写得更短,更性感!

10、核心一步完成之后,Button1的消息映射函数,也就是那个“上一步”按钮就变得简单了

void CPagingDlg::OnButton1()
{
	// TODO: Add your control notification handler code here
	m_Sel--;
	SelectPage();
}

11、下一步按钮同样如此,就是把这个页数向后一翻,调用上面的分页函数就可以了

void CPagingDlg::OnButton2()
{
	// TODO: Add your control notification handler code here
	m_Sel++;
	SelectPage();
}

12、最后,就是“确定”按钮,IDOK的消息映射函数,它要获取三页对话框里面的信息。

void CPagingDlg::OnOK()
{
	CString cs;
	//这个记得UpdateData(),把内存里面的内容,也就是用户输入的内容,更新到程序变量里面
	m_p1.UpdateData();
	m_p2.UpdateData();
	m_p3.UpdateData();
	cs+="第1页输入了:";
	//这样就代表对话框1,也就是第1页的那个对话框,非常简单
	cs+=m_p1.m_edit1;
	cs+="第2页输入了:";
	cs+=m_p2.m_edit1;
	cs+="第3页输入了:";
	cs+=m_p3.m_edit1;
	//把整个字符串弄好,就弹窗显示就可以了
	AfxMessageBox(cs);

}
时间: 2024-10-03 22:33:16

【mfc】利用单一对话框内的分页技术实现向导功能的相关文章

【mfc】用对话框分页实现用户登录

所谓的对话框分页就是点击完一个对话框的按钮,切换到另一个对话框, 这样的对话框多用于一些需要用户登录才能够进行操作的软件, 下面就用对话框分页来实现用户登录系统 一.基本目标 有如下的程序,输入用户名与密码,如果用户名为admin,密码为123456,那么则成功登录,切换到一个有"欢迎登录"与"关闭"按钮的对话框 如果用户名或者密码输入错误则弹出提示, 点击关闭能够关闭这个程序,不弹出用户登录的对话框. 二.制作过程 1.首先如同之前的<[mfc]对于对话框程

jsp中利用MySQL实现分页技术

分页是很常用的一种技术,而mysql中对于分页的操作也很简单,今天就说说如何在jsp页面中利用标签来最简化的实现分页: 链接:MySQL分页技术详解http://blog.csdn.net/u011637069/article/details/49928513 step1:编写DAO中代码: [java] view plain copy public List<Employee> findAll2(int page, int perPageRows) throws Exception { Li

MFC 在父对话框中内嵌子对话框

MFC 在父对话框中内嵌子对话框 分类: MFC2012-10-10 21:46 2222人阅读 评论(4) 收藏 举报 mfcborder 原文地址:http://blog.csdn.net/leesaiya/article/details/7374537 [cpp] view plaincopy 一.对话框中显示对话框的方法: 1.首先创建要在对话框里显示的那个对话框,命名为:IDD_INNER. 设置这个对话框的属性: 1).“Style”选择“Child”:中文版“样式”选择“下层”.

jsp的分页技术

在jsp开发中,很多时候要用到分页技术,另外纯粹的分页实现就占了很多篇幅,所以使用javabean就十分有必要. 此文章依据实际代码,想大家展示jsp中利用javabean实现分页 目录结构如下: javabean的代码如下: package lytjb; import java.sql.ResultSet; import javax.servlet.http.HttpServletRequest; public class fenye { ResultSet CountTopicrs = nu

【mfc】不同对话框之间互相操控、全局变量与日期控件

首先先改良一下上次在<[mfc]利用文件的读写,theApp全局变量来现实登录帐号管理系统>(点击打开链接)中提到的一种方法:为了解决mfc模态对话框在任务栏中不显示的缺陷,于是在一些模态对话框中的OnInitDialog()初始化函数中,使用SetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE, WS_EX_APPWINDOW);这样虽然能够实现效果,但是在每一个模态对话框都要添加这句话那不是累死?其实如下图的解决方式: 打开新建mfc工程就创建的

django分页技术django-pagination和Paginator

转载前还请注明出处:http://blog.csdn.net/gugugujiawei 一.概述 几乎所有的web应用,都需要分页功能,但分页技术总体来说分两种,一种是全部加载,存于浏览器的缓存中,一种是分页访问,部分加载.前一种方法优点是实现简单,在一些对项目要求不多的特定应用上用得较多,可以利用的插件譬如datatables,而后一种方法优点是不会占用服务器太多的缓存,对于数据量大的列表项必须用到这种技术.由于我现在的项目属于管理后台,管理来自成千上万用户的数据,因而只能用到第二种方法.初期

安天实战课题研究2017年第二期内网渗透技术题目

安天实战课题研究2017年第二期内网渗透技术题目拟研究以下题目:1.使用NTScan扫描内网Windows口令(已经完成)2.使用Hscan进行内网口令扫描 (已经完成)3.扫描Mysql口令 (已经完成)4.扫描MSSQL口令 (已经完成)5.使用SQLTools查看SQL Server数据库及提权 (已经完成)6.内网信息收集工具7.内网信息自动收集脚本8.内网密码获取工具9.服务器明文密码及hash获取10.Windows及Linux密码哈希破解11.远程终端使用攻略 (已经完成)12.记

【mfc】用对话框的切换实现重新登录

上次<[mfc]用对话框分页实现用户登录>(点击打开链接)是一个实现对话框分页登录的Win32程序,与mfc一点关系都没有,虽然Win32程序是mfc程序的基础,但是在mfc中怎么能够实现对话框的切换呢?同时,这个程序实现重新登录,能够灵活在不同对话框中实现切换. 一.基本目标 1.本程序点退出能够成功退出,这是当然的 2.用户在用户名输入admin密码输入123才能够正常登录,否则弹出对话框的提示 3.登录之后,点击重新登录按钮能够回到登录框,而且,这个登录框的功能如常,点击"登录

SQLServer2005和2008的分页技术比较[转]

我们以前在开发大数据量的分页存储过程时,往往都为了怎么样实现高效的性能,而大伤脑筋,似乎总是想写出最佳的存储过程分页方法,我们假如建立一个学生基本信息表StudentInfo,我们看在Sql Server 2000中我们实现的存储过程: CREATE  PROCEDURE p_GetStudentInfo@strWhere   varchar(1500)   -- 查询条件 (注意: 不要加 where),@PageSize    int = 50          -- 页尺寸,@PageIn