Lesson6:對話框
對話框是MFC程序設計中一個重要的角色,本文主要講解了對話框的使用方法,包括講解了模態對話框和非模態對話框,並通過一個例子講述了對話框中靜態文本框控件的文字改變,對話框大小切換和簡單的加法計算實現。
1. 模態對話框和非模態對話框
C++中對任何對象的操作都是通過類來實現的。操作對話框對象,所以我們先建一個類,命名爲CTestDlg,基類爲CDialogEx,這時就產生了一個新的類。然後在菜單裏新建立一個菜單,命名爲對話框,命令響應放在View類裏完成。然後會自動在view類裏添加一個OnDialog()函數。
這裏對話框的創建有模態和非模態之分,在執行應用程序時,打開了模態對話框,那麼必須關閉模態對話框,程序才能繼續執行;非模態對話框打開時,程序可以繼續執行其他任務。
void CMyboleView::OnDialog()
{
//TODO: 在此添加命令處理程序代碼
/*實現模態對話框*/
CTestDlgdlg;
dlg.DoModal();
/*實現非模態對話框*/ //一般使用模態對話框,非模態對話框太麻煩
//CTestDlg*pDlg = new CTestDlg(); //定義一個指針
//pDlg->Create(IDD_DIALOG1,this); //參數是(對話框ID,父窗口對象的指針)
//pDlg->ShowWindow(SW_SHOW); //顯示窗口
}
2. 對話框中實現加法運算
在工具箱中添加相應控件,其中包括靜態文本框控件,編輯框控件,按鈕控件,圖片控件,實現加法運算,最後的圖示如下。
2.1 點擊靜態文本框,實現中英文切換
在靜態文本控件Number1:上修改控件ID 爲IDC_NUMBER1,添加命令響應函數。
void CTestDlg::OnClickedNumber1() //靜態文本框的操作,實現點擊後文本類容變化
{
//TODO: 在此添加控件通知處理程序代碼
//靜態文本框進行消息響應時,首先修改ID號,然後將notify修改爲true。否則接收不到點擊消息
CStringstr;
if(GetDlgItem(IDC_NUMBER1)->GetWindowText(str), str =="Number1:") //獲得文本框中的類容然後與字符串"Number1:"比較
{
GetDlgItem(IDC_NUMBER1)->SetWindowText("數值1:"); //重新設置文本框類容
}
else
{
GetDlgItem(IDC_NUMBER1)->SetWindowText("Number1:");//重新設置文本框類容
}
}
2.2 點擊按鈕“收縮<<”,實現對話框大小切換
修改控件ID,爲IDC_BUTTON1,添加命令響應函數。添加一個picture 控件,拉成一條線,作爲分割符,修改ID爲IDC_SEPARATOR,類型裏sunken選項選中,用於分割對話框。
void CTestDlg::OnClickedButton1()
{
//TODO: 在此添加控件通知處理程序代碼
CStringstr;
if(GetDlgItemText(IDC_BUTTON1,str), str == "收縮<<") //獲得文本框中的類容然後與字符串"Number1:"比較
{
SetDlgItemText(IDC_BUTTON1,"擴展>>"); //重新設置文本框類容
}
else
{
SetDlgItemText(IDC_BUTTON1,"收縮<<"); //重新設置文本框類容
}
/**************************點擊按鈕後,進行點擊響應對話框大小轉換操作**************************************/
staticCRect rectLarge, rectSmall; //定義兩個矩形變量存放對話框尺寸大小,因爲對話框兩個尺寸不變,所以定義爲靜態的
if(rectLarge.IsRectNull()) //用CRect成員函數IsRectNull()判斷矩形是否爲空,因爲上面定義爲static,所以自動初始化都爲零,所以這裏爲空,條件成立
//如果大矩形的尺寸爲空,四個值都爲0,此時條件成立
{
CRectrectSeparator; //定義一個分割線
GetWindowRect(&rectLarge); //得到大矩形窗口的尺寸,直接GetWindowRect將窗口尺寸給rectlarge所指向的指針
GetDlgItem(IDC_SEPARATOR)->GetWindowRect(&rectSeparator); //先得到控件的指針,然後GetWindowRect得到控件尺寸。得到分割線的尺寸(分割線用圖片形式,看做一個對話框,所以也是一個矩形)
//得到收縮矩形的尺寸
rectSmall.left= rectLarge.left;
rectSmall.top= rectLarge.top;
rectSmall.right= rectLarge.right;
rectSmall.bottom= rectSeparator.bottom;
}
if(str == "收縮<<")
{
SetWindowPos(NULL,0, 0, rectSmall.Width(), rectSmall.Height(), SWP_NOMOVE | SWP_NOZORDER);
}
else
{
SetWindowPos(NULL,0, 0, rectLarge.Width(), rectLarge.Height(), SWP_NOMOVE | SWP_NOZORDER);
}
}
2.3 點擊按鈕“Add”,實現加法運算
點擊按鈕後,將編輯框1和編輯框2的值加起來放在編輯框3裏。
void CTestDlg::OnClickedBtnAdd()
{
//TODO: 在此添加控件通知處理程序代碼
/*****方法一:使用GetDlgItem 和GetWindowText 和 SetWindowText函數進行文本框類容獲得操作*******/
//因爲獲得文本框的時候,是獲得的字符串,所以先得到字符串,然後轉換爲數值,再進行加法計算,最後將數值又轉換爲字符串形式在文本框中輸出
/*****************************************************************************************************
intnum1, num2, num3;
charch1[10], ch2[10], ch3[10];
GetDlgItem(IDC_EDIT1)->GetWindowText(ch1,10);
GetDlgItem(IDC_EDIT2)->GetWindowText(ch2,10);
num1= atoi(ch1); //將字符型數據轉換爲整型數據
num2= atoi(ch2);
num3= num1+num2;
_itoa_s(num3,ch3, 10); //將整型數據轉換爲字符型數據,最後的10,表示用十進制數表示
GetDlgItem(IDC_EDIT3)->SetWindowText(ch3); //將ch3的值放到編輯框3中
***************************************************************************************************/
/********************方法二:使用GetDlgItemText函數進行文本框類容獲得操作**********************/
//它相當於同時有GetDlgItem和 GetWindowText 和 SetWindowText函數的功能
/*************************************************************************************************
intnum1, num2, num3;
charch1[10], ch2[10], ch3[10];
GetDlgItemText(IDC_EDIT1,ch1, 10);
GetDlgItemText(IDC_EDIT2,ch2, 10);
num1= atoi(ch1); //將字符型數據轉換爲整型數據
num2= atoi(ch2);
num3= num1 + num2;
_itoa_s(num3,ch3, 10); //將整型數據轉換爲字符型數據,最後的10,表示用十進制數表示
SetDlgItemText(IDC_EDIT3,ch3); //將ch3的值放到編輯框3中
**************************************************************************************************/
/******方法三:使用GetDlgItemInt函數進行文本框類容獲得操作*******/
//它相當於同時有GetDlgItem和 GetWindowText 和 SetWindowText函數的功能
/********************************************************************************************************
intnum1, num2, num3;
num1=GetDlgItemInt(IDC_EDIT1);
num2=GetDlgItemInt(IDC_EDIT2);
num3= num1 + num2;
SetDlgItemInt(IDC_EDIT3,num3,true);
***************************************************************************************************/
/****方法四:使用控件和變量關聯進行加法操作****/
//將IDC_EDIT1,2,3分別和m_num1,2,3關聯,然後直接計算。 設置爲整型變量關聯
//在關聯後在構造函數中,默認值設爲0,爲了獲得輸入的值,調用UpdateData()函數
//因爲我們在空間關聯的時候,關聯的是一個整型的變量,所以要求輸入的是一個整數
UpdateData(); //獲得值之前調用函數UpdateData()默認爲true,然後接受輸入的值
m_num3= m_num1+ m_num2 ;
UpdateData(FALSE); //獲得值之後調用函數UpdateData()參數設爲false,用現在的值進行編輯框的值進行初始化
}
3. 改變對話框上控件的顏色
對於控件顏色的改變,有一個消息響應,添加這個消息OnCtlColor(),並添加一個CBrush變量m_brush,我們可以在構造函數中進行初始化爲綠色:m_brush.CreateSolidBrush(RGB(0, 255, 0))。添加一個CFont變量m_font,用於後面修改字體,初始化m_font.CreatePointFont(200,"華文行楷")。
HBRUSH CTestDlg::OnCtlColor(CDC* pDC, CWnd*pWnd, UINT nCtlColor)
{
HBRUSHhbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);
//TODO: 在此更改 DC 的任何特性
if(pWnd->GetDlgCtrlID() == IDC_CALCULATION) //選擇框
{
pDC->SetTextColor(RGB(255,0, 0)); //改變文本顏色
pDC->SetBkMode(TRANSPARENT); //文字背景色爲透明
returnm_brush; //控件背景
}
if(pWnd->GetDlgCtrlID() == IDC_EDIT1) //編輯框
{
pDC->SetTextColor(RGB(255,0, 0)); //改變文本顏色
//pDC->SetBkMode(TRANSPARENT); //文字背景色爲透明 兩種方式
pDC->SetBkColor(RGB(0,255, 0)); //文字背景色和默認的m_brush顏色一樣
returnm_brush; //控件背景
}
if(pWnd->GetDlgCtrlID() == IDC_TEXT) //編輯框
{
pDC->SelectObject(&m_font); //改變文本顏色
}
//對於按鈕的顏色修改,我們需要先建立一個類,通過這個類作用這個控件,CButton繼承的CTestBtn
//在CTestBtn類中添加虛函數,並複製MSDN的代碼,然後將其與IDOK按鈕關聯一個變量
if(pWnd->GetDlgCtrlID() == IDOK) //ok按鈕,將ok按鈕的owner draw選爲true,還有複製一段MSDN的代碼
{
returnm_brush; //改變文本顏色
}
if(pWnd->GetDlgCtrlID() == IDOK)
{
pDC->SelectObject(&m_font); //改變背景顏色
}
//TODO: 如果默認的不是所需畫筆,則返回另一個畫筆
returnhbr; //使用默認的畫刷
}
程序最終截圖: