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);
}
如何建立数值型关联变量
- 右键第一个edit控件,选择添加变量
- 在打开的对话框,按下图修改
- 点完成,其他几个输入框类似操作
建立好之后,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,而且
-
关联变量能用的类型表
控件 | 控件类型 | 控件变量类型 | 值变量类型 | 最小/最大值 |
---|---|---|---|---|
动画控件 | SysAnimate32 | CAnimateCtrl | ||
Button | BUTTON | CButton | ||
Check box | CHECK | CButton | BOOL | 最小/最大值 |
Combo box | COMBOBOX | CComboBox | CString、int | 最大字符数 |
日期时间选择器 (Date Time Picker) 控件 | SysDateTimePick32 | CDataTimeCtrl | CTime | 最小/最大值 |
编辑框 | EDIT | CEdit | CString、int、UINT、long、DWORD、float、double、BYTE、short、BOOL、 COleDateTime 或 COleCurrency | 最小值/最大值;某些支持最大字符数 |
热键 (Hot Key) 控件 | msctls_hotkey32 | CHotKeyCtrl | ||
列表框 | LISTBOX | CListBox | CString | 最大字符数 |
List 控件 | SysListView32 | CListCtrl | ||
月历控件 (Month Calendar Control) | SysMonthCal32 | CMonthCalCtrl | CTime | 最小值/最大值 |
进度控件 | msctls_progress32 | CProgressCtrl | ||
Rich Edit 2.0 控件 | RichEdit20A | CRichEditCtrl | CString | 最大字符数 |
Rich Edit 控件 | RICHEDIT | CRichEditCtrl | CString | 最大字符数 |
滚动条 (Scroll Bar)(垂直或水平) | SCROLLBAR | CScrollBar | int | 最小值/最大值 |
滑块控件 (Slider Control) | msctls_trackbar32 | CSliderCtrl | int | 最小值/最大值 |
数值调节钮控件 (Spin Control) | msctls_updown32 | CSpinButtonCtrl | ||
选项卡控件 (Tab Control) | SysTabControl32 | CTabCtrl | ||
树控件 (Tree Control) | SysTreeView32 | CTreeCtrl |
3. 对话框数据验证DDV
数值型关联变量比如int还能设置最大值最小值
当我输入的数据不在范围内,就会出提示
控件型关联变量
##如何建立控件型变量
- 控件型关联变量,获取控件的窗口指针,通过变量绑定它
使用方法跟窗口指针一样
m_buttonControl.SetWindowTextW(_T("按钮"));//设置按钮文本
m_buttonControl.DestroyWindow();//销毁按钮