接一位亲戚工作时的需求,需要做一个简单的药量计算程序,分为粉剂和水剂两种情况计算。计算的公式并不复杂,为了将两种情况合在一个对话框程序中实现,需要用类似属性单的功能,但不知道基于对话窗的MFC程序要怎么使用属性单(基类是CWnd而不是CDialog),看到TabControl控件可以实现了类似的功能,就尝试做了一下。最后效果是这样的:
其实严格来说这个控件并不是像属性单那样的(或者说这个控件需要自己定义的东西更多),属性单可以直接切换不同的子对话框,而TabControl控件还需要你设置好窗口的位置,大小,切换时的操作等。
比如这个例子,首先要将TabControl控件拉到最大,占据整个原对话框,并设置好选项卡在下方(在熟悉后这些可以根据自己接下来设置子窗口的位置来改动)。并添加控件变量MyCal。在对话框的初始函数OnInitDialog()中加入如下语句:(粗体为添加的)
// TODO: 在此添加额外的初始化代码
MyCal.InsertItem(0, L"粉剂"); //添加参数一选项卡
MyCal.InsertItem(1, L"水剂"); //添加参数二选项卡
MyCalSolid.Create(IDD_Cal_Solid, GetDlgItem(IDC_MyTab));
MyCalWater.Create(IDD_Cal_Water, GetDlgItem(IDC_MyTab));
//获得IDC_TABTEST客户区大小
CRect rs;
MyCal.GetClientRect(&rs);
//调整子对话框在父窗口中的位置
rs.top -= 10;
rs.bottom -= 20;
rs.left += 1;
rs.right -= 2;
//设置子对话框尺寸并移动到指定位置
MyCalSolid.MoveWindow(&rs);
MyCalWater.MoveWindow(&rs);
//分别设置隐藏和显示
MyCalSolid.ShowWindow(true);
MyCalWater.ShowWindow(false);
//设置默认的选项卡
MyCal.SetCurSel(0);
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
首先设置好TabControl控件中选项卡的名字并对应好选项卡序号,然后新建对应的无边框(Border)的对话框(该例子子对话框的ID为IDD_Cal_Water和IDD_Cal_Solid)。建立完成对应的添加它们的类并调用Create函数把它加入到TabControl控件中。接下来再调整好子对话框的位置,最后设置默认的显示子窗口的形式,该例子中为显示Solid的窗口,隐藏Water的窗口,并将它与默认的选项卡序号对应上。为了完成切换选项卡时切换窗口,我们再加入TabControl控件的时间响应函数:
void CCalculateMedicineDlg::OnTcnSelchangeMytab(NMHDR *pNMHDR, LRESULT *pResult)
{
// TODO: 在此添加控件通知处理程序代码
int CurSel = MyCal.GetCurSel();
switch (CurSel)
{
case 0:
MyCalSolid.ShowWindow(true);
MyCalWater.ShowWindow(false);
//m_result.ShowWindow(false);
break;
case 1:
MyCalSolid.ShowWindow(false);
MyCalWater.ShowWindow(true);
//m_result.ShowWindow(false);
break;
case 2:
MyCalSolid.ShowWindow(false);
MyCalWater.ShowWindow(false);
//m_result.ShowWindow(true);
break;
default:
;
}
*pResult = 0;
}
此时即可实现功能。
PS:另外还有就是这次做项目的时候发现对既可以是控制也可以是值的控件添加变量时,如果变量不需要自动的改动之类的(如用户手动输入的原始质量等),可以添加值变量,如果是需要自动更新值之类的(如输出的提取体积),则最好用控制变量。颜色控件类似的也是如此。