源程序在:http://download.csdn.net/detail/dijkstar/5188163 下载;
经常会碰到很多个配置变量,一个页面上放不下,或者不相关的另一些配置内容,需要把它们放在不同的页面上,最后点击【OK】(或保存),保存到配置文件中去,这样的界面和逻辑是如何实现的呢?
如上图中, 选取了三个配置界面,每个配置界面上有一些编辑框、下拉框、单选框或者复选框,【确定】按钮是用来做最后保存用的;
① 首先创建三个CDialog的对话框资源,每个资源的style为child类型,并且去掉工具栏和系统菜单;
② 在主对话框的OnInitDialog中:
// // 创建TabCtrl上的文字显示 // m_TabCtrl.InsertItem(0, "配置1"); m_TabCtrl.InsertItem(1, "配置2"); m_TabCtrl.InsertItem(2, "配置3"); // // 为TabCtrl关联每一个Dialog // m_Dlg1.Create(CDlg1::IDD, &m_TabCtrl); m_Dlg2.Create(CDlg2::IDD, &m_TabCtrl); m_Dlg3.Create(CDlg3::IDD, &m_TabCtrl); // // 调整每个Dialog的显示位置,使其在TabCtrl控件中,最后显示第一个页面 // CRect rect; m_TabCtrl.GetClientRect(&rect); m_Dlg1.MoveWindow(rect.left + 10, rect.top + 30, rect.Width() - 20, rect.Height()-40, FALSE); m_Dlg2.MoveWindow(rect.left + 10, rect.top + 30, rect.Width() - 20, rect.Height()-40, FALSE); m_Dlg3.MoveWindow(rect.left + 10, rect.top + 30, rect.Width() - 20, rect.Height()-40, FALSE); m_Dlg1.ShowWindow(SW_SHOW);
void CTestDlg::OnSelchangeTab1(NMHDR* pNMHDR, LRESULT* pResult) { int n = m_TabCtrl.GetCurSel(); if (n == 0) { m_Dlg1.ShowWindow(SW_SHOW); m_Dlg2.ShowWindow(SW_HIDE); m_Dlg3.ShowWindow(SW_HIDE); } else if (n == 1) { m_Dlg1.ShowWindow(SW_HIDE); m_Dlg2.ShowWindow(SW_SHOW); m_Dlg3.ShowWindow(SW_HIDE); } else if (n == 2) { m_Dlg1.ShowWindow(SW_HIDE); m_Dlg2.ShowWindow(SW_HIDE); m_Dlg3.ShowWindow(SW_SHOW); } *pResult = 0; }
typedef struct { BOOL bSetup; CString strname; CString strNo; BOOL bListen; }MY_TYPE;用它来定义一个变量,用来保存配置的全局数据结构,假设为 g_myObj;
在每一个的配置对话框的DoDataExchange中完成数据交换,这些要自己手动输入,例如配置界面3的为:
void CDlg3::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CDlg3) // NOTE: the ClassWizard will add DDX and DDV calls here //}}AFX_DATA_MAP extern MY_TYPE g_myObj; DDX_Check(pDX, IDC_CHECK2, g_myObj.bListen);//【DDX_】开头的自己在MSDN索引栏里自己查,有很多 DDX_Text(pDX, IDC_EDIT1, g_myObj.strNo); }
void CTestDlg::OnOK() { // TODO: Add extra validation here // // 取出每一个界面上的控件值,到关联的变量 // m_Dlg1.UpdateData();//默认会调用每个配置对话框的 DoDataExchange m_Dlg2.UpdateData(); m_Dlg3.UpdateData(); // // 最后测试(显示)取出界面上的数据是否正确? // CString str, tmp; tmp.Format("%d ", (int)g_myObj.bListen); str += tmp; tmp.Format("%d ", (int)g_myObj.bSetup); str += tmp; str += g_myObj.strname; str += g_myObj.strNo; AfxMessageBox(str); }