前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >VC++6.0入门——第7讲 对话框编程(一)

VC++6.0入门——第7讲 对话框编程(一)

原创
作者头像
Arya
发布2024-11-25 10:37:13
发布2024-11-25 10:37:13
2040
举报
文章被收录于专栏:后端开发专栏后端开发专栏

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

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

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

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

引出


VC++6.0入门——第7讲 对话框编程(一)

第7讲 对话框编程(一)

Windows应用程序工作的基本流程是从用户那里得到数据,经过相应的处理之后,再把处理结果输出到屏幕、打印机或者其他的输出设备上。那么,应用程序是如何从用户那里得到数据,并且再将修改后的数据显示给用户的呢?这就需要用到Windows应用程序中一个很重要的用户接口一对话框。

新建的方式:

方式一:插入--->资源--->对话框

方式二:资源工具条中插入

有两种类型的对话框:模态(Modal)对话框和非模态(Modeless)对话框。

模态对话框

模态对话框是指当其显示时,程序会暂停执行,直到关闭这个模态对话框后,才能继续执行程序中其他任务。例如,在Wod中利用【文件打开】菜单命令显示一个“打开”对话框后,再用鼠标去选择其他菜单,或者进行该对话框以外的任何操作时,只会听到嘟嘟声,这是因为“打开”对话框是一个模态对话框。模态对话框垄断了用户的输入,当一个模态对话框打开时,用户只能与该对话框进行交互,而其他用户界面对象接收不到输入信息。我们平时所遇到的大部分对话框都是模态对话框。

非模态对话框

当非模态对话框显示时,允许转而执行程序中其他任务,而不用关闭这个对话框。典型的例子是Windows提供的记事本程序中的“查找”对话框,该对话框不会垄断用户的输入,打开“查找”对话框后,仍可以与其他用户界面对象进行交互,用户可以一边查找,一边修改文章,这样,就大大方便了使用。

右键,建立类向导

模态和非模态对话框

弹出模态对话框时,不能点击主窗口的其他按钮,只有关闭之后才能

代码语言:java
复制
void CMybolView::OnDialog() 
{
	// TODO: Add your command handler code here
	CTestDlg dlg;
	dlg.DoModal();

	CTestDlg dlg;
	dlg.Create(IDD_DIALOG1,this);
	dlg.ShowWindow(SW_SHOW);


	CTestDlg *pDlg = new CTestDlg();
	pDlg->Create(IDD_DIALOG1,this);
	pDlg->ShowWindow(SW_SHOW);
}

按钮创建按钮

新建按钮,右键,属性

方法一:定义布尔变量

设置一个BooL类型的变量,初始化值为False,然后添加的时候进行判断

代码语言:java
复制
void CTestDlg::OnButton1() 
{
	// TODO: Add your control notification handler code here
	if(m_isHas==false){

		m_btn.Create("weixin", BS_DEFPUSHBUTTON | WS_VISIBLE | WS_CHILD,
			CRect(0,0,100,100),this,123);
		m_isHas = true;
	}else{
		m_btn.DestroyWindow();
		m_isHas = false;
	}

}

方法二:利用静态变量

也可以这样,使用静态成员变量

方法三:使用句柄

代码语言:java
复制
void CTestDlg::OnButton1() 
{
	// 使用句柄
	if(!m_btn.m_hWnd){
		m_btn.Create("weixin", BS_DEFPUSHBUTTON | WS_VISIBLE | WS_CHILD,
			CRect(0,0,100,100),this,123);
	}else{
		m_btn.DestroyWindow();
	}
}

布局美化

其实就是Layout菜单中的按钮

静态文本框响应事件

1.要改名字,默认都是一样的,需要改成不一样的名字,才能添加单击事件的响应

2.默认样式里的通知是不勾选的,需要勾上,让他能接收通知

实现加法运算

GetDlgItem(IDC_EDIT1)->GetWindowText(ch1,10);

代码语言:java
复制
void CTestDlg::OnButton2() 
{
	// TODO: Add your control notification handler code here
	int num1,num2,num3;
	char ch1[10],ch2[10],ch3[10]; // 字符长度为10

	GetDlgItem(IDC_EDIT1)->GetWindowText(ch1,10);
	GetDlgItem(IDC_EDIT2)->GetWindowText(ch2,10);
	

	// 字符转数字
	num1 = atoi(ch1);
	num2 = atoi(ch2);
	num3 = num1 + num2;

	// 数字转文本,参数为数字,字符串,进制,这里是10进制
	itoa(num3,ch3,10);

	GetDlgItem(IDC_EDIT3)->SetWindowText(ch3);

}

组合方法GetDlgItemText

另一种方式,相当于上面方式的组合

代码语言:java
复制
	int num1,num2,num3;
	char ch1[10],ch2[10],ch3[10]; // 字符长度为10

	GetDlgItemText(IDC_EDIT1,ch1,10);
	GetDlgItemText(IDC_EDIT2,ch2,10);

	// 字符转数字
	num1 = atoi(ch1);
	num2 = atoi(ch2);
	num3 = num1 + num2;
	itoa(num3,ch3,10);
	SetDlgItemText(IDC_EDIT3,ch3);

第三种方式,GetDlgItemInt

代码语言:java
复制
int num1,num2,num3;

num1 = GetDlgItemInt(IDC_EDIT1);
num2 = GetDlgItemInt(IDC_EDIT2);
num3 = num1 + num2;

SetDlgItemInt(IDC_EDIT3,num3);

添加成员变量,实现关联【推荐】

DoDataExchange建立控件和成员变量之间的关联

代码语言:java
复制
	UpdateData();
	m_num3 = m_num1 + m_num2;
	UpdateData(FALSE);

使用控件变量

代码语言:java
复制
	int num1,num2,num3;
	char ch1[10],ch2[10],ch3[10]; // 字符长度为10

	m_edit1.GetWindowText(ch1,10);
	m_edit2.GetWindowText(ch2,10);

	num1 = atoi(ch1);
	num2 = atoi(ch2);
	num3 = num1 + num2;
	itoa(num3,ch3,10);

	m_edit3.SetWindowText(ch3);

通过发送消息获得文本

直接给对话框子控件发消息

实现按钮收缩和扩展功能

点击时,按钮字变化

代码语言:java
复制
void CTestDlg::OnButton3() 
{
	// TODO: Add your control notification handler code here
	CString str;
	if(GetDlgItemText(IDC_BUTTON3,str),str=="收缩<<"){
		SetDlgItemText(IDC_BUTTON3,"扩展");
	}else{
		SetDlgItemText(IDC_BUTTON3,"收缩<<");
	}
	
}

实现扩展和收缩

代码语言:java
复制
void CTestDlg::OnButton3() 
{
	// TODO: Add your control notification handler code here
	CString str;
	if(GetDlgItemText(IDC_BUTTON3,str),str=="收缩<<"){
		SetDlgItemText(IDC_BUTTON3,"扩展>>");
	}else{
		SetDlgItemText(IDC_BUTTON3,"收缩<<");
	}


	static CRect rectLarge; // 原始尺寸,静态
	static CRect rectSmall; // 缩小后的尺寸

	if(rectLarge.IsRectNull()){

		CRect rectSeparator;
		GetDlgItem(IDC_SEPATATOR)->GetWindowRect(rectSeparator);


		GetWindowRect(&rectLarge); // 获取当前尺寸

		rectSmall.left = rectLarge.left;
		rectSmall.top = rectLarge.top;
		rectSmall.right = rectLarge.right;
		rectSmall.bottom = rectSeparator.bottom;

	}

	if(str == "收缩<<"){
		SetWindowPos(NULL,0,0,rectSmall.Width(),rectSmall.Height(),
			SWP_NOMOVE | SWP_NOZORDER);
	}else{
		SetWindowPos(NULL,0,0,rectLarge.Width(),rectLarge.Height(),
			SWP_NOMOVE | SWP_NOZORDER);
	}
	
}

实现回车光标移动

显示之前发消息

代码语言:java
复制
LRESULT CALLBACK WindowProc(  HWND hwnd,      // handle to window
  UINT uMsg,      // message identifier
  WPARAM wParam,  // first message parameter
  LPARAM lParam   // second message parameter
)
代码语言:java
复制
// 窗口过程函数
WNDPROC prevProc; 
LRESULT CALLBACK WinSunProc(  HWND hwnd,      // handle to window
  UINT uMsg,      // message identifier
  WPARAM wParam,  // first message parameter
  LPARAM lParam   // second message parameter
)
{
	// 是不是字符消息,回车按键
	if(uMsg==WM_CHAR && wParam==0x0d){
		::SetFocus(::GetNextWindow(hwnd, GW_HWNDNEXT));
		return 1;

	}else{
		return prevProc(hwnd,uMsg,wParam,lParam);
	}
}



BOOL CTestDlg::OnInitDialog() 
{
	CDialog::OnInitDialog();
	
	// TODO: Add extra initialization here
	prevProc = (WNDPROC)SetWindowLong(GetDlgItem(IDC_EDIT1)->m_hWnd,GWL_WNDPROC,
		(LONG)WinSunProc);


	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}

其他获取下一个输入框句柄的方式

利用缺省处理实现

代码语言:java
复制
void CTestDlg::OnOK() 
{
	// TODO: Add extra validation here
//	GetDlgItem(IDC_EDIT1)->GetNextWindow()->SetFocus();
	GetFocus()->GetNextWindow()->SetFocus();

//	CDialog::OnOK();
}

持续回车会出现非法访问

代码语言:java
复制
void CTestDlg::OnOK() 
{
	// TODO: Add extra validation here
	GetNextDlgTabItem(GetFocus())->SetFocus();
//	CDialog::OnOK();
}

Tab顺序,布局下的Tab顺序可以进行改变,以上函数会按照序号循环查找

现在,我们取消收缩按钮的默认设置,并删除OK按钮,再次运行Mybole程序,打开测试对话框,按下回车键,会发现焦点仍是在各控件间依次转移。也就是说,当用户按下回车键时,Windows将查看对话框中是否存在指定的默认按钮,如果有,就调用该默认按钮单击消息的响应函数。如果没有,就会调用虚拟的OnOK函数,即使对话框没有包含默认的OK按钮。但是读者一定要注意,这个默认OK按钮的D是:IDOK。


总结

VC++6.0入门——第7讲 对话框编程(一)

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 引出
  • 第7讲 对话框编程(一)
    • 模态和非模态对话框
    • 按钮创建按钮
      • 方法一:定义布尔变量
      • 方法二:利用静态变量
      • 方法三:使用句柄
    • 布局美化
    • 静态文本框响应事件
    • 实现加法运算
      • GetDlgItem(IDC_EDIT1)->GetWindowText(ch1,10);
      • 组合方法GetDlgItemText
      • 第三种方式,GetDlgItemInt
      • 添加成员变量,实现关联【推荐】
      • 使用控件变量
      • 通过发送消息获得文本
      • 直接给对话框子控件发消息
    • 实现按钮收缩和扩展功能
      • 点击时,按钮字变化
      • 实现扩展和收缩
    • 实现回车光标移动
      • 利用缺省处理实现
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档