MFC類結構 2 CCmdTarget類

2021-09-06 03:21:12 字數 1645 閱讀 2888

該類派生於cobject,它封裝了mfc的訊息對映機制,希望接收系統事件和視窗訊息的類都從它派生,如cdocument和cwnd分支。此外,在系統繁忙,無法響應視窗訊息時,滑鼠游標應該顯示為沙漏形等待狀態,ccmdtarget類封裝了3個成員函式完成該功能。封裝com的 idispatch介面是它的另一項主要功能。idispatch是com的標準介面,不含指標操作的語言(如vb)以及描述性語言(如web指令碼語言和vba)都通過該介面操作com元件。ccmdtarget類以一種類似訊息對映的機制提供idispatch介面,所以使用mfc可以輕鬆地編寫automation客戶程式和元件。關於訊息對映機制的闡述,參見第9章。下面僅討論該類的等待游標支援。

ccmdtarget類定義beginwaitcursor()、endwaitcursor()和restorewaitcursor()3個成員函式處理等待游標。beginwaitcursor()將游標設定為沙漏形狀,該函式有可能被程式框架呼叫,通知使用者狀態忙,例如當載入和儲存文件時。endwaitcursor()將游標恢復為沙漏之前的形狀,一般與beginwaitcursor()配合使用。

在實際程式設計中,在乙個比較耗費機時的處理前應該主動呼叫beginwaitcursor()設定游標,在處理結束時要呼叫endwaitcursor()恢復游標。例如:

void cwaitcursordoc::loadfile(char * filepath)

//顯示沙漏游標

beginwaitcursor();

//耗費機時的處理過程

trace("正在裝入檔案,請等待...\n");

//恢復為沙漏前的游標形狀

endwaitcursor();

如果在beginwaitcursor()和endwaitcursor()之間的處理中,彈出了模式對話方塊,游標會由沙漏變為標準形狀(通常是標準箭頭)。為處理這種情形,可以在對話方塊關閉後,呼叫成員restorewaitcursor()重新將游標設定回沙漏形狀,直到處理結束後呼叫endwait cursor()。例如:

void cwaitcursordoc::loadfile(char * filepath)

win32_find_data finddata;

//顯示沙漏游標

beginwaitcursor();

//耗費機時的處理過程

if(::findfirstfile(filepath,&finddata)==invalid_handle_value)

trace("開啟檔案出錯,請重新指定檔案\n");

cfiledlg dlg;

dlg.domodal();

//恢復游標的沙漏形狀

restorewaitcursor();

trace("正在裝入檔案,請等待...\n");

//恢復沙漏前的游標形狀

endwaitcursor();

但如果彈出的是messagebox()訊息框,就不必呼叫restorewaitcursor(),游標會自動恢復為沙漏。

在非ccmdtarget派生類中,可以使用cwaitcursor類設定等待游標。該類的建構函式和析構函式相當於ccmdtarget::beginwaitcursor()和ccmdtarget::endwaitcursor(),成員函式restore()相當於ccmdtarget:: restorewaitcursor()。

MFC類的結構

1.cobject類,mfc庫中絕大部分類的基類,封裝了mfc中的最基本機制。執行時類資訊機制 動態建立機制 序列化機制等。2.ccmdtarget 訊息對映機制最基類 4.cdocment及子類 文件類,負責管理資料 5.cdoctemplate以及子類 文件模板類 csingledoctempl...

MFC中的類結構層次 MFC基礎類及其層次結構

在前一篇中,gilbert總結了mfc是以類的形式封裝了api函式,使得windows下的c語言程式設計,成為物件導向的mfc.mfc採用單一繼承,從根類cobject層層派生出絕大多數mfc中的類,其層次結構為下圖所示.派生類功能描述 ccmdtarget 用於處理使用者請求,處理選單或按鈕等訊息...

如何在MFC中加入結構體或類,

1 經常我們在mfc中如我們定義類或者結構體時,就會出現如下錯誤 e musicretrieval fft.cpp 3 error c2146 syntax error missing before identifier w e musicretrieval fft.cpp 3 error c250...