1. 程式人生 > 其它 >MFC的模態對話方塊建立與傳值

MFC的模態對話方塊建立與傳值

技術標籤:MFC進階之路

文章建立在會建立MFC應用專案的情況下,如果MFC專案都不會建立,請先去學會如何建立。

編譯器:VS2019

建立一個對話方塊

路徑:
左下角“資源檢視”->逐級點開左上方資料夾->右鍵”Dialog“目錄->新增資源->Dialog->新建

繪製對話方塊

對話方塊功能

選中對話方塊->右鍵->新增類->命名一個名字

給所有按鈕新增事件監聽函式,函式一定是在新建cpp檔案中,如果跑到了其他cpp檔案,那就不對了。

在所有按鈕監聽事件函式中新增:

Display('0'); 

兩個特殊的按鈕監聽事件函式不用新增上面的程式碼:

void
NumberPad::OnBnClickedOk() //NumberPad是我設定的視窗類名,不要求相同 { // TODO: 在此新增控制元件通知處理程式程式碼 if (n_str == '-') //防止只輸入一個負號 { n_str = ""; } CDialogEx::OnOK(); } void NumberPad::OnBnClickedCancel() { // TODO: 在此新增控制元件通知處理程式程式碼 n_str = ""; //不傳遞值給主視窗 CDialogEx::OnCancel(); }

在#include "NumberPad.h"中的public新增:

CString n_str;	//主要就是靠這個引數進行傳值

afx_msg void Display(char str);   //新增顯示函式,而且函式可以用NumberPad名稱空間的值

編寫顯示函式:

void NumberPad::Display(char str) 
{
	if(str != '0' && n_str == '0')  //如果編輯框是0,而輸入的數字不是0,則替換掉0
	{
		n_str = str;
	}
	else if (n_str != '0')  //編輯框內的內容不是0,則不斷增加字串的內容
	{
		switch (str)  //是哪種型別的按鈕按下
		{
case '+': if (n_str[0] == '-') //如果帶符號,則把負號消掉 { n_str = n_str.Mid(1); //消掉String的第一個字元 } break; case '-': if (n_str[0] != '-') //如果沒有負號,則增加一個負號 { n_str.Insert(0, '-'); //在String的最前面插入負號 } break; case '<': if (n_str != "") //如果String有字元,則刪除掉最後一個字元 { n_str = n_str.Left(n_str.GetLength()-1); /* CStringLeft(intnCount)const; //從最左邊開始獲取前 nCount個字元 CStringMid(intnFirst)const; //從左邊第 nCount個字元開始,獲取後面所有的字元 CStringMid(intnFirst,intnCount)const; //從左邊的第 nFirst 個字元開始,獲取後面nCount個字元 CStringRight(intnCount)const; //從最右邊開始獲取,從右向左前的nCount個字元 */ } break; default: if (n_str.GetLength() < 10) { //最多輸入10個數字 n_str += str; } break; } } SetDlgItemText(IDC_EDIT_N, n_str); //顯示到編輯框中 //IDC_EDIT_N是編輯框的ID }

主視窗建立模態對話方塊

在這裡插入圖片描述
在屬性中修改靜態文字框的ID和通知

  • ID不要為IDC_STATIC即可,可以在後面加個1
  • 通知改為true

不修改這兩個,要麼建立不了監聽事件,要麼建立了也不響應!

回到主視窗的cpp檔案中

在主視窗的cpp檔案中匯入上面視窗的h檔案。

給靜態文字建立一個監聽事件,在監聽事件函式中新增:

void CDeliveryDlg::OnStnDblclickStaticD()
{
	// TODO: 在此新增控制元件通知處理程式程式碼
	NumberPad dlg;  //建立視窗物件
	dlg.DoModal();  //建立模態視窗

	if (dlg.n_str != "")  //如果有引數,則改變靜態文字框
	{
		SetDlgItemText(IDC_STATIC_D, dlg.n_str);  //呼叫模態視窗的成員變數,修改主視窗的靜態文字框
	}
}