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)在类向导中建立关联变量时,会发现只有组长有权力建立数值型关联变量。
初始化时对列表进行插入
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
}
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_TIME
enum { IDD = IDD_INPUT_DLG };
#endif
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnBnClickedOk();
afx_msg void OnBnClickedTest();
};
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); //使用关联数值变量后可不用getdlgitem
str.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();
else
NextDlgCtrl();
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);