当前位置: 首页 > news >正文

windows第十章 数值型关联变量和控件型关联变量

文章目录

  • 数值型关联变量
    • 计算器案例
    • 如何建立数值型关联变量
    • 交换和验证对话数据技术
      • 1. DoDataExchange函数
      • 2. 对话框数据交换DDX
      • 3. 对话框数据验证DDV
  • 控件型关联变量

数值型关联变量

计算器案例

在这里插入图片描述


// CalcDlg.cpp: 实现文件
//

#include "pch.h"
#include "framework.h"
#include "Calc.h"
#include "CalcDlg.h"
#include "afxdialogex.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// CCalcDlg 对话框



CCalcDlg::CCalcDlg(CWnd* pParent /*=nullptr*/)
	: CDialogEx(IDD_CALC_DIALOG, pParent)
{
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CCalcDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CCalcDlg, CDialogEx)
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDOK, &CCalcDlg::OnBnClickedOk)
END_MESSAGE_MAP()


// CCalcDlg 消息处理程序

BOOL CCalcDlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	// 设置此对话框的图标。  当应用程序主窗口不是对话框时,框架将自动
	//  执行此操作
	SetIcon(m_hIcon, TRUE);			// 设置大图标
	SetIcon(m_hIcon, FALSE);		// 设置小图标

	auto pCombo = (CComboBox*)GetDlgItem(IDC_COMBO1);
	pCombo->AddString(_T("+"));
	pCombo->AddString(_T("-"));
	pCombo->AddString(_T("*"));
	pCombo->AddString(_T("/"));
	pCombo->SetCurSel(0);//设置默认选择项

	return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

// 如果向对话框添加最小化按钮,则需要下面的代码
//  来绘制该图标。  对于使用文档/视图模型的 MFC 应用程序,
//  这将由框架自动完成。

void CCalcDlg::OnPaint()
{
	if (IsIconic())
	{
		CPaintDC dc(this); // 用于绘制的设备上下文

		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

		// 使图标在工作区矩形中居中
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// 绘制图标
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialogEx::OnPaint();
	}
}

//当用户拖动最小化窗口时系统调用此函数取得光标
//显示。
HCURSOR CCalcDlg::OnQueryDragIcon()
{
	return static_cast<HCURSOR>(m_hIcon);
}




void CCalcDlg::OnBnClickedOk()
{
	//获取选择的运算符
	auto pCombo = (CComboBox*)GetDlgItem(IDC_COMBO1);
	int index = pCombo->GetCurSel();
	CString str;
	pCombo->GetLBText(index, str);
	//获取输入的数字
	int num1 = GetDlgItemInt(IDC_EDIT_NUM1);
	int num2 = GetDlgItemInt(IDC_EDIT_NUM2);
	//计算结果
	float result = 0;
	switch (str[0])
	{
	case '+':
		result = num1 + num2;
		break;
	case '-':
		result = num1 - num2;
		break;
	case '*':
		result = num1 * num2;
		break;
	case '/':
		result = 1.0 * num1 / num2;
		break;
	}
	//显示结果
	CString resultStr;
	resultStr.Format(_T("%.2f"), result);
	SetDlgItemText(IDC_EDIT_RES, resultStr);
}

如何建立数值型关联变量

  1. 右键第一个edit控件,选择添加变量
    在这里插入图片描述
  2. 在打开的对话框,按下图修改
    在这里插入图片描述
  3. 点完成,其他几个输入框类似操作
    在这里插入图片描述
    在这里插入图片描述
    建立好之后,void CCalcDlg::OnBnClickedOk()就可以简化为如下
void CCalcDlg::OnBnClickedOk()
{
	UpdateData(TRUE);//从控件中获取数据
	switch (m_operator[0])
	{
	case '+':
		m_res = m_num1 + m_num2;
		break;
	case '-':
		m_res = m_num1 - m_num2;
		break;
	case '*':
		m_res = m_num1 * m_num2;
		break;
	case '/':
		m_res = 1.0 * m_num1 / m_num2;
		break;
	}
	m_res = round(m_res * 100) / 100;	//保留2位小数
	UpdateData(FALSE);//将数据更新到控件中
}

交换和验证对话数据技术

1. DoDataExchange函数

在这里插入图片描述
通过断点调试,发现程序执行的顺序

OnInitDiaog => DoDataExchange
显示界面
我们输入数据,点计算
UpdateData => DoDataExchange
UpdateData => DoDataExchange
更新数据,显示

DoDataExchange的作用是进行数据交换和验证,不需要手动调用,也不能手动调用,是由UpdateData调用的
上例OnInitDialog后也会调用,说明OnInitDialog应该是调用了UpdateData(FALSE)

2. 对话框数据交换DDX

  • 有些控件不支持数值型关联变量
    例如Button
    在这里插入图片描述
    可以看到类别选项是灰色的,点不开

  • 有些数值型关联变量要特定的类型,否则会报错
    radioButton,我使用BOOL类型会弹出错误提示,而用int就没限制
    在这里插入图片描述
    然后把radioButton减少到2个,第一个加了组长,才能用的BOOL,而且
    在这里插入图片描述

  • 关联变量能用的类型表

控件控件类型控件变量类型值变量类型最小/最大值
动画控件SysAnimate32CAnimateCtrl
ButtonBUTTONCButton
Check boxCHECKCButtonBOOL最小/最大值
Combo boxCOMBOBOXCComboBoxCString、int最大字符数
日期时间选择器 (Date Time Picker) 控件SysDateTimePick32CDataTimeCtrlCTime最小/最大值
编辑框EDITCEditCString、int、UINT、long、DWORD、float、double、BYTE、short、BOOL、 COleDateTime 或 COleCurrency最小值/最大值;某些支持最大字符数
热键 (Hot Key) 控件msctls_hotkey32CHotKeyCtrl
列表框LISTBOXCListBoxCString最大字符数
List 控件SysListView32CListCtrl
月历控件 (Month Calendar Control)SysMonthCal32CMonthCalCtrlCTime最小值/最大值
进度控件msctls_progress32CProgressCtrl
Rich Edit 2.0 控件RichEdit20ACRichEditCtrlCString最大字符数
Rich Edit 控件RICHEDITCRichEditCtrlCString最大字符数
滚动条 (Scroll Bar)(垂直或水平)SCROLLBARCScrollBarint最小值/最大值
滑块控件 (Slider Control)msctls_trackbar32CSliderCtrlint最小值/最大值
数值调节钮控件 (Spin Control)msctls_updown32CSpinButtonCtrl
选项卡控件 (Tab Control)SysTabControl32CTabCtrl
树控件 (Tree Control)SysTreeView32CTreeCtrl

3. 对话框数据验证DDV

数值型关联变量比如int还能设置最大值最小值
在这里插入图片描述

当我输入的数据不在范围内,就会出提示
在这里插入图片描述

控件型关联变量

##如何建立控件型变量
在这里插入图片描述

  • 控件型关联变量,获取控件的窗口指针,通过变量绑定它

使用方法跟窗口指针一样

m_buttonControl.SetWindowTextW(_T("按钮"));//设置按钮文本
m_buttonControl.DestroyWindow();//销毁按钮

相关文章:

  • DeepSeek-R1论文阅读及本地调用
  • 深入理解JVM的运行时数据区
  • 【鸿蒙开发】第三十六章 状态管理 - V1V2混用和迁移指导
  • 清影2.0(AI视频生成)技术浅析(二):自然语言处理
  • Next.js【详解】获取数据(访问接口)
  • 什么是高亮环形光源
  • Vue2/Vue3分别如何使用computed
  • 深入理解Java三大特性:封装、继承和多态
  • python中的深度学习框架TensorFlow 和 PyTorch 有什么区别?
  • 调用DeepSeek API接口:实现智能数据挖掘与分析
  • 记录阿里云CDN配置
  • C语言如何实现面向对象?——从结构体到自由函数的思考
  • 分享一些处理复杂HTML结构的经验
  • 网络安全学习笔记
  • java处理pgsql的text[]类型数据问题
  • window patch按块分割矩阵
  • 大脑网络与智力:基于图神经网络的静息态fMRI数据分析方法|文献速递-医学影像人工智能进展
  • HashMap详解+简单手写实现(哈希表)
  • 深度学习机器学习:常用激活函数(activation function)详解
  • Qt Creator 5.0.2 (Community)用久了突然变得很卡
  • 自由做图网站/网站seo在线诊断
  • 湛江网站建设开发/色盲眼镜
  • wordpress 登陆浏览/登封网站关键词优化软件
  • 做自己的网站需要什么/产品seo标题是什么
  • 竞彩网站开发/如何设计推广方案
  • 手机公司网站建设/北京百度推广seo