我們在信息輸入的時候,可能有很大的信息量,而這些信息又不是必須的,這時我們就需要給信息輸入人員一個選擇的接口。例如一個人事部門的職工信息錄入系統就有這樣的問題,其中的姓名、性別、年齡、政治面目、職務、學歷、部門和聯系電話是必須輸入的信息,而婚姻狀況、畢業學校、籍貫和健康狀況是可輸可不輸的信息且大多數情況下不需要錄入,如何為信息錄入人員提供一個方便的輸入接口,下面我們就針對這個問題提供一個我認為比較好的方法。
第一步:在VC編程環境下建立一個基於對話框的工程,工程名為ExpandDlg,所有的選項都取默認值。
第二步:建立我們都對話框,其中必須要有這樣兩個控件,一個是PICTURE控件,一個為按鈕,其ID值分別為IDC_DIVIDER和IDC_MORE。其它的控件可以任意布局,最終結果就是對話框被IDC_DIVIDER控件分成了兩部分,其中下半部分可以根據你的愛好動態顯示或不顯示,對話框如下圖:
第三步:生成按鈕IDC_MORE的消息映射函數OnMore,在ExpandDlgDlg.h中定義兩個函數如下:
public:
void EnableVisibleChildren();
void ExpandDialog (int nResourceID, BOOL bExpand);
第四步:在ExpandDlgDlg.cpp中定義函數的實現代碼如下:
void CExpandDlgDlg::ExpandDialog (int nResourceID, BOOL bExpand)
{
// 對話框被nResourceID分成上下兩部分,如果bExpand的值為TRUE
// 對話框被完整顯示,否則對話框顯示上半部分。
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;
}
if (bExpand)
{
//擴展對話框到最大尺寸
SetWindowPos(NULL, 0, 0, rcLarge.Width(), rcLarge.Height(),
SWP_NOMOVE | SWP_NOZORDER);
sExpand = "<< &Less";
EnableVisibleChildren();
}
else
{
//只顯示對話框的上半部分
SetWindowPos(NULL, 0, 0, rcSmall.Width(), rcSmall.Height(),
SWP_NOMOVE | SWP_NOZORDER);
sExpand = " &More >>";
EnableVisibleChildren();
}
SetDlgItemText (IDC_MORE, sExpand);
}
void CExpandDlgDlg::EnableVisibleChildren()
{
//去掉沒有顯示的對話框的控件的功能和快捷鍵。
//得到第一個窗口
CWnd *pWndCtl = GetWindow (GW_CHILD);
CRect rcTest;
CRect rcControl;
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);
}
}
void CExpandDlgDlg::OnMore()
{
static BOOL bExpand = TRUE;
ExpandDialog (IDC_DIVIDER, bExpand);
bExpand = !bExpand;
}
按照上面的步驟生成我們的可執行文件後運行,點擊對話框上的〔More〕我們可以發現對話框擴展,點擊〔Less〕後,我們發現對話框收縮,希望可以給你帶來方便。