MFC——6.對話框

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; //使用默認的畫刷
}

程序最終截圖:

      


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章