MFC控制項(0):對話方塊Dialog

來源:互聯網
上載者:User
文章目錄
  •  各種控制項ID命名規範

MFC為我們提供了一些常用的控制項,我們直接拖過來就可以用.這樣大大簡化了開發流程.要使用那些控制項我們要先建立一個對話方塊(Dialog).然後就可以往對話方塊中拖入各種控制項了.

下面來建立一個簡單的有強制回應對話方塊,在裡面添加一個按鈕(Button)和兩個文字框)Edit Control).

 

 

1.建立一個對話方塊並產生對應的類:

 

 

首先在Resource View中選中Dialog然後右擊滑鼠選擇Insert Dialog.這樣一個對話方塊就產生了.如果是第一個建立的,預設名字為IDD_DIALOG1.我們雙擊開啟它.接下來從Toolbox中拖一個按鍵和兩個文字框進來.

選中Dialog右擊,選擇Add Class.輸入類名,假如為NewDialog.點Finish.一個叫NewDialog的類就產生了.這個類就和對話方塊關聯起來了.如果我們不知道一個類是和哪個對話方塊關聯的話,可以在標頭檔中找這樣的代碼:enum{ IDD = IDD_DIALOG1 };其中IDD_DIALOG1就是對話方塊的ID,是唯一的.當你為對話方塊添加類時這段代碼會自動產生.

我們如果要調用這個對話方塊的話就直接調用這個類就行.比如:NewDialog nDlg ;   nDlg.DoModal(); //這樣一個有強制回應對話方塊就顯示出來了.這種對話方塊彈出來之後就不用對其他頁面做操作了.另外還有所謂的無強制回應對話方塊,開啟後還可以對其他頁面操作.

 

 各種控制項ID命名規範

1.對話方塊的名字方式一般以IDD + 描述資訊,比如IDD_LOGON_PAGE,其中IDD自然是ID Dialog的簡寫,代表類型,後面的就用些有意義的描述詞.

2.其他控制項的ID名字一般是IDC(自然是ID Control簡寫) + 加控制項名稱(不過一般也縮寫) + 描述資訊

Button可命名為IDC+BTN+描述資訊,例如IDC_BTN_CONNECT

Edit box可命名為IDC+EDIT+描述資訊,例如IDC_EDIT_INPUT

Static text可命名為IDC+STATIC+描述資訊,例如IDC_STATIC_INPUT

Check Box 命名:IDC+CHECK+XXXX

Radio Button命名: IDC + RADIO + XXXX

Combo Box 命名: IDC+COMBO + XXXX

List Control 命名:IDC + LIST + XXXX

Tree Control 命名:IDC + TREE + XXX

 

2.直接擷取對話方塊中控制項的值和賦值:

 

   假如對話方塊中按鈕的ID為IDC_BUTTON1,兩個文字框的ID分別為IDC_INPUT1,IDC_INPUT2.(補充:在屬性視窗中查看一個控制項的ID時會發現ID名旁邊是一個下拉式清單方塊,裡面有其他很多控制項的ID.所發查看的時候滑鼠要小心點,別一不小心選了一個其他的ID了.這樣後面哪出錯了都不容易發現哪錯了.我就曾經被折騰了好久啊)

(1)賦值 你開啟對話方塊之前想對文字框初始化一個值的話可以這樣寫代碼:SetDlgItemText(IDC_INPUT1, _T("please input "));(如果你把文字框屬性中的Number選為True的話表示只能輸入數字.如果輸入字元會有出錯提示.這時初賦值可以通過SetDlgItemInt(IDC_INPUT1, 123);)

(2)擷取值 要擷取IDC_INPUT1中的值:CString temp;    GetDlgItemText(IDC_INPUT1,temp);  //文字框中的值就儲存在變數temp中了.

 

對於所有繼承自CWnd的控制項還可以使用函數GetDlgItem(ID_XXX)來擷取控制項的指標,該函數傳回值是CWnd*,所以也可以這樣賦值與取值.

GetDlgItem(IDC_INPUT1)->SetWindowText("please input");//賦值

CString szInfo;

GetDlgItem(IDC_INPUT1)->GetWindowText(szInfo); //取值

 

 

3.使用變數擷取對話方塊中控制項的值和賦值:

 

 

上面的方法有些麻煩,我們還可以有更簡單的方法.把文字框控制項和一個變數對應起來.選中IDC_INPUT1右擊-->選中Add Variable-->在Category中選Value,Variable type中選CString.-->輸入Variable name.假如為csInput1-->點finish.用同樣的方法為IDC_INPUT2添加變數csInput2.

做完上面的操作後對對話方塊對應的類中會自動添加一些代碼進去.在標頭檔中會看到public: CString csInput1; CString csInput2;在cpp檔案中會看到

void CtestDlg::DoDataExchange(CDataExchange* pDX)  //這個參數幹嘛用的還沒太搞懂.

{

CDialog::DoDataExchange(pDX);

DDX_Text(pDX, IDC_INPUT1, csInput1); //這行和下面一行是此時自動添加的.這個函數是在為對話方塊添加類時自動產生的

DDX_Text(pDX, IDC_INPUT2, csInput2);

//DDX_Control(pDX,IDC_INPUT1,m_input); //DDX_Control是把控制項與一個控制項類對象綁定起來.CEdit m_input;

}

DoDataExchange這個函數是幹嘛用的呢?

顧名思義DataExchange就是資料交換.它的作用就是把變數和控制項綁定到一起,變數的值改變後控制項顯示的值也變,修改了控制項上的值變數也跟著變.

(1)開啟對話方塊時讓其中一個文字框顯示please input.

現在我們來初始化下IDC_INPUT1顯示的值 .在初始化的代碼中給csInput1賦值就行.csInput1=_T("please input");

不過這時你開啟對話方塊會失望的看到並沒有初始化成功.這是因為DoDataExchange(CDataExchange* pDX)函數還沒被調用.於是你就想手動去調用下,結果發現參數不知道填啥.

其實這個函數你是不能直接來調用的.我們必須調用UpdateData()這個函數,這個函數會自動再去調用DoDataExchange.最後的代碼應該是這樣的:

csInput1=_T("please input");

UpdateData(FALSE);//如果參數是TRUE就表示把控制項上顯示的值傳到變數csInput1.另外UpdateData()和UpdateData(TRUE)等價.

(2)在IDC_INPUT1中隨便輸入些啥點下按鈕後IDC_INPUT2中顯示IDC_INPUT1中的值.

首先要給按鈕添加個事件處理函數,(封裝了訊息機制後的回呼函數),直接雙擊它或右擊選擇Add Event Hanlder.這樣一個叫CNewDialog::OnBnClickedButton1()的函數就產生了.

在裡面添加代碼:csInput2=csInput1;//一運行發現沒實現要想的效果,還是得繼續用UpdateData()函數才行.

在後面再添加一行代碼:UpdateData(FALSE);//不過此時會發現不管IDC_INPUT1中輸入什麼.點下按鈕後IDC_INPUT1,IDC_INPUT2的值都是開始csInput1初始的值"pleaseinput"

這是為啥呢.因為csInput1並沒有收到IDC_INPUT1中的值.而調用UpdateData(FALSE)後對話方塊頁面會內重新整理下,顯示變數傳過來的值.

所以在給csInput2賦值前需要先把控制項上改過來的值傳給csInput1.最後的代碼應該是這樣的:

UpdateData();//先把文本中的值傳到相應的變數上去

csInput2=csInput1;// 給另一個文字框對應變數賦值

UpdateData(FALSE);//重新整理對話方塊把變數值傳到控制項中

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.