文章目錄
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);//重新整理對話方塊把變數值傳到控制項中