CTabCtrl在配置对话框中的应用

来源:互联网 发布:麻将教程新手入门软件 编辑:程序博客网 时间:2024/06/11 11:27

源程序在: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_MAPextern 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();//默认会调用每个配置对话框的 DoDataExchangem_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);}







原创粉丝点击