CTabCtrl在配置对话框中的应用

源程序在: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);
}







你可能感兴趣的:(CTabCtrl在配置对话框中的应用)