MFC的模態對話方塊建立與傳值
阿新 • • 發佈:2021-01-17
技術標籤: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); //呼叫模態視窗的成員變數,修改主視窗的靜態文字框
}
}