在文章开始之前,推荐一篇值得阅读的好文章!感兴趣的也可以去看一下,并关注作者!
题目: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按钮显示出来。
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这一函数。
但是,我们可以看到,上述这个向导对话框仍存在一些问题:在第一个页面上,不应该有“上一步”这个按钮;在最后一个页面上,不应该是“下一步”按钮,而应该是“完成”按钮。
右键,增加虚函数
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
}
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;
}
}
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
}
最终获得用户输入
// 定义接收输入
private:
int m_work;
CString m_workPlace;
BOOL m_bool[4];
CString m_money;
CPropMe4View::CPropMe4View()
{
// TODO: add construction code here
m_work = -1;
m_workPlace = "";
// 数组初始化
memset(m_bool,0,sizeof(m_bool));
m_money = "";
}
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();
}
}
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 删除。