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