六. 對話框編程--Windows編程課程學(xué)習(xí)筆記

原文地址: https://blog.csdn.net/ling_xiao007/article/details/51721363

6.1 對話框基本知識

對話框是一個窗口沉馆,與對話框資源相關(guān)的類為CDialog斥黑,由CWnd類派生而來锌奴。可以將對話框看成是一個大容器憾股,在它上面能夠放置各種標(biāo)準(zhǔn)和擴(kuò)展控件鹿蜀,是用戶與程序進(jìn)行交互的重要手段。在MFC中荔燎,所有的控件都是由CWnd派生而來耻姥,因此,控件實際上也是窗口有咨。

6.1.1常用控件

1.png

6.1.2對話框的種類

1)模式對話框:當(dāng)其顯示時,程序會暫停執(zhí)行蒸健,直到關(guān)閉這個對話框后座享,才能繼續(xù)執(zhí)行程序中其他任務(wù)婉商。例如“文件/打開” 對話框。

2)無模式對話框:當(dāng)其顯示時,允許轉(zhuǎn)而執(zhí)行程序中其他任務(wù),而不用關(guān)閉這個對話框。該類型對話框不會壟斷用戶的操作,用戶仍可以與其他界面對象進(jìn)行交互肥印。例如“查找”對話框敷硅。

6.2對話框的創(chuàng)建和顯示

在MFC中對資源的操作通常都是通過一個與資源相關(guān)的類來完成诫硕。可以在新建的對話框資源上雙擊完成添加。看到對話框id已經(jīng)默認(rèn)填寫八秃。這是在ClassViea選項卡就可以看到這個新類上忍。


1.png

構(gòu)造函數(shù)如下秕豫,首先調(diào)用基類的構(gòu)造函數(shù)歌径,并傳遞兩個參數(shù)克锣,IDD成員以及父窗口指針验残。在頭文件可以看打這個對話框資源的ID胆绊。

CTestDlg::CTestDlg(CWnd* pParent /*=NULL*/)
    : CDialogEx(IDD_DIALOG1, pParent)
{
 
}
 
// 對話框數(shù)據(jù)
#ifdef AFX_DESIGN_TIME
    enum { IDD = IDD_DIALOG1 };
#endif

另一個函數(shù)是DoDataExchange肢础,完成對話框數(shù)據(jù)的交換和校驗慨蛙。

現(xiàn)在有了一個類和IDD_DIALOG1資源相關(guān)聯(lián)通砍。接卸來希望顯示虎忌,為此增加一個菜單項挑围,用戶點擊顯示對話框。在【幫助】下添加【對話框】寓搬,去掉Pop-up,ID設(shè)置為ID_DIALOG。

6.2.1模態(tài)對話框

創(chuàng)建模式對話框需要調(diào)用CDialog類的成員函數(shù):DoModal,該函數(shù)的功能就是創(chuàng)建并顯示一個模式對話框。為此視類添加ID_DIALOG響應(yīng)函數(shù)如下猪钮。

void CMyMFCAppView::OnDialog()
{
    //TODO: 在此添加命令處理程序代碼
    CTestDlg dlg;
    dlg.DoModal();
}

6.2.2非模態(tài)對話框

創(chuàng)建無模式對話框需要調(diào)用CDialog類的成員函數(shù):BOOL Create(UINT nIDTemplate, CWnd* pParentWnd = NULL);第一個參數(shù)可以是資源ID魄懂,也可以是名稱篡腌,第二個指定父窗口。當(dāng)利用Create函數(shù)創(chuàng)建無模式對話框時睛约,還需要調(diào)用ShowWindow函數(shù)將這個對話框顯示出來。且不能設(shè)為局部變量加Detach方式材蹬。有兩種方式辉川,其一是將其定義為視類的成員變量,其二是將其定義為指針塞颁,分配在堆上澡腾,需要在視類析構(gòu)函數(shù)delete釋放,或者重構(gòu)CTestDlg類虛函數(shù)PostNcDestory渺绒。

void CMyMFCAppView::OnDialog()
{
    //TODO: 在此添加命令處理程序代碼
   
    CTestDlg *dPlg = new CTestDlg;
    dPlg->Create(IDD_DIALOG1, this);
    dPlg->ShowWindow(SW_SHOW);
}
 
void CTestDlg::PostNcDestroy()
{
    //TODO: 在此添加專用代碼和/或調(diào)用基類
    delete this;
    CDialogEx::PostNcDestroy();
}

若要在程序中主動銷毀無模式對話框(例如在沒有 “確定”和“取消”按鈕的情況下銷毀對話框)氮采,需調(diào)用函數(shù)DestroyWindow。

6.3動態(tài)創(chuàng)建按鈕

實現(xiàn)一個功能伯铣,單擊對話框中某個按鈕腔寡,在對話框動態(tài)創(chuàng)建一個新按鈕。

1)為IDD_DIALOG1創(chuàng)建一個對話框資源却舀,ID屬性設(shè)置為IDC_BTN_ADD,Caption為Add袭艺。

2)添加自定義私有變量CButton類的m_btn绸吸。

3)CTestDlg類為IDC_BTN_ADD響應(yīng)BN_CLICKED消息。WS_VISIBLE沒有則需要ShowWindow函數(shù)设江。

 m_btn.Create("New", BS_DEFPUSHBUTTON | WS_VISIBLE | WS_CHILD,
 CRect(0,0, 100, 100), this, 123);

4)位CTestDlg類添加私有成員變量或者靜態(tài)局部變量BOOL類m_bIsCreated锦茁,用來標(biāo)識是否已經(jīng)創(chuàng)建。亦可以用一個成員變量m_hWnd

void CTestDlg::OnClickedBtnAdd()
{
    //TODO: 在此添加控件通知處理程序代碼
    if (FALSE == m_bIsCreated)
    {
        m_btn.Create("New", BS_DEFPUSHBUTTON | WS_VISIBLE | WS_CHILD, CRect(0,0, 100, 100), this, 123);
        m_bIsCreated = TRUE;
    }
    else
    {
        m_btn.DestroyWindow();
        m_bIsCreated = FALSE;
    }
}
 
void CTestDlg::OnClickedBtnAdd()
{
    //TODO: 在此添加控件通知處理程序代碼
    if (!m_btn.m_hWnd)
        m_btn.Create("New", BS_DEFPUSHBUTTON | WS_VISIBLE | WS_CHILD, 
            CRect(0,0, 100, 100), this, 123);
    else
        m_btn.DestroyWindow();
}

6.4控件的訪問

6.4.1靜態(tài)文本控件

實現(xiàn)點擊”Number1:”叉存,文本變成“數(shù)值1:”码俩。

1)首先設(shè)置ID號為IDC_NUMBER1以區(qū)分三個靜態(tài)文本。

2)響應(yīng)IDC_NUMBER1的BN_CLICKED消息歼捏。

3)控件也是窗口稿存,所以可以利用CWnd的成員函數(shù)GetWindowText。

4)靜態(tài)文本在默認(rèn)狀態(tài)下不可以發(fā)送通告消息瞳秽,在屬性對話框選定Notify選項瓣履。

void CTestDlg::OnStnClickedNumber1()
{
    //TODO: 在此添加控件通知處理程序代碼
    CString str;
    if (GetDlgItem(IDC_NUMBER1)->GetWindowText(str), str == "Number1:")
        GetDlgItem(IDC_NUMBER1)->SetWindowText("數(shù)值1:");
    else
        GetDlgItem(IDC_NUMBER1)->SetWindowText("Number1:");
}

6.4.2 編輯框控件

1)GetDlgItem + Get/SetWindowText.重要函數(shù):CWnd* GetDlgItem(int nID) const;該函數(shù)返回一個指向由參數(shù)nID指定的控件對象的指針。

    int num1, num2, num3;
    char c1[10], c2[10], c3[10];
    GetDlgItem(IDC_EDIT1)->GetWindowText(c1,10);
    GetDlgItem(IDC_EDIT2)->GetWindowText(c2,10);  
    num1 = atoi(c1);
    num2 = atoi(c2);
    num3 = num1 + num2;
    itoa(num3, c3, 10);
    GetDlgItem(IDC_EDIT3)->SetWindowText(c3);

2) Get/SetDlgItemText练俐。該函數(shù)返回對話框中指定nID的控件上的文本袖迎。也就是說:GetDlgItemText函數(shù)把方法1中介紹的GetDlgItem和GetWindowText這兩個函數(shù)的功能組合起來了。

   int num1, num2, num3;
    char c1[10], c2[10], c3[10];
    GetDlgItemText(IDC_EDIT1, c1, 10);
    GetDlgItemText(IDC_EDIT2, c2, 10);
 
    num1 = atoi(c1);
    num2 = atoi(c2);
    num3 = num1 + num2;
    itoa(num3, c3, 10);
    SetDlgItemText(IDC_EDIT3, c3);

3)Get/SetDlgItemInt腺晾。該函數(shù)首先獲得對話框中指定nID的控件上的文本燕锥,然后將其轉(zhuǎn)換為一個整型數(shù)值返回。

   int num1, num2, num3;
 
    num1 = GetDlgItemInt(IDC_EDIT1);
    num2 = GetDlgItemInt(IDC_EDIT2);
    num3 = num1 + num2;
 
    SetDlgItemInt(IDC_EDIT3,num3);

4)MFC的DDX數(shù)據(jù)交換——控件和整型變量關(guān)聯(lián)悯蝉。最簡單的訪問控件的方式:通過類向?qū)Ч樾危趯υ捒蚝瘮?shù)DoDataExchange內(nèi)部實現(xiàn)對話框控件與對話框類的成員變量相關(guān)聯(lián)。類別為Value鼻由。為了讓數(shù)據(jù)交換生效暇榴,需調(diào)用UpdateData函數(shù)。(DDX對話框數(shù)據(jù)交換嗡靡,DDV對話框數(shù)據(jù)校驗)

    UpdateData();    //成員變量從對話框控件中獲取數(shù)據(jù)
    m_num3 = m_num1 + m_num2;
    UpdateData(FALSE);    //以成員變量的值初始化對話框控件

5)MFC的DDX數(shù)據(jù)交換——控件和控件變量關(guān)聯(lián)跺撼。類別為Control。CEdit派生于CWnd類讨彼,所以可以調(diào)用GetWindowText等函數(shù)歉井。

    int num1, num2, num3;
    char c1[10], c2[10], c3[10];
    m_edit1.GetWindowText(c1,10);
    m_edit2.GetWindowText(c2,10);
    num1 = atoi(c1);
    num2 = atoi(c2);
    num3 = num1 + num2;
    itoa(num3, c3, 10);
    m_edit3.SetWindowText(c3);

6)發(fā)送消息——SendMessage。Windows程序是基于消息的系統(tǒng)哈误,因此哩至,只要獲取設(shè)置窗口文本的消息躏嚎,就可以通過SendMessage來發(fā)送這條消息,從而獲取/設(shè)置窗口的文本菩貌。

    int num1, num2, num3;
    char c1[10], c2[10], c3[10];
    ::SendMessage(GetDlgItem(IDC_EDIT1)->m_hWnd, WM_GETTEXT, 10, (LPARAM)c1);
    ::SendMessage(m_edit2.m_hWnd, WM_GETTEXT,10, (LPARAM)c2);
    num1 = atoi(c1);
    num2 = atoi(c2);
    num3 = num1 + num2;
    itoa(num3, c3, 10);
    m_edit3.SendMessage(WM_SETTEXT, 0,(LPARAM)c3);

7)發(fā)送消息——SendDlgItemMessage卢佣。直接給對話框的子控件發(fā)送消息:

LRESULTSendDlgItemMessage(int nID, UINT message, WPARA wParam = 0, LPARAM lParam = 0)

該函數(shù)功能相當(dāng)于把上面GetDlgItem和SendMessage這兩個函數(shù)的組合。

   int num1, num2, num3;
    char c1[10], c2[10], c3[10];
 
    SendDlgItemMessage(IDC_EDIT1, WM_GETTEXT, 10, (LPARAM)c1);
    SendDlgItemMessage(IDC_EDIT2, WM_GETTEXT, 10, (LPARAM)c2);
 
    num1 = atoi(c1);
    num2 = atoi(c2);
    num3 = num1 + num2;
    itoa(num3, c3, 10);
 
    SendDlgItemMessage(IDC_EDIT3, WM_SETTEXT, 0, (LPARAM)c3);
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末箭阶,一起剝皮案震驚了整個濱河市虚茶,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌仇参,老刑警劉巖嘹叫,帶你破解...
    沈念sama閱讀 222,464評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異诈乒,居然都是意外死亡罩扇,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,033評論 3 399
  • 文/潘曉璐 我一進(jìn)店門怕磨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來喂饥,“玉大人,你說我怎么就攤上這事肠鲫≡卑铮” “怎么了?”我有些...
    開封第一講書人閱讀 169,078評論 0 362
  • 文/不壞的土叔 我叫張陵导饲,是天一觀的道長集侯。 經(jīng)常有香客問我,道長帜消,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,979評論 1 299
  • 正文 為了忘掉前任浓体,我火速辦了婚禮泡挺,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘命浴。我一直安慰自己娄猫,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 69,001評論 6 398
  • 文/花漫 我一把揭開白布生闲。 她就那樣靜靜地躺著媳溺,像睡著了一般。 火紅的嫁衣襯著肌膚如雪碍讯。 梳的紋絲不亂的頭發(fā)上悬蔽,一...
    開封第一講書人閱讀 52,584評論 1 312
  • 那天,我揣著相機(jī)與錄音捉兴,去河邊找鬼蝎困。 笑死录语,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的禾乘。 我是一名探鬼主播澎埠,決...
    沈念sama閱讀 41,085評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼始藕!你這毒婦竟也來了蒲稳?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,023評論 0 277
  • 序言:老撾萬榮一對情侶失蹤伍派,失蹤者是張志新(化名)和其女友劉穎江耀,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體拙已,經(jīng)...
    沈念sama閱讀 46,555評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡决记,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,626評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了倍踪。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片系宫。...
    茶點故事閱讀 40,769評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖建车,靈堂內(nèi)的尸體忽然破棺而出扩借,到底是詐尸還是另有隱情,我是刑警寧澤缤至,帶...
    沈念sama閱讀 36,439評論 5 351
  • 正文 年R本政府宣布潮罪,位于F島的核電站,受9級特大地震影響领斥,放射性物質(zhì)發(fā)生泄漏嫉到。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,115評論 3 335
  • 文/蒙蒙 一月洛、第九天 我趴在偏房一處隱蔽的房頂上張望何恶。 院中可真熱鬧,春花似錦嚼黔、人聲如沸细层。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,601評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽疫赎。三九已至,卻和暖如春碎节,著一層夾襖步出監(jiān)牢的瞬間捧搞,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,702評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留实牡,地道東北人陌僵。 一個月前我還...
    沈念sama閱讀 49,191評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像创坞,于是被迫代替她去往敵國和親碗短。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,781評論 2 361

推薦閱讀更多精彩內(nèi)容