轉(zhuǎn)帖|行業(yè)資訊|編輯:鮑佳佳|2021-01-13 11:06:59.693|閱讀 1443 次
概述:加法計(jì)算器對(duì)話框程序大家照著做一遍后,相信對(duì)基于對(duì)話框的程序有些了解了,有個(gè)好的開始對(duì)于以后的學(xué)習(xí)大有裨益。趁熱打鐵,這一節(jié)講講什么是模態(tài)對(duì)話框和非模態(tài)對(duì)話框,以及模態(tài)對(duì)話框怎樣彈出。
# 界面/圖表報(bào)表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關(guān)鏈接:
加法計(jì)算器對(duì)話框程序大家照著做一遍后,相信對(duì)基于對(duì)話框的程序有些了解了,有個(gè)好的開始對(duì)于以后的學(xué)習(xí)大有裨益。趁熱打鐵,這一節(jié)講講什么是模態(tài)對(duì)話框和非模態(tài)對(duì)話框,以及模態(tài)對(duì)話框怎樣彈出。當(dāng)功能實(shí)現(xiàn)了想要擁有美觀的界面可以借助Toolkit Pro進(jìn)行界面優(yōu)化。
Xtreme Toolkit Pro:是屢獲殊榮的VC界面庫(kù),是MFC開發(fā)中最全面界面控件套包,它提供了Windows開發(fā)所需要的11種主流的Visual C++ MFC控件,包括Command Bars、Controls、Chart Pro、Calendar、Docking Pane、Property Grid、Report Control、Shortcut Bar、Syntax Edit、Skin Framework 和Task Panel。
點(diǎn)擊下載Xtreme Toolkit Pro最新試用版
一.模態(tài)對(duì)話框和非模態(tài)對(duì)話框
Windows對(duì)話框分為兩類:模態(tài)對(duì)話框和非模態(tài)對(duì)話框。
模態(tài)對(duì)話框是這樣的對(duì)話框,當(dāng)它彈出后,本應(yīng)用程序其他窗口將不再接受用戶輸入,只有該對(duì)話框響應(yīng)用戶輸入,在對(duì)它進(jìn)行相應(yīng)操作退出后,其他窗口才能繼續(xù)與用戶交互。
非模態(tài)對(duì)話框則是,它彈出后,本程序其他窗口仍能響應(yīng)用戶輸入。非模態(tài)對(duì)話框一般用來(lái)顯示提示信息等。
大家對(duì)Windows系統(tǒng)很了解,相信這兩種對(duì)話框應(yīng)該都遇到過。之前的加法計(jì)算器對(duì)話框其實(shí)就是模態(tài)對(duì)話框。
二.模態(tài)對(duì)話框是怎樣彈出的
畢竟加法計(jì)算器程序大部分都是MFC自動(dòng)生成的,對(duì)話框怎么彈出來(lái)的大家可能還不是很清楚。下面簡(jiǎn)單說(shuō)說(shuō)它是在哪里彈出來(lái)的,再重新建一個(gè)新的對(duì)話框并彈出它,這樣大家實(shí)踐以后就能更靈活的使用模態(tài)對(duì)話框了。
大家打開Addition.cpp文件,可以看到CAdditionApp類有個(gè)InitInstance()函數(shù),在MFC應(yīng)用程序框架分析中提到過此函數(shù),不過那是單文檔應(yīng)用程序App類中的,函數(shù)體不太相同,但都是進(jìn)行App類實(shí)例的初始化工作。
InitInstance()函數(shù)的后半部分有一段代碼就是定義對(duì)話框?qū)ο蟛棾鰧?duì)話框的,下面給出這段代碼并加以注釋:
C++代碼
CAdditionDlg dlg; // 定義對(duì)話框類CAdditionDlg的對(duì)象dlg m_pMainWnd = &dlg; // 將dlg設(shè)為主窗口 INT_PTR nResponse = dlg.DoModal(); // 彈出對(duì)話框dlg,并將DoModal函數(shù)的返回值(退出時(shí)點(diǎn)擊按鈕的ID)賦值給nResponse if (nResponse == IDOK) // 判斷返回值是否為OK按鈕(其ID為IDOK,雞啄米已經(jīng)將它刪除) { // TODO: Place code here to handle when the dialog is // dismissed with OK } else if (nResponse == IDCANCEL) // 判斷返回值是否為Cancel按鈕(其ID為IDCANCEL,雞啄米將它的Caption改為了“退出”) { // TODO: Place code here to handle when the dialog is // dismissed with Cancel }
彈出對(duì)話框比較關(guān)鍵的一個(gè)函數(shù),就是對(duì)話框類的DoModal()函數(shù)。CDialog::DoModal()函數(shù)的原型為:
virtual INT_PTR DoModal();
返回值:整數(shù)值,指定了傳遞給CDialog::EndDialog(該函數(shù)用于關(guān)閉對(duì)話框)的nResult參數(shù)值。如果函數(shù)不能創(chuàng)建對(duì)話框,則返回-1;如果出現(xiàn)其它錯(cuò)誤,則返回IDABORT。
調(diào)用了它對(duì)話框就會(huì)彈出,返回值是退出對(duì)話框時(shí)所點(diǎn)的按鈕的ID,比如,我們點(diǎn)了“退出”按鈕,那么DoModal返回值為IDCANCEL。
三.添加一個(gè)新對(duì)話框并彈出它
雞啄米再為加法計(jì)算器程序添加一個(gè)對(duì)話框,以在計(jì)算之前詢問用戶是否確定要進(jìn)行計(jì)算。大家可以完整的看下對(duì)話框的添加和彈出過程。
1.根據(jù)“創(chuàng)建對(duì)話框模板和修改對(duì)話框?qū)傩?/a>”中所講的方法,在Resource View中的“Dialog”上點(diǎn)右鍵選擇“Insert Dialog”,創(chuàng)建一個(gè)新的對(duì)話框模板,修改其ID為IDD_TIP_DIALOG,Caption改為“提示”,然后參考“為對(duì)話框添加控件”中所講,在對(duì)話框模板上添加一個(gè)靜態(tài)文本框(static text),Caption改為“您確定要進(jìn)行加法計(jì)算嗎?”,接下來(lái)修改OK按鈕的Caption為“確定”,Cancel按鈕的Caption為“取消”,最后調(diào)整各個(gè)控件的位置和對(duì)話框的大小。最終的對(duì)話框模板如下圖:
2.根據(jù)“創(chuàng)建對(duì)話框類和添加控件變量”中創(chuàng)建對(duì)話框類的方法,在對(duì)話框模板上點(diǎn)右鍵選擇“Add Class...”,彈出添加類的對(duì)話框,設(shè)置“Class name”為CTipDlg,點(diǎn)“OK”。在Solution Explorer中可以看到生成了CTipDlg類的頭文件TipDlg.h和源文件TipDlg.cpp。
3.我們要在點(diǎn)“計(jì)算”按鈕之后彈出此提示對(duì)話框,那么就要在“計(jì)算”按鈕的消息處理函數(shù)OnBnClickedAddButton()中訪問提示對(duì)話框類,所以為了訪問CTipDlg類,在AdditionDlg.cpp中包含CTipDlg的頭文件:#include "TipDlg.h"。
4.修改OnBnClickedAddButton()的函數(shù)體,在所有代碼前,構(gòu)造CTipDlg類的對(duì)象tipDlg,并通過語(yǔ)句tipDlg.DoModal();彈出對(duì)話框,最后判斷DoModal()函數(shù)的返回值是IDOK還是IDCANCEL來(lái)確定是否繼續(xù)進(jìn)行計(jì)算。OnBnClickedAddButton()函數(shù)修改后如下:
C++代碼
void CAdditionDlg::OnBnClickedAddButton() { // TODO: Add your control notification handler code here INT_PTR nRes; // 用于保存DoModal函數(shù)的返回值 CTipDlg tipDlg; // 構(gòu)造對(duì)話框類CTipDlg的實(shí)例 nRes = tipDlg.DoModal(); // 彈出對(duì)話框 if (IDCANCEL == nRes) // 判斷對(duì)話框退出后返回值是否為IDCANCEL,如果是則return,否則繼續(xù)向下執(zhí)行 return; // 將各控件中的數(shù)據(jù)保存到相應(yīng)的變量 UpdateData(TRUE); // 將被加數(shù)和加數(shù)的加和賦值給m_editSum m_editSum = m_editSummand + m_editAddend; // 根據(jù)各變量的值更新相應(yīng)的控件。和的編輯框會(huì)顯示m_editSum的值 UpdateData(FALSE); }
5.測(cè)試。編譯運(yùn)行程序后,在對(duì)話框上輸入被加數(shù)和加數(shù),點(diǎn)“計(jì)算”,彈出提示對(duì)話框詢問是否進(jìn)行計(jì)算,如果選擇“確定”,則提示對(duì)話框退出,并在主對(duì)話框上顯示被加數(shù)和加數(shù)的和,而如果選擇“取消”,則提示對(duì)話框也會(huì)退出,但主對(duì)話框顯示的和不變,即沒有進(jìn)行加法計(jì)算。
到此,大家對(duì)于模態(tài)對(duì)話框的基本使用方法應(yīng)該掌握了吧。希望大家繼續(xù)關(guān)注雞啄米的MFC教程,我們共同進(jìn)步。
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請(qǐng)務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請(qǐng)郵件反饋至chenjj@fc6vip.cn