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

win32&mfc 专栏收录该内容
20 篇文章 3 订阅

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


打开新建mfc工程就创建的CxxApp类,把旗下的InitInstance()中的m_pMainWnd=&dlg;删掉或者注释掉,以后所有模态对话框都在原来对话框隐藏的时候,都会有标题了。这句话默认是存在的。它没有考虑到我们使用模态对话框的时候,会把这个主对话框隐藏掉所致。

这期,主要为大家带来在mfc如何实现不同对话框之间互相操控与全局变量的定义,还有日期控件的使用,继续上次在《【mfc】利用文件的读写,theApp全局变量来现实登录帐号管理系统》(点击打开链接)中的工程,里面还有“学生管理”这个按钮没有做完,首先在CIsysDlg主对话框中添加Button3学生管理的消息映射函数,这个与以前的工程一样,甚至代码都一样,不讲了:

#include "InfoDlg.h"
void CIsysDlg::OnButton3() 
{
	ShowWindow(SW_HIDE);
	CInfoDlg dlg;
	dlg.DoModal();
	ShowWindow(SW_SHOW);
	
}
其中,一会儿我们画出来的对话框添加的类名就是CInfoDlg。

一、基本目标

实现下面的功能,学生信息管理,点击添加按钮会弹出一个模态对话框“添加信息”,里面有姓名、班级、出生日期,其中姓名是不允许相同的,然后,在“添加信息”对话框点击“添加”按钮,会把消息插入到“学生信息管理”对话框。“添加信息”对话框里面使用到了编辑框、下拉列表与日期控件,这个日期控件能够自己输入与选择。而在“学生信息管理”对话框,选中信息之后,点击“删除按钮”则能够删除信息。


二、制作过程

1、首先画出学生信息管理对话框,怎么添加在《【mfc】用对话框分页实现用户登录》(点击打开链接)讲过,里面包含四个按钮与列表控件,注意把这个列表控件设置成单选,自带的两个“确定”、“取消”按钮请自行删除,本期主要实现“添加”与“删除”按钮功能,为这个对话框添加类CInfoDlg,“打开”与“保存”留到之后再做,按钮的快捷键是如何添加、如何为对话框添加类,在《【mfc】利用文件的读写,theApp全局变量来现实登录帐号管理系统》(点击打开链接)已经说过。


2、之后画出“添加信息”控件,这个对话框里面包含三个静态文本、一个编辑框,一个下拉列表,还有一个日期控件,为这个对话框添加CInfoApp类


3、日期控件如下图添加:


4、把这个日期控件的样式改成如下所示,格式是“长日期”,其他默认就行,你选择“使用旋转控件”也行,个人喜好吧,反正之后的代码没有不同,个人觉得默认的样式比较好看一点。日期控件默认就能够自己输入,也能够自己选择日期。


5、之后就开始写代码了,因为我们首先要“学生信息管理”对话框中的列表控件初始化,所以我们要为CInfoDlg添加初始化OnInitDialog()函数,同时我们为了不用每次操作这个列表都要声明一次CListCtrl* plist=(CListCtrl*)GetDlgItem(IDC_LIST1);然后用plist->方法去操作,因此,我们首先如下图在CInfoDlg头文件中加入一个CListCtrl*


然后回到OnInitDialog()中使用一句m_List.SubclassDlgItem(IDC_LIST1,this);,以后在所有本对话框的所有函数,都能够用m_List去操控列表控件了。初始化列表控件的方法,与之前的《【mfc】学生信息管理,实现List控件节点的增删改查》(点击打开链接)一样,只是不再是plist->去调用,而是m_List中的成员了。

BOOL CInfoDlg::OnInitDialog() 
{
	CDialog::OnInitDialog();
	// TODO: Add extra initialization here
	//现在本对话框的头文件中登录一个CListCtrl m_List;
	//然后,利用此方法获取其某控件的ID就可以使用了
	//不必每次都用声明的CListCtrl* plist=(CListCtrl*)GetDlgItem(IDC_LIST1);中的plist->方法去操作
	m_List.SubclassDlgItem(IDC_LIST1,this);
	m_List.InsertColumn(0,"姓名",0,100);
	m_List.InsertColumn(1,"班级",0,100);
	//出生日期的列扩大一些
	m_List.InsertColumn(2,"出生日期",0,200);
	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}
出生日期那一列扩大一点,毕竟日期是比较大的

6、之后是“学生信息管理”对话框中的“添加”按钮的消息映射函数,这个按钮是弹出一个CInfoAddDlg的模态框的,为了在“添加”对话框中能够操作“学生信息管理”这个对话框中的控件,我们先要打开CInfoAddDlg.h进行如下图的操作


之后为“学生信息管理”对话框中的“添加”按钮添加消息映射函数OnButton1():

#include "InfoAddDlg.h"
void CInfoDlg::OnButton1() 
{
	// TODO: Add your control notification handler code here
	CInfoAddDlg dlg;
	//在添加信息的对话框的头文件InfoAddDlg.h中加了一个指向本对话框的指针
	//以便在添加信息的对话框能够操纵本对话框中的list
	dlg.m_InfoDlg=this;
	dlg.DoModal();
}
7、“学生信息管理”对话框中的“删除”按钮,写完整个添加对话框中的内容再回来写,这个”添加“对话框中的”下拉列表“是要初始化的,为本对话框添加一个初始化OnInitDialog()函数,里面”下拉列表“的初始化与《【mfc】利用文件的读写,theApp全局变量来现实登录帐号管理系统》( 点击打开链接)的是一模一样,只是”普通”、“高级”变成了“1”、“2”而已

BOOL CInfoAddDlg::OnInitDialog() 
{
	CDialog::OnInitDialog();
	//初始化下拉列表COMBO控件
	CComboBox* pcombo=(CComboBox*)GetDlgItem(IDC_COMBO1);
	pcombo->AddString("1");
	pcombo->AddString("2");
	//设置下拉列表COMBO控件默认选项为第一个
	pcombo->SetCurSel(0);
	// TODO: Add extra initialization here
	
	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}
8、然后”添加“对话框仅有一个“添加”按钮需要写函数:

void CInfoAddDlg::OnButton1() 
{
	//经过了之前的工作,一句m_InfoDlg->XX,就像直接在CInfoDlg对话框操作本对话框控件一样;
	CString str;
	GetDlgItemText(IDC_EDIT1,str);
	//比较字符串一定要这样比较,不能用==
	if(strcmp(str,"")==0){
		AfxMessageBox("输入的姓名为空!");
		return;
	}
	int nCount=m_InfoDlg->m_List.GetItemCount();
	for(int i=0;i<nCount;i++){
		if(strcmp(m_InfoDlg->m_List.GetItemText(i,0),str)==0){
			AfxMessageBox("要插入的用户名已经存在!");
			return;
		}
	}
	m_InfoDlg->m_List.InsertItem(nCount,str);
	GetDlgItemText(IDC_COMBO1,str);
	m_InfoDlg->m_List.SetItemText(nCount,1,str);
	GetDlgItemText(IDC_DATETIMEPICKER1,str);
	m_InfoDlg->m_List.SetItemText(nCount,2,str);
	SetDlgItemText(IDC_EDIT1,"");	
}
这里还是之前的“添加”方法,只是取出下拉列表与日期控件的值,不用像以前的那样的复杂了,其实都可以用GetDlgItemText方法去取。这里注意一下比较字符串的方法,C++与Java一样,字符串是对象,不能直接用基本类型比较符号==去比较,用=就更加搞笑了,你的基础就更加秀逗了。同时还要注意List控件,添加完一行统一用修改列的方法完成“添加”,其实添加方法,一次就生成一行,没有被赋值的列被设置为空而已。

9、这样就做完了“添加”对话框,回到“学生信息管理”对话框中的“删除”按钮,其实这里的代码与《【mfc】学生信息管理,实现List控件节点的增删改查》(点击打开链接)一样,还不用遍历,随便删

void CInfoDlg::OnButton2() 
{

	POSITION pos=m_List.GetFirstSelectedItemPosition();
	int nSel=m_List.GetNextSelectedItem(pos);
	if(nSel<0)
		AfxMessageBox("请选中要删除的项!",MB_OK);
	else{
		if(AfxMessageBox("确认删除:"+m_List.GetItemText(nSel,0)+"吗?",MB_YESNO)==IDYES){
			m_List.DeleteItem(nSel);
		}
	}
	// TODO: Add your control notification handler code here
	
}

至此,目标完成

  • 0
    点赞
  • 0
    评论
  • 2
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值