《深入浅出MFC第2版(PDF格式)》第305章


#0005 if (!afxTraceEnabled) 
926 
…………………………………………………………Page 989……………………………………………………………
附錄D 以MFC 重建DBWIN
#0006 return; 
#0007 
#0008 CWnd *pTraceWnd = CWnd::FindWindow(TRACEWND_CLASSNAME; NULL); 
#0009 if (pTraceWnd) { 
#0010 static UINT WM_TRACE_MSG = 
RegisterWindowMessage(TRACEWND_MESSAGE); 
#0011 
#0012 // Found Trace window: send message there as a global atom。 
#0013 // Delete atom after use。 
#0014 // 
#0015 ATOM atom = GlobalAddAtom((LPCSTR)lpBuf); 
#0016 pTraceWnd…》SendMessage(WM_TRACE_MSG; (WPARAM)atom); 
#0017 GlobalDeleteAtom(atom); 
#0018 
#0019 } else { 
#0020 // No trace window: do normal debug thing 
#0021 // 
#0022 ::OutputDebugString((LPCSTR)lpBuf); 
#0023 } 
#0024 } 
圖四 CMfxTrace::Write 函式碼 
如何使用TRACEWIN。H 
雖然除錯工具的最高原則是,不要動用被除錯對象的原始碼,但為了讓方法簡單些, 
力氣少用些,看得懂的多些,Paul DiLascia 還是決定妥協,他設計了述的 
CMfxTrace 類別以及個 Tracewin 工具程式,你必須把 CMfxTrace 類別含入到自己的 
程式,像這樣: 
#include 〃tracewin。h〃 
並在程式的任何方(通常是 InitInstance 函式內)做此動作: 
CMfxTrace::Init(); 
然後所有的 TRACE 字串輸出就會流到 Tracewin 視窗。太好了! 
注意,TRACEWIN。H 不但有類別宣告,還有類別定義,和般的表頭檔不太樣,所 
以你只能夠在你的程式含入次 TRACEWIN。H 。 
927 
…………………………………………………………Page 990……………………………………………………………
第五篇 附錄
Tracewin 視窗 
這是個隨時等待接受訊息的小程式。它所接受的訊息,夾帶著 global atom 作為參數。 
Tracewin 只要把 atom 解碼,丟到個由它管轄的Edit 視窗即可。Paul DiLascia 設計 
的這個小程式,功能面面俱到,可以把接受的 TRACE 輸出字串顯示在視窗,或放到 
某個檔案;也可以把 EDIT 緩衝區內容拷貝到剪貼簿,或是清除整個 EDIT 緩衝區 
內容。功能與 Visual C++ 1。5 的DBWIN 幾乎不相,只差洠軌虬殉e字串輸出到 
1 和 2 。 
Tracewin 並不動用 Document/View 架構。主視窗內含個 Edit 控制元件作為其子視 
窗,事實,那是個衍生自 CEdit 的 CBufWnd 類別,有點像 CEditView 。 
當應用程式以 TRACE 巨集送出字串,經過 CDumpContext::OutputString 的作用,送往 
CMfxTrace::Write FindWindow Tracewin
,我們在其以 找到 視窗: 
CWnd *pTraceWnd = CWnd::FindWindow(TRACEWND_CLASSNAME; NULL); 
要知道,如果 Tracewin 使用的類別是 MFC 預先建立的個類別,那麼它的類別名稱 
可能是像 Afx:b:14ae:6:3e8f 這種不太有意義的字串,而且可能在不同的機器不同的時間 
有不同的名稱。如此來如何為 FindWindow 指定第個參數?我們必須有個什麼方法 
避免使用 MFC 預先建立的個類別,但又能夠使用其類別設定。 
視窗類別名稱 Afx:x:y:z:w 
MFC 2。5 在應用程式開始執行時,便在 AfxWinInit 先行裕粤耍祩€視窗類別備用。 
MFC 4。x 的行為稍有修改,它在應用程式呼叫 LoadFrame 準備產生視窗時,才在 
LoadFrame 所呼叫的 PreCreateWindow 虛擬函式為你產生視窗類別。5個可能的視窗 
類別分別是: 
928 
…………………………………………………………Page 991……………………………………………………………
附錄D 以MFC 重建DBWIN
const TCHAR _afxWnd'' = AFX_WND; 
const TCHAR _afxWndControlBar'' = AFX_WNDCONTROLBAR; 
const TCHAR _afxWndMDIFrame'' = AFX_WNDMDIFRAME; 
const TCHAR _afxWndFrameOrView'' = AFX_WNDFRAMEORVIEW; 
const TCHAR _afxWndOleControl'' = AFX_WNDOLECONTROL; 
這些 AFX_xxx 常數定義於 AFXIMPL。H ,依不同的聯結狀態(除錯模式與否、動態 
聯結與否)而有不同的值。如果使用 MFC 動態聯結版和除錯版,5個視窗類別的名稱 
將是: 
〃AfxWnd42d〃 
〃AfxControlBar42d〃 
〃AfxMDIFrame42d〃 
〃AfxFrameOrView42d〃 
〃AfxOleControl42d〃 
如果是使用 MFC 靜態聯結版和除錯版,5個視窗類別的名稱將是: 
〃AfxWnd42sd〃 
〃AfxControlBar42sd〃 
〃AfxMDIFrame42sd〃 
〃AfxFrameOrView42sd〃 
〃AfxOleControl42sd〃 
深入湷錾钊霚出 MFC /
這些名稱的由來,以及它們的裕詴r機,請參考深入湷錾钊霚出 (侯俊傑 松崗)第6 
章。 
然而,這些視窗類別名稱又怎麼會變成像 Afx:b:14ae:6:3e8f 這副奇怪模樣呢?原來是 
Framework 玩的把戲,它把這些視窗類別名稱轉換為 Afx:x:y:z:w 型式,成為獨無之 
視窗類別名稱: 
x: 視窗風格(window style)的 hex 值 
y: 滑鼠游標的 hex 值 
z: 背景顏色的 hex 值 
w: 圖示的 hex 值 
CMfxTrace FindWindow Tracewin Tracewin
為了讓 能夠以 函式找到 , 的視窗類別名稱 
Afx:x:y:z:w 
(也就是那個 )必須完全在我們的控制之才行。那麼,我們勢必得改寫 
Tracewin 的 frame 視窗的 PreCreateWindow 虛擬函式。 
929 
…………………………………………………………Page 992……………………………………………………………
第五篇 附錄
圖五 以 Spy 觀察視窗。請注意每一個視窗類別的名稱都是 Afx:x:y:z:w 型 
式。fig5。bmp 
PreCreateWindow 和 GetClassInfo 
圖六是 Tracewin 的 PreCreateWindow 內容,利用 GetClassInfo 把 MFC 的視窗類別做 
小说推荐
返回首页返回目录