1.创建基于对话框的MFC
2.对话框添加入一个标签控件,ID为IDC_TAB1,成员变量:m_Tab,CTabCtrl类型
增加3个对话框IDD_DIALOGPAY,IDD_DIALOGSHIPPING,IDD_DIALOGUSER,都基于Dialog基类创建,即默认创建
并且每个对话框的属性为样式:下层,边框:无
添加如下图的对应对话框控件:
IDD_DIALOGUSER
IDD_DIALOGSHIPPING
IDD_DIALOGPAY
将第二个对话框的第一个“普通快递送货上门”单选按钮属性设置:√组[G]
将第三个对话框的第一个“货到付款”单选按钮属性设置为:√组[G]
然后设置这2个按钮的变量为int类型,变量名为m_nShippingType和m_nPayType
User对话框的编辑框属性分别为:m_strName,m_strPhone,m_strAddress,m_strEmail (都为CString类型)
3.
在主对话框的Dlg头文件中添加如下代码:
#include "DIALOGPAY.h"
#include "DIALOGSHIPPING.h"
#include "DIALOGUSER.h"
在主对话框Dlg类中定义公有成员:
CImageList m_ImageList;
CDIALOGUSER m_DlgUser;
CDIALOGSHIPPING m_DlgShipping;
CDIALOGPAY m_DlgPay;
4.导入3个图标,用于显示标签项图标。
名字为:IDI_ICONUSER 、IDI_ICONSHIPPING 、IDI_ICONPAY
然后在Dlg的自定义函数中添加如下:
CMyLabelApp * pApp =(CMyLabelApp *)AfxGetApp();
m_ImageList.Create(16,16,ILC_COLOR16,3,0);
m_ImageList.SetBkColor(RGB(255,255,255));
m_ImageList.Add(pApp->LoadIcon(IDI_ICONUSER));
m_ImageList.Add(pApp->LoadIcon(IDI_ICONSHIPPING));
m_ImageList.Add(pApp->LoadIcon(IDI_ICONPAY));
m_Tab.SetImageList(&m_ImageList);
m_Tab.InsertItem(0,"会员信息",0);//前面的0表示该标签索引号,后面的0表示该标签的图标.后面同理
m_Tab.SetItemSize(200);
m_Tab.InsertItem(1,"配送方式",1);
m_Tab.SetItemSize(200);
m_Tab.InsertItem(2,"付款方式",2);
m_Tab.SetItemSize(200);
//将3个对话框创建,并且附加到Tabcontrol中,不是很理解这个东东
m_DlgUser.Create(IDD_DIALOGUSER,GetDlgItem(IDC_TAB1));
m_DlgShipping.Create(IDD_DIALOGSHIPPING,GetDlgItem(IDC_TAB1));
m_DlgPay.Create(IDD_DIALOGPAY,GetDlgItem(IDC_TAB1));
//这下面的改变对话框的大小适应标签控件的大小其实是不存在的.
CRect rect;
m_Tab.GetClientRect(&rect);//获取Tabcontrol控件大小,为了使对话框能嵌入到里面
//改变对话框的大小来适合TabCtrol控件的大小,并且在TabCtrol控件中首先显示m_DlgUser的页面
m_DlgUser.SetWindowPos(NULL,10,20,rect.right-20,rect.bottom-40,SWP_SHOWWINDOW);//默认显示USER界面
5.利用标签消息TCN_SELCHANGE的消息映射函数改变标签框内的界面,TCN_SELCHANGE消息是在标签项被改变后发生。
//标签项改变当前选择后发生
void CMyLabelDlg::OnSelchangeTab1(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: Add your control notification handler code here
int nCurSel=m_Tab.GetCurSel();//获取用户选择的当前标签页
CRect rect;
m_Tab.GetClientRect(&rect);//得到标签框控件的大小
switch(nCurSel)
{
//当用户选择标签1时,显示m_DlgUser,隐藏其他2个
case 0:
m_DlgUser.SetWindowPos(NULL,10,20,rect.right-20,rect.bottom-40,SWP_SHOWWINDOW);//显示
m_DlgShipping.SetWindowPos(NULL,10,20,rect.right-20,rect.bottom-40,SWP_HIDEWINDOW);//隐藏
m_DlgPay.SetWindowPos(NULL,10,20,rect.right-20,rect.bottom-40,SWP_HIDEWINDOW);//隐藏 (后面同理)
break;
//选择标签2,显示m_DlgShipping
case 1:
m_DlgUser.SetWindowPos(NULL,10,20,rect.right-20,rect.bottom-40,SWP_HIDEWINDOW);
m_DlgShipping.SetWindowPos(NULL,10,20,rect.right-20,rect.bottom-40,SWP_SHOWWINDOW);
m_DlgPay.SetWindowPos(NULL,10,20,rect.right-20,rect.bottom-40,SWP_HIDEWINDOW);
break;
case 2:
m_DlgUser.SetWindowPos(NULL,10,20,rect.right-20,rect.bottom-40,SWP_HIDEWINDOW);
m_DlgShipping.SetWindowPos(NULL,10,20,rect.right-20,rect.bottom-40,SWP_HIDEWINDOW);
m_DlgPay.SetWindowPos(NULL,10,20,rect.right-20,rect.bottom-40,SWP_SHOWWINDOW);
break;
}
*pResult = 0;
}
6.当用户设置好所有标签界面的内容后,按确定会出现报单界面:
void CMyLabelDlg::OnOK()
{
// TODO: Add extra validation here
//获取用户设置数据
m_DlgUser.UpdateData(TRUE);
m_DlgShipping.UpdateData(TRUE);
m_DlgPay.UpdateData(TRUE);
CString strMessage;
strMessage.Format("姓名:%s,电话:%s,地址:%s,邮箱:%s",m_DlgUser.m_strName,m_DlgUser.m_strPhone,
m_DlgUser.m_strAddress,m_DlgUser.m_strEmail);
//设置为'组'属性的单选按钮能接受到在同一对话框内的其他单选按钮传递的消息。
switch(m_DlgShipping.m_nShippingType)
{
case 0:strMessage+="\n配送方式:普通快递送货上门";break;
case 1:strMessage+="\n配送方式:加速快递送货上门";break;
case 2:strMessage+="\n配送方式:普通邮递";break;
case 3:strMessage+="\n配送方式:邮政特快专递";break;
}
switch(m_DlgPay.m_nPayType)
{
case 0:strMessage+="\n付款方式:货到付款";break;
case 1:strMessage+="\n付款方式:邮局汇款";break;
case 2:strMessage+="\n付款方式:网上支付";break;
case 3:strMessage+="\n付款方式:银行转账";break;
}
MessageBox(strMessage,"信息确认",MB_OKCANCEL);
CDialog::OnOK();
}