首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC 教學

VC++/MFC 經典常見問題彙總與解決方案大全

     編輯:VC 教學

異常處理與動態建立

如何拋出 CUserException 衍生異常?
衍生類必須使用 DECLARE_DYNAMIC / IMPLEMENT_DYNAMIC 巨集,讓 CATCH 巨集能取得執行期類別資訊。
異常類別一定要從 CUserException 衍生嗎?
**不必**。「User」僅指使用者拋出的異常,非唯一基類。

DC 與 GDI 物件轉換

如何從 HDC 建立 CDC?
兩種方式:
1. CDC dc; dc.Attach(hDC); ... dc.Detach(); (需手動 Detach 避免重複釋放)
2. CDC* pDC = CDC::FromHandle(hDC); (較安全,無需 Detach)

位圖載入與顯示

如何讀取 256 色 BMP/DIB 檔案?
MFC 無直接支援,參考範例:DIBLOOK、MULTDOCS、SDK DIBVIEW/SHOWDIB。

視圖與框架視窗尺寸控制

如何改變視圖大小?
視圖是框架視窗子視窗,調用框架的 MoveWindow,視圖會自動適應。
GetParentFrame()->MoveWindow(...)
CFormView 大小調整?
覆寫 OnInitialUpdate:
CFormView::OnInitialUpdate(); GetParentFrame()->RecalcLayout(); ResizeParentToFit();

文件模板與多視圖

如何使用新視圖類別?
ClassWizard 建立衍生類 → 修改頭文件/實作檔基類引用 → InitInstance 中 AddDocTemplate 第三參數換新 RUNTIME_CLASS。MDI 可再加一個 AddDocTemplate 實現多視圖類型共存。
如何建立一個文件的多個視圖?
CDocTemplate::CreateNewFrame(pDoc, pCloneFrame) 建立新框架+視圖。參考 CHKBOOK、MULTVIEW 範例。
MDI 列舉所有視圖?
MFC 4.0+ 使用 CDocManager;舊版迭代 m_templateList → GetFirstDocPosition/GetNextDoc → GetFirstViewPosition/GetNextView。

背景色與視覺客製化

改變視圖背景色?
處理 WM_ERASEBKGND:
CBrush brush(RGB(255,128,128)); pDC->FillRect(&rect, &brush); return TRUE;
對話框/表單視圖背景色?
覆寫 OnCtlColor,依 nCtlColor 返回自訂刷子句柄。

文件生命週期

文件何時解構?
SDI:程式結束。MDI:最後一個關聯視圖關閉時。
資料釋放請在 DeleteContents() 執行,**勿放在解構函數**。

多文件模板註冊

如何新增文件類型?
AppWizard 建立 Doc/View 類 → 資源編輯器加字串/圖示/選單 (ID 需一致) → InitInstance 新增 CMultiDocTemplate 並 AddDocTemplate。

開啟文件列表獲取

如何取得所有開啟文件指標?
迭代 m_templateList → 每模板 GetFirstDocPosition/GetNextDoc 收集 CDocument*。

啟動時不建立新文件

如何禁止啟動自動新建文件?
InitInstance 中 ProcessShellCommand 前設定:
cmdInfo.m_nShellCommand = CCommandLineInfo::FileNothing;

捲動視圖滑鼠拖曳捲動

如何實現滑鼠拖曳捲動?
需輔助訊息迴圈處理滑鼠事件,參考 MSMFC 函式庫 AUTOSV.LZH 範例。

文檔/視圖架構是否強制?

一定要用 Doc/View 架構嗎?
**不強制**。HELLO、MDI、HELLOAPP 範例即非 Doc/View。但會失去列印預覽、OLE 等進階功能。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved