文章目录
- 数值型关联变量
- 数值型关联变量的种类介绍
- 单选按钮与复选框
- 单选按钮的组内选择原理解析
- 单选按钮和复选框以及应用数值型关联变量的开发
- CMainDlg.cpp
- CInputDlg.h
- CInputDlg.cpp
- 附录
数值型关联变量
数值型关联变量的种类介绍
1、 数值型关联变量:
a)控件型关联变量:针对于所有MFC工具箱中的控件都有效。
DDX_Control(pDX, IDC_LIST, m_list);
b)数值型关联变量:
有部分的控件支持数值型关联变量,大部分不支持。
c)ListCtrl添加关联变量时,控件型的下拉是灰色的。
d)只有可录入的控件才支持数值型关联变量。
编辑框、下拉、日期,单选钮和多选框,另外ListBox可以关联。
2、数值型关联变量的用法:
a)CWnd::UpdateData :更新数据,可以认为集体输入输出函数。
b)代入TRUE代表从界面输入到内存(类似于cin >>)
c)代入FALSE代表从内存输出到界面(类似于cout <<)
单选按钮与复选框
单选按钮的组内选择原理解析
单选按钮:
a)必须分组:设立一个组长;
b)WS_GROUP这个属性,几乎所有控件都没用除了单选按钮
c)必须把一组单选按钮的第一个设立为组长
d)在类向导中建立关联变量时,会发现只有组长有权力建立数值型关联变量。
单选按钮和复选框以及应用数值型关联变量的开发
CMainDlg.cpp
初始化时对列表进行插入
BOOL CMainDlg::OnInitDialog()
{CDialogEx::OnInitDialog();SetIcon(m_hIcon, TRUE); // 设置大图标SetIcon(m_hIcon, FALSE); // 设置小图标m_lsit.InsertColumn(0, _T("工号"), LVCFMT_LEFT, 110);m_lsit.InsertColumn(1, _T("姓名"), LVCFMT_LEFT, 110);m_lsit.InsertColumn(2, _T("工资"), LVCFMT_LEFT, 110);m_lsit.InsertColumn(3, _T("入职日期"), LVCFMT_LEFT, 120);m_lsit.InsertColumn(4, _T("性别"), LVCFMT_LEFT, 100);m_lsit.InsertColumn(5, _T("学历"), LVCFMT_LEFT, 100);m_lsit.InsertColumn(6, _T("语言"), LVCFMT_LEFT, 160);m_lsit.SetExtendedStyle(LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT);return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
CInputDlg.h
class CInputDlg : public CDialogEx
{int m_sNumb;CDateTimeCtrl m_Date;CString m_sName;double m_fSalary;COleDateTime m_sDate;BOOL m_bSex;int m_edu;BOOL m_Eng;BOOL m_Jpn;BOOL m_Rus;BOOL m_Kern;CButton m_bEng;DECLARE_DYNAMIC(CInputDlg)void InputData();CString GetLange();CListCtrl& m_lsit;LPCTSTR m_es[6]{ _T("初中"),_T("高中"), _T("大专"), _T("本科"), _T("硕士"), _T("博士") };
public:CInputDlg(CListCtrl& list); // 标准构造函数virtual ~CInputDlg();// 对话框数据
#ifdef AFX_DESIGN_TIMEenum { IDD = IDD_INPUT_DLG };
#endifprotected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持DECLARE_MESSAGE_MAP()
public:afx_msg void OnBnClickedOk();afx_msg void OnBnClickedTest();
};
CInputDlg.cpp
CInputDlg::CInputDlg(CListCtrl& list): CDialogEx(IDD_INPUT_DLG, nullptr), m_lsit(list), m_sNumb(1000), m_sName(_T("")), m_fSalary(0), m_sDate(COleDateTime::GetCurrentTime()), m_bSex(FALSE), m_edu(3), m_Eng(FALSE), m_Jpn(FALSE), m_Rus(FALSE), m_Kern(FALSE)
{
}
CInputDlg::~CInputDlg()
{
}
void CInputDlg::DoDataExchange(CDataExchange* pDX){CDialogEx::DoDataExchange(pDX);DDX_Text(pDX, IDC_NUMB, m_sNumb); // 函数 界面 内存 交换DDX_Control(pDX, IDC_DATETIME, m_Date);DDX_Text(pDX, IDC_NAME, m_sName);DDX_Text(pDX, IDC_SALARY, m_fSalary);DDX_DateTimeCtrl(pDX, IDC_DATETIME, m_sDate);DDX_Radio(pDX, IDC_RADIO1, m_bSex);DDX_Radio(pDX, IDC_RADIO3, m_edu);DDX_Check(pDX, IDC_CHK_ENG, m_Eng);DDX_Check(pDX, IDC_CHK_JPN, m_Jpn);DDX_Check(pDX, IDC_CHK_RUS, m_Rus);DDX_Check(pDX, IDC_CHK_KERN, m_Kern);DDX_Control(pDX, IDC_CHK_ENG, m_bEng);
}
BEGIN_MESSAGE_MAP(CInputDlg, CDialogEx)ON_BN_CLICKED(IDOK, &CInputDlg::OnBnClickedOk)ON_BN_CLICKED(IDC_TEST, &CInputDlg::OnBnClickedTest)
END_MESSAGE_MAP()//auto p = GetOwner(); 背景窗口 不属于父子关系 附着在上面
//CString str;
//p->GetWindowText(str);
void CInputDlg::InputData()
{UpdateData();int i = m_lsit.GetItemCount();CString str;
// GetDlgItemText(IDC_NUMB, str); //使用关联数值变量后可不用getdlgitemstr.Format(_T("%d"), m_sNumb);m_lsit.InsertItem(i, str);m_lsit.SetItemText(i, 1, m_sName);str.Format(_T("%0.2f"), m_fSalary);m_lsit.SetItemText(i, 2, str); str.Format(_T("%d年%d月%d日"), m_sDate.GetYear(), m_sDate.GetMonth(), m_sDate.GetDay());m_lsit.SetItemText(i, 3, str);m_lsit.SetItemText(i, 4, m_bSex?_T("女"):_T("男"));m_lsit.SetItemText(i, 5,m_es[m_edu]);m_lsit.SetItemText(i, 6, GetLange());SetFocus();
}//int n =GetDlgItemInt(IDC__CHK_ENG); 原理仍然是atoi( GetDlgItemText表面的文字)
CString CInputDlg::GetLange()
{CString str;if (m_bEng.GetCheck() == BST_CHECKED)//if (m_Eng)str += _T("英语 ");if (m_Jpn)str += _T("日语 ");if (m_Kern)str += _T("韩语 ");if (m_Rus)str += _T("俄语 ");return str;
}void CInputDlg::OnBnClickedOk()
{CWnd* p = GetFocus();int nID = p->GetDlgCtrlID();if (nID == IDOK|| nID ==IDC_DATETIME)InputData();elseNextDlgCtrl();CDialogEx::OnOK();
}
void CInputDlg::OnBnClickedTest()
{if (++m_edu > 5) //判断是否在范围m_edu = 0;auto p = (CButton*)GetDlgItem(IDC_EDUC); //获取指针int n = 0; do{p->SetCheck((m_edu == n)); //设置选择和没有选择的按钮p = (CButton*)p->GetWindow(GW_HWNDNEXT); //向下查找++n;} while (p && !(GetStyle()&WS_GROUP)); //判断遇到下一个组长结束 而且p不等于空
}
附录
所有关联变量的类型(全)
simple text operations 编辑框可以管理以下这些变量种类
void AFXAPI DDX_Text(CDataExchange* pDX, int nIDC, BYTE& value);
void AFXAPI DDX_Text(CDataExchange* pDX, int nIDC, short& value);
void AFXAPI DDX_Text(CDataExchange* pDX, int nIDC, int& value);
void AFXAPI DDX_Text(CDataExchange* pDX, int nIDC, UINT& value);
void AFXAPI DDX_Text(CDataExchange* pDX, int nIDC, long& value);
void AFXAPI DDX_Text(CDataExchange* pDX, int nIDC, DWORD& value);
void AFXAPI DDX_Text(CDataExchange* pDX, int nIDC, LONGLONG& value);
void AFXAPI DDX_Text(CDataExchange* pDX, int nIDC, ULONGLONG& value);
void AFXAPI DDX_Text(CDataExchange* pDX, int nIDC, CString& value);
void AFXAPI DDX_Text(CDataExchange* pDX, int nIDC, LPTSTR value, int nMaxLen);
void AFXAPI DDX_Text(CDataExchange* pDX, int nIDC, float& value);
void AFXAPI DDX_Text(CDataExchange* pDX, int nIDC, double& value);
special control types
void AFXAPI DDX_Check(CDataExchange* pDX, int nIDC, int& value); 复选
void AFXAPI DDX_Radio(CDataExchange* pDX, int nIDC, int& value); 单选
void AFXAPI DDX_LBString(CDataExchange* pDX, int nIDC, CString& value); ListBox
void AFXAPI DDX_LBIndex(CDataExchange* pDX, int nIDC, int& index); ListBox
//void AFXAPI DDX_LBStringExact(CDataExchange* pDX, int nIDC, CString& value);
void AFXAPI DDX_CBStringExact(CDataExchange* pDX, int nIDC, CString& value);
void AFXAPI DDX_CBString(CDataExchange* pDX, int nIDC, CString& value); //ComboBox
void AFXAPI DDX_CBIndex(CDataExchange* pDX, int nIDC, int& index);//ComboBox
void AFXAPI DDX_Scroll(CDataExchange* pDX, int nIDC, int& value);
void AFXAPI DDX_Slider(CDataExchange* pDX, int nIDC, int& value);
void AFXAPI DDX_IPAddress(CDataExchange* pDX, int nIDC, DWORD& value);
void AFXAPI DDX_DateTimeCtrl(CDataExchange* pDX, int nIDC, CString& value);
void AFXAPI DDX_DateTimeCtrl(CDataExchange* pDX, int nIDC, CTime& value);
void AFXAPI DDX_DateTimeCtrl(CDataExchange* pDX, int nIDC, COleDateTime& value);
void AFXAPI DDX_Control(CDataExchange* pDX, int nIDC, CWnd& rControl);