为了说明用VC制作可扩展对话框的方法,我们将制作如图1效果的对话框。
创建一个基于对话框、名为Expand的工程。编辑工程中对话框的内容并不重要,重要的是必须添加一个作分界线的控件和一个“高级”按钮。我们使用Picture控件(也可换为其它控件)当作分界线。
为IDC_ADVANCE按钮添加BN_CLICKED消息处理函数:
void CExpandDlg::OnAdvance()
{
static BOOL bExpand=TRUE;//记录扩展或收缩状态
ExpandDialog(IDC_DIVIDER,bExpand);//扩展或收缩对话框
bExpand=!bExpand;
}
添加用于扩展或收缩的保护成员函数ExpandDialog():
void CExpandDlg::ExpandDialog(int nResourceID, BOOL bExpand)
{
static CRect rcLarge;
//记录扩展后对话框的位置和大小
static CRect rcSmall;
//记录收缩后对话框的位置和大小
CString sExpand;
if(rcLarge.IsRectNull())
{
CRect rcLandmark;
//记录分界线的位置和大小
CWnd pWndLandmark=GetDlgItem(nResourceID);
ASSERT(pWndLandmark);
GetWindowRect(rcLarge);
pWndLandmark->GetWindowRect(rcLandmark);
rcSmall=rcLarge;
rcSmall.bottom=rcLandmark.top;// 如果将扩展部分放在对话框的右边,只需将此句改为rcSmall.right=rcLandmark.left;即可
}
if(bExpand)
{
SetWindowPos(NULL,0,0,rcLarge.Width(),rcLarge.Height(),
SWP_NOMOVE|SWP_NOZORDER);
sExpand="常规(&&L)<<";
EnableVisibleChildren();
}
else
{
SetWindowPos(NULL,0,0,rcSmall.Width(),rcSmall.Height(),SWP_NOMOVE|SWP_NOZORDER);
sExpand="高级(&&M)>>";
EnableVisibleChildren();
}
SetDlgItemText(IDC_ADVANCE,sExpand);
}
扩展和收缩情况下均调用保护成员函数EnableVisibleChildren()。此函数遍历对话框中各控件,如果某一控件在当前对话框范围之外则使其失效,防止用Tab键或快捷键仍能访问它。
void CExpandDlg::EnableVisibleChildren()
{
CWnd pWndCtl=GetWindow(GW_CHILD);
CRect rcTest;
CRect rcControl;
图1 扩展后的对话框
//记录各控件的位置和大小
CRect rcShow;
//记录目前显示对话框的位置和大小
GetWindowRect(rcShow);
while(pWndCtl!=NULL)
{
pWndCtl->GetWindowRect(rcControl);
if(rcTest.IntersectRect(rcShow,rcControl))
pWndCtl->EnableWindow(TRUE);
else
pWndCtl->EnableWindow(FALSE);
pWndCtl=pWndCtl->GetWindow(GW_HWNDNEXT);
}
}
最后,在对话框类的OnInitDialog函数的return语句之前加入:
ExpandDialog(IDC_DIVIDER,FALSE);
以上程序在Windows 98、Visual C++ 6.0下调试通过。
延伸阅读
文章来源于领测软件测试网 https://www.ltesting.net/