源程序在: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);
③ 处理CTabCtrl单击切换事件:
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;
}
这样做以后,就可以显示(切换)出三个配置界面了,下面再来关联配置变量,在stdafx.h中声明一个结构体:
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);
}