由MessageBox和AfxMessageBox的使用异同所感
我記得剛開(kāi)始學(xué)圖形界面編程的時(shí)候,接觸的最早的一個(gè)函數(shù)應(yīng)該就是MessageBox,之前都一直是控制臺(tái)程序,突然能運(yùn)行蹦出一個(gè)對(duì)話框感覺(jué)還是很新鮮的。當(dāng)時(shí)還利用MessageBox寫(xiě)一些惡搞程序,利用上面的yes or no 按鈕進(jìn)行判斷等等。但是說(shuō)實(shí)話感覺(jué)用處不是特別大,調(diào)試的時(shí)候可能會(huì)用到,所以也就沒(méi)有深入的研究和學(xué)習(xí)這個(gè)函數(shù)。后來(lái)轉(zhuǎn)到MFC了,不知怎的吧,就用起了AfxMessageBox,也是沒(méi)覺(jué)得什么,所以也就沒(méi)多想什么,直到今天,項(xiàng)目中碰到了個(gè)問(wèn)題,才導(dǎo)致我不得不研究一下MessageBox和AfxMessageBox兩者的異同點(diǎn)。
那么我遇到的問(wèn)題是什么呢?我在主對(duì)話框中有一個(gè)按鈕,點(diǎn)擊之后能彈出一個(gè)非模態(tài)的對(duì)話框,那么可能在子對(duì)話框中就有一些相應(yīng)的操作要進(jìn)行,剛開(kāi)始并沒(méi)有發(fā)覺(jué)哪里不妥。大家知道,彈出非模態(tài)的對(duì)話框,它并不阻塞父窗口,但是焦點(diǎn)卻是在子對(duì)話框上,也就是當(dāng)兩者有層疊關(guān)系時(shí),你點(diǎn)擊父窗口的邊框,父窗口并不會(huì)像我們預(yù)期的那樣跳到最上面,卻仍然是子對(duì)話框在最上面。這就比較不爽了,于是我參照了一個(gè)前輩的方法,具體見(jiàn):
實(shí)現(xiàn)仿QQ主界面置頂(非模態(tài)對(duì)話框的顯示問(wèn)題)
如文中所示的方法后,我發(fā)現(xiàn)確實(shí)不同了,子對(duì)話框和父對(duì)話框重疊的時(shí)候,具有焦點(diǎn)的那個(gè)會(huì)被放到最上面。此時(shí),我便遇到今天我要說(shuō)的問(wèn)題了。我項(xiàng)目中遇到提示信息需要用戶注意的基本都是Afxmessagebox來(lái)實(shí)行。那么當(dāng)我在子對(duì)話框中進(jìn)行一些操作,彈出提示信息后,我們預(yù)期的是這個(gè)小的對(duì)話框應(yīng)該出現(xiàn)在子對(duì)話框上面,但是讓我意想不到的是,它出現(xiàn)在了父對(duì)話框的上面,也就是說(shuō),此時(shí),父對(duì)話框跑到了子對(duì)話框之上,而這個(gè)彈出的對(duì)話框又在其之上。我馬上就明白,這絕對(duì)是因?yàn)榇翱诰浔年P(guān)系,因?yàn)槲翼?xiàng)目中寫(xiě)的基本是AfxMessageBox(“xxxxxxx”,MB_OK)之類的,所以應(yīng)該再加個(gè)句柄就行了,但是加進(jìn)去不對(duì)了,提示調(diào)用參數(shù)太多了,這才又去查看了萬(wàn)能的百度,這才成為我想寫(xiě)這篇博客的動(dòng)因。
那么Afx是什么呢?afx其實(shí)是微軟的一個(gè)小組名稱,Application Framework技術(shù)團(tuán)隊(duì),名為AFX小組,用以開(kāi)發(fā)C++對(duì)象導(dǎo)向工具給Windows應(yīng)用程序開(kāi)發(fā)人員使用,x并沒(méi)有含義。Afx框架函數(shù)實(shí)現(xiàn)都是調(diào)用API函數(shù)的,你可以在VC中找到任意一個(gè)框架函數(shù)比如AfxMessageBox,單擊右鍵選轉(zhuǎn)到定義就可以看到它的源碼了,它的函數(shù)體里面還是要調(diào)用MessageBox的。那么此處我就明白了,Afxmessagebox是微軟對(duì)win32API函數(shù)messagebox的一個(gè)封裝,專門用在MFC中.既然說(shuō)到這了,雖然一直聽(tīng)說(shuō)過(guò)win32 api 和mfc,但兩者到底有什么關(guān)系呢?
Win32通常是指sdk編程方法,app沒(méi)有被封裝,開(kāi)發(fā)人員需要自己搭程序框架;mfC則是以C++類的形式封裝了Windows的API,并且包含一個(gè)應(yīng)用程序框架,以減少應(yīng)用程序開(kāi)發(fā)人員的工作量。更多更細(xì)致的區(qū)別見(jiàn)博客:
mfc與win32區(qū)別
這里我就把它摘抄過(guò)來(lái)了:MFC就是 微軟給你包裝了的庫(kù),提供了很多擴(kuò)展功能,以及高級(jí)功能,這樣方便你使用,而不是自己從頭調(diào)用API來(lái)實(shí)現(xiàn),而API由于是MFC下一層,自然實(shí)現(xiàn)更靈活,可以根據(jù)你的需要來(lái)使用,不會(huì)被MFC類庫(kù)所限制。?win32和mfc編程的最大不同是win32是編程者自己把消息和響應(yīng)函數(shù)聯(lián)系在一起。mfc是編程者采用微軟為我們做好了Messagemap機(jī)制,來(lái)處理消息。
mfc是便利的,為什么有人不用呢?不用mfc的人群往往是從DOS時(shí)代開(kāi)始從事窗口編程的人,他們?cè)缭趍fc出世之前就編得一手好程序。長(zhǎng)期的編程過(guò)程中,每人,每個(gè)TEAM都擁有了自己的消息處理機(jī)制程序庫(kù)或類庫(kù)。當(dāng)然有很多人認(rèn)為他的類庫(kù)比mfc使用方便。他開(kāi)始為窗口編程的時(shí)候,mfc的TEAM的很多人還在學(xué)校里讀書(shū)呢。如果不是從那個(gè)年代過(guò)來(lái)的人,還是用mfc吧!mfc是封裝的類,最后還是會(huì)調(diào)用win32api win32api開(kāi)發(fā)效率是底一些,但比較自由.
有時(shí)候mfc是封裝的類不能滿足我們的要求,這時(shí)就需要我們自己用api來(lái)開(kāi)發(fā)啦 ?MFC是專注于用戶界面的,而Windows SDK專注于UI, console,Windows服務(wù),嵌入式,驅(qū)動(dòng)多種類型的程序, MFC是一套類庫(kù),適應(yīng)范圍窄,可以搞ERP軟件,但效率不如其他語(yǔ)言高,而且類庫(kù)并沒(méi)有對(duì)DDK,openGL,D3D等專項(xiàng)領(lǐng)導(dǎo)的函數(shù)庫(kù)進(jìn)行封裝。而Windows SDK提供了專題開(kāi)發(fā)的平臺(tái)。
MFC中對(duì)所有的句柄,對(duì)象,消息都進(jìn)行了嚴(yán)格的檢測(cè),如果你不知道它的內(nèi)部機(jī)制,隨便調(diào)用函數(shù)很容易出錯(cuò),而SDK提供的是一種寬松的開(kāi)發(fā)環(huán)境,你可以用面向?qū)ο蟮乃枷攵x自己的類,對(duì)界面控件進(jìn)行封裝。
在一些專題開(kāi)發(fā)項(xiàng)目,你可以不懂MFC,但是在一些常規(guī)的軟件開(kāi)發(fā),你必須熟悉MFC,同時(shí)還要懂SDK.? win32是windows下的最基本的編程方式,使用它得到的代碼最干凈最有效率,也是最底層,它是其它所有方式實(shí)現(xiàn)的基礎(chǔ)。一般指只使用API和SDK。
MFC是對(duì)win32的封裝,使用win32編程方法,寫(xiě)了一個(gè)又一個(gè)類,讓我們不用再重復(fù)大量勞動(dòng)。但畢竟是封裝,所以不可能完全實(shí)現(xiàn)win32所有功能。用著雖然方便,但距離細(xì)節(jié)畢竟遠(yuǎn)了,在個(gè)性個(gè)、特殊化方面還有差距。 兩者相比,win32更本質(zhì),MFC更抽像。
可能說(shuō)的有點(diǎn)遠(yuǎn),但其實(shí)沒(méi)有,MessageBox是win32API函數(shù),而AfxMessageBox是mfc里封裝之后的函數(shù)。那么究竟兩者有什么異同呢?
對(duì)于AfxMessageBox,定義如下:(來(lái)自百度百科)
int AfxMessageBox( LPCTSTR lpszText, UINT nType = MB_OK, UINT nIDHelp = 0 );
int AFXAPI AfxMessageBox( UINT nIDPrompt, UINT nType = MB_OK, UINT nIDHelp = (UINT) –1 );
在第一種形式中,lpszText表示在消息框內(nèi)部顯示的文本,消息框的標(biāo)題為應(yīng)用程序的可執(zhí)行文件名(如Hello)。在第二種形式中,nIDPrompt為要顯示的文本字符串在字符串表中的ID。函數(shù)調(diào)用時(shí)會(huì)自動(dòng)從字符串表中載入字符串并顯示在消息框中。nType為消息框中顯示的按鈕風(fēng)格和圖標(biāo)風(fēng)格的組合,可以采用|(或)操作符組合各種風(fēng)格。
按鈕風(fēng)格
MB_ABORTRETRYIGNORE 消息框中顯示Abort、Retry、Ignore按鈕
MB_OK 顯示OK按鈕
MB_OKCANCEL 顯示OK、Cancel按鈕
MB_RETRYCANCEL 顯示Retry、Cancel按鈕
MB_YESNO 顯示Yes、No按鈕
MB_YESNOCANCEL 顯示Yes、No、Cancel按鈕
圖標(biāo)風(fēng)格
MB_ICONINFORMATION 顯示一個(gè)i圖標(biāo),表示提示
MB_ICONEXCLAMATION 顯示一個(gè)驚嘆號(hào),表示警告
MB_ICONSTOP 顯示手形圖標(biāo),表示警告或嚴(yán)重錯(cuò)誤
MB_ICONQUESTION 顯示問(wèn)號(hào)圖標(biāo),表示疑問(wèn)
使用時(shí),可以只調(diào)用AfxMessageBox(LPCTSTR lpszText);這樣默認(rèn)風(fēng)格為AfxMessageBox(LPCTSTR lpszText,MB_OK|MB_ICONEXCLAMATION );
2返回值
編輯
返回值有8種,如果內(nèi)存不夠,則返回0,否則返回以下值中的一種,分別對(duì)應(yīng)相應(yīng)的按鈕被點(diǎn)擊:
IDABORT、IDCANCEL、IDIGNORE、IDNO、IDOK 、IDRETRY、IDYES。
MessageBox的定義如下:
MessageBox顯示一個(gè)模態(tài)對(duì)話框,其中包含一個(gè)系統(tǒng)圖標(biāo)、 一組按鈕和一個(gè)簡(jiǎn)短的特定于應(yīng)用程序消息,如狀態(tài)或錯(cuò)誤的信息。消息框中返回一個(gè)整數(shù)值,該值指示用戶單擊了哪個(gè)按鈕。
int WINAPI MessageBox(HWND hWnd,LPCTSTR lpText,LPCTSTR lpCaption,UINT uType);
hWnd:
消息框的擁有窗此參數(shù)口。如果為NULL,則消息框沒(méi)有擁有窗口。
lpText:
消息框的內(nèi)容。如果使用了Unicode庫(kù),則把文本變成:
1TEXT(/sometext/)
lpCaption:
消息框的標(biāo)題。如果使用了Unicode庫(kù),則把文本變成:
TEXT(/sometext/)
uType:
指定一個(gè)決定對(duì)話框的內(nèi)容和行為的位標(biāo)志集。此參數(shù)可以為下列標(biāo)志組中標(biāo)志的組合。指定下列標(biāo)志中的一個(gè)來(lái)顯示消息框中的按鈕以及圖標(biāo)。
當(dāng)然此處就可以明顯的看到兩者最大的不同在于messagebox第一個(gè)參數(shù)hWnd,AfxMessageBox是全局函數(shù),在任何地方都能用,但MessageBox就不能如此用了,因?yàn)榈谝粋€(gè)參數(shù)的限制,它只能用在CWnd類和其派生類當(dāng)中。那么至此,我覺(jué)得我的問(wèn)題應(yīng)該找到了,并能夠解決了。想要在mfc里調(diào)用具有窗口句柄的messagebox,則應(yīng)該這樣
::MessageBox((GetSafeHwnd(),”text”,”title”,MB_OK)
其中GetSafeHwnd()函數(shù)獲取當(dāng)前對(duì)話框的窗口句柄。
那么在運(yùn)行之后,點(diǎn)擊彈出子對(duì)話框,再?gòu)棾鎏崾鞠?#xff0c;此時(shí)便和我們預(yù)想的效果是一樣的了,提示的消息出現(xiàn)在子對(duì)話框之上,焦點(diǎn)任然是子對(duì)話框。
OK,至此,完成,我今晚的博客!加油!拙見(jiàn),小記!
總結(jié)
以上是生活随笔為你收集整理的由MessageBox和AfxMessageBox的使用异同所感的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 对话框窗口最大最小化
- 下一篇: 关于模态对话框和非模态对话框的创建、显示