前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >VC++6.0入门——第八讲 对话框编程(二)

VC++6.0入门——第八讲 对话框编程(二)

原创
作者头像
Arya
发布2024-11-25 14:20:33
发布2024-11-25 14:20:33
1440
举报
文章被收录于专栏:后端开发专栏后端开发专栏

在文章开始之前,推荐一篇值得阅读的好文章!感兴趣的也可以去看一下,并关注作者!

题目:Go语言中的加解密利器:go-crypto库全解析

好事文章地址:https://cloud.tencent.com/developer/article/2470499

在软件开发中,数据安全和隐私保护越来越受到重视。Go 语言以其简洁高效的特性,成为了许多开发者的首选。然而,在实际项目中使用加解密时,还是需要在标准库的基础上做一些封装。go-crypto 库应运而生,它是一个专为 Golang 设计的加密解密工具库,提供了 AES 和 RSA 等多种加密算法的支持。

引出


VC++6.0入门——第八讲 对话框编程(二)

第八讲 对话框编程(二)

逃跑按钮的实现

首先新建一个MFC AppWizard(exe)类型的工程,并取名为:Test,在MFC AppWizard的第一步选择创建基于对话框(Dialog based)的应用程序,如图8.1所示。然后直接单击【Finish】按钮接受其余各步的默认设置,完成应用程序的创建。

平时,我们经常会从网上下载一些小程序,当安装完成之后,它会在桌面上生成一个小人或小动物,当我们用鼠标去单击这个小人/小动物时,它会在屏幕上到处乱跑,我们始终也无法点中这个小人。下面,我们就要实现这种功能的一种简化版本。具体地说,就是在T©st程序的对话框主界面上增加一个按钮,当用鼠标单击这个按钮时,该按钮会自动移动到另一个位置,就像一个“逃跑”的按钮。

字体的设置,窗口右键,属性

添加windows消息映射

为了在一个按钮对象中获取另一个按钮控件对象的地址,最简单的方式就是在CNewButton类中定义一个成员变量,让其指向另一个按钮对象的地址。因此,我们为CNewButton类再添加一个CNewButton*类型的成员变量: m_pBtn。这样,当用CNewButton类去实例化CTestDlg类的成员变量m_btnl和mbtn2时,这两个对象内部就都有了一个m pBtn成员变量,我们可以让这两个对象内部的m pBtn变量分别保存对方的首地址,相当于这两个对象互相交换了自己的首地址。

这个过程如图所示。于是,当mbtn1按钮隐藏时,就可以利用它的成员变量m_pBtn去调用 ShowWinodw函数,将mbtn2按钮显示出来;同样地,当mbtn2按钮隐藏时,可以利用它的成员变量n_pBtn去调用Show Window函数,将m _bntl按钮显示出来。

代码语言:java
复制
void CWeiBtn::OnMouseMove(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	ShowWindow(SW_HIDE); // 先隐藏自己,
	m_pBtn->ShowWindow(SW_SHOW); // 显示另一个
	CButton::OnMouseMove(nFlags, point);
}

属性表单

在VC+开发窗口中,如果选择【Tools1 Options.…】菜单命令,这时会打开如图8.16所示的Options对话框。这个对话框就是一个属性表单,它的每一个选项卡或选项卡就是一个属性页。一个属性表单由一个或多个属性页组成。它有效地解决了大量信息无法在一个对话框上显示这一问题,并提供了对信息的分类和组织管理的功能。

而我们每次利用VC+新建一个工程时使用的AppWizard工具就是一个向导,它通过一步一步地引导用户选择一些信息,从而生成相应的应用程序框架。

报错的解决

中文乱码问题解决

向导页面

创建一个向导类型的对话框,应该遵循创建一个标准属性表单的步骤来实现,但在调用属性表单对象的DoModal函数之前,应该先调用SetWizardMode这一函数。

但是,我们可以看到,上述这个向导对话框仍存在一些问题:在第一个页面上,不应该有“上一步”这个按钮;在最后一个页面上,不应该是“下一步”按钮,而应该是“完成”按钮。

右键,增加虚函数

单选框的使用

列表选择框

代码语言:java
复制
LRESULT CProp1::OnWizardNext() 
{
	// TODO: Add your specialized code here and/or call the base class
	UpdateData();
	if(m_work==-1){
	
		MessageBox("请选择你的职业");
		return -1;
	}

	if(m_workPlace==""){
		MessageBox("请选择工作地点");
		return -1;
	}
	return CPropertyPage::OnWizardNext();
}

BOOL CProp1::OnInitDialog() 
{
	CPropertyPage::OnInitDialog();
	
	// TODO: Add extra initialization here
	// 对话框将要显示之前发送,列表框
	((CListBox*)GetDlgItem(IDC_LIST1))->AddString("北京");
	((CListBox*)GetDlgItem(IDC_LIST1))->AddString("天津");
	((CListBox*)GetDlgItem(IDC_LIST1))->AddString("上海");
	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}

多选框

代码语言:java
复制
LRESULT CProp2::OnWizardNext() 
{
	// TODO: Add your specialized code here and/or call the base class
	// 判断是不是选择了兴趣爱好
	UpdateData();

	if(m_bool1 || m_bool2 || m_bool3 || m_bool4){
		return CPropertyPage::OnWizardNext();
	}else{
		MessageBox("请选择兴趣爱好");
		return -1;
	}
}

下拉选择框

代码语言:java
复制
BOOL CProp3::OnInitDialog() 
{
	CPropertyPage::OnInitDialog();
	
	// TODO: Add extra initialization here
	((CComboBox*)GetDlgItem(IDC_COMBO1))->AddString("<1000");
	((CComboBox*)GetDlgItem(IDC_COMBO1))->AddString("1000~2000");
	((CComboBox*)GetDlgItem(IDC_COMBO1))->AddString("2000~3000");
	((CComboBox*)GetDlgItem(IDC_COMBO1))->AddString("3000");


	((CComboBox*)GetDlgItem(IDC_COMBO1))->SetCurSel(0);
	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}

最终获得用户输入

最后获得用户输入

代码语言:java
复制
// 定义接收输入
private:
	int		m_work;
	CString	m_workPlace;
	BOOL	m_bool[4];
	CString m_money;
代码语言:java
复制
CPropMe4View::CPropMe4View()
{
	// TODO: add construction code here
	m_work = -1;
	m_workPlace = "";
	// 数组初始化
	memset(m_bool,0,sizeof(m_bool));
	m_money = "";
}
代码语言:java
复制
void CPropMe4View::OnPropSheetMy() 
{
	// TODO: Add your command handler code here
	CPropSheet propSheet("属性表单程序");
	propSheet.SetWizardMode();
	//propSheet.DoModal(); 获得返回值
	if(ID_WIZFINISH==propSheet.DoModal())
	{
		m_work = propSheet.m_prop1.m_work;
		m_workPlace = propSheet.m_prop1.m_workPlace;
		m_bool[0] = propSheet.m_prop2.m_bool1;
		m_bool[1] = propSheet.m_prop2.m_bool2;
		m_bool[2] = propSheet.m_prop2.m_bool3;
		m_bool[3] = propSheet.m_prop2.m_bool4;
		m_money = propSheet.m_prop3.m_money;

		// 让窗口无效,引起窗口的重绘
		Invalidate(); 
	}
}
代码语言:java
复制
void CPropMe4View::OnDraw(CDC* pDC)
{
	CPropMe4Doc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here

	// 输出输入的值
	CFont font;
	font.CreatePointFont(300,"华文行楷");

	CFont *pOldFont;
	pOldFont = pDC->SelectObject(&font);

	CString strTemp;
	strTemp = "你的职业:";
	switch(m_work){
	case 0:
		strTemp += "程序员";
		break;
	case 1:
		strTemp += "系统工程师";
		break;
	case 2:
		strTemp += "项目经理";
		break;
	default:
		break;
	}

	pDC->TextOut(0,0,strTemp);

	strTemp = "你的工作地点:";
	strTemp += m_workPlace;
	// 当前文本高度
	TEXTMETRIC tm;
	pDC->GetTextMetrics(&tm);

	pDC->TextOut(0,tm.tmHeight,strTemp);

	// 兴趣爱好
	strTemp = "你的兴趣爱好:";
	if(m_bool[0]){
		strTemp += "足球 ";
	}

	if(m_bool[1]){
		strTemp += "篮球 ";
	}
	if(m_bool[2]){
		strTemp += "排球 ";
	}
	if(m_bool[3]){
		strTemp += "网球 ";
	}

	pDC->TextOut(0,tm.tmHeight*2,strTemp);


	// 你的薪资
	strTemp = "你的薪资水平:";
	strTemp += m_money;
	pDC->TextOut(0,tm.tmHeight*3,strTemp);

    // 归位
	pDC->SelectObject(pOldFont);

}

总结

VC++6.0入门——第八讲 对话框编程(二)

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 引出
  • 第八讲 对话框编程(二)
    • 逃跑按钮的实现
    • 属性表单
      • 报错的解决
      • 中文乱码问题解决
    • 向导页面
      • 单选框的使用
      • 列表选择框
      • 多选框
      • 下拉选择框
    • 最后获得用户输入
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档