關鍵字 VC 對話框
主要內容:
1, 建立有模式對話框和無模式對話框
2, 控件的對齊及焦點設置
3, 實例
4, 通用對話框
5, 常用函數
對話框可按其動作模式分爲“有模式”和“無模式”兩大類。對於有模式對話框,在對話框被關閉之前,用戶無法進行其它工作。而無模式的對話框,而它仍然保留在屏幕上的同時,用戶可以在應用程序的其它窗口進行工作。
建立一個基於對話框的程序Dialog.
在資源管理器中插入一個對話框,Ctrl+w新建一個類COwnerDiaog;在IDD_DIALOG_DIALOG中加一個按鈕,雙擊它編輯代碼。
void CDialogDlg::OnButton1()
{
COwnerDialog dlg;
dlg.DoModal();
}
不要忘了#include "OwnerDialog.h"。你不關閉它,無法對主對話框下達命令,但你仍然可以打開其它程序。我們刪除剛剛添加的代碼。
void CDialogDlg::OnButton1()
{
COwnerDialog *pDlg=new COwnerDialog();
pDlg->Create(IDD_DIALOG1);
pDlg->ShowWindow(SW_RESTORE);
}
這是一個無模式對話框,你可以在處理子對話框之前,對主對話框下達命令。注意如果你關閉了主對話框,則子對話框也被關閉了。
在Layout中有四個功能是十分有用的,Tab Order(快捷鍵Ctrl+D):依次單擊按鈕決定它們的焦點順序。
這樣當用戶,按Tab鍵切換焦點時,控件獲得焦點的順序就是我們設定好的。例如一個對話框要我們輸入用戶名,口今,再按確定。我們將它們的焦點順序分別設爲1,2,3,這樣用戶輸入了用戶名,再按Tab,輸入口今,回車就可以了。
Layout Align 將選擇的控件按某種方式對齊
Layout Space evenly 平均分配選擇的控件的間隔
Layout Make same size 使選擇的控件大小相同
我們來編一個簡單程序,程序隨機產生一個x,用戶輸入y=x*x,的值,程序檢查對錯,如果錯了,還要改正。
生成一個基於對話框的應用程序,去掉”TODO: 在這裏設置對話控制”,這個靜態控件沒什麼用。加入兩編輯控件(如果控件多的話最好改成一個容易理解的ID),Ctrl+W將兩個控件
與兩個整形變量m_x,m_y(命名要容易理解)相關聯。加一個按鈕,ID改爲IDC_CHECK,雙擊它編輯代碼。
void CCheckDlg::OnCheck()
{
UpdateData();
if(m_y == m_x * m_x)
MessageBox("你對了");
else
{
m_y = m_x * m_x;
UpdateData(false);
MessageBox("根據結果想想");
}
}
找到構造函數(最好在中OnInitDialog()處理),找到m_x = 0;改成
CTime t=CTime::GetCurrentTime();
int n=t.GetSecond();
for(int i=0;i
m_x = rand()%10;
其實rand並不隨機,第一次調用返回值總是相同的,我們可以取當前時間的秒數,來決定調用次數。設置各個控件的Caption,並按上述方法設置焦點,並調整各控件的大小。
控件顯示的值與控件相關聯的數(成員變量)的值不是同步的,我們必須調用UpDateData();當我們輸入了數據,就調用UpdateData(true)來更新成員變量;UpdateData(false)
將成員變量的值顯示在屏幕上。CDialog的UpDateData()更新所有的控件,如果只想更新一個控件,可以調用控件類的UpDateData().
通用對話框,經常用的是CColorDialog,CFontDialog,CFileDialog,類似於
CColorDialog dlg;
if(IDOK==dlg.DoModal())
{
…dlg.GetColor();
}
注意CFileDialog dlg(false),表示是另存爲對話框,爲true表示是打開對話框,第一個參數沒有默認值。
常用函數:
CDialog::CloseWindow();最小化對話框。
CDialog::DestroyWindow();關閉對話框,OnOk,OnCancel也可以關閉對話框。
CDialog::GetClientRect();獲得客戶區範圍;
CDialog::GetFocus(); 獲得焦點;
CDialog::GetFont() 獲得字體;
CDialog::SetWindowText);設置對話框標題;
CDialog::SetMenu(); 設置菜單;
CDialog::SetFocus(); 設置焦點;
CDialog::SetFont(); 設置字體;
有些東西我們無法在構造函數中進行,如SetTimer,我們可以在OnInitDialog()中進行,或者在WM_SHOWWINDOW的響應函數中進行。
ShowWindow(SW_HIDE);它的參數還可以是:
SW_HIDE SW_MINIMIZE SW_RESTORE SW_SHOWMAXIMIZED SW_SHOWMINIMIZED SW_SHOWMINNOACTIVE SW_SHOWNA SW_SHOWNOACTIVATE SW_SHOWNORMAL