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

VC 與 MFC 常見問題彙總:異常處理、DC 轉換、視圖操作、文檔管理等

     編輯:關於VC++

異常處理篇

Q: 如何拋出衍生自 CUserException 的自訂異常?

A: 必須在自訂異常類使用 DECLARE_DYNAMIC 與 IMPLEMENT_DYNAMIC 巨集,讓 CATCH 巨集能取得執行期類別資訊。

Q: 異常類一定要繼承 CUserException 嗎?

A: 不必。「User」僅指使用者拋出的異常,並非唯一基類。

裝置內容 (DC) 轉換篇

Q: 如何從 HDC 建立 CDC 物件?

A: 兩種方式:


// 方法 1:Attach/Detach
CDC dc;
dc.Attach(hDC);
// ... 使用 dc ...
dc.Detach(); // 必須 Detach,否則 DC 會被釋放導致問題

// 方法 2:FromHandle(推薦,無需 Detach)
CDC* pDC = CDC::FromHandle(hDC);

位圖讀取篇

Q: 如何讀取 256 色位圖檔?

A: MFC 無直接支援,參考範例:DIBLOOK、MULTDOCS、SDK 的 DIBVIEW、SHOWDIB。

視圖操作篇

Q: 如何改變視圖大小?

A: 視圖是框架視窗的子視窗,調整父框架大小即可:


GetParentFrame()->MoveWindow(x, y, w, h); // 視圖自動適應

Q: 如何改變 CFormView 大小?

A: 覆寫 OnInitialUpdate:


void CMyView::OnInitialUpdate() {
    CFormView::OnInitialUpdate();
    GetParentFrame()->RecalcLayout();
    ResizeParentToFit(); // 或 ResizeParentToFit(FALSE) 不捲動
}

Q: 如何切換/新增視圖類別?

A: 用 ClassWizard 從 CView/CScrollView 衍生新類,修改 InitInstance 中 AddDocTemplate 的 RUNTIME_CLASS 參數。MDI 可多次呼叫 AddDocTemplate 實現多視圖類型共存。

Q: 如何改變視圖背景色?

A: 處理 WM_ERASEBKGND:


BOOL CMyView::OnEraseBkgnd(CDC* pDC) {
    CBrush brush(RGB(255,128,128));
    CBrush* pOld = pDC->SelectObject(&brush);
    CRect rect; pDC->GetClipBox(&rect);
    pDC->PatBlt(rect.left, rect.top, rect.Width(), rect.Height(), PATCOPY);
    pDC->SelectObject(pOld);
    return TRUE;
}

Q: 如何取得當前視圖/文檔指標?


CDocument* pDoc = ((CFrameWnd*)AfxGetApp()->m_pMainWnd)->GetActiveDocument();
CView* pView = ((CFrameWnd*)AfxGetApp()->m_pMainWnd)->GetActiveView();
// 建議封裝為 CMyDoc::GetCurrentDoc() 等靜態函式,並檢查 RUNTIME_CLASS

注意:OLE 就地啟動或非啟動視圖時此法失效。

Q: 如何在一個文檔建立多個視圖?

A: 呼叫 CDocTemplate::CreateNewFrame(pDoc, pFrame),參考 CHKBOOK、MULTVIEW 範例。

Q: 如何列舉 MDI 程式所有視圖?

A: 使用未文檔化函式(MFC 4.0 改用 CDocManager):


POSITION pos = pTemplate->GetFirstDocPosition();
while (pos) {
    CDocument* pDoc = pTemplate->GetNextDoc(pos);
    POSITION vPos = pDoc->GetFirstViewPosition();
    while (vPos) { CView* pView = pDoc->GetNextView(vPos); ... }
}

其他常見問題

  • 可拖曳的 CScrollView:下載 AUTOSV.LZH (MSMFC 庫),實現輔助訊息迴圈管理滑鼠。
  • 一定要用 Doc/View 架構嗎?:不必,HELLO、MDI、HELLOAPP 範例皆未使用,但會失去列印預覽、OLE 等功能。
  • 文檔何時解構?:SDI 程式結束時;MDI 最後一個視圖關閉時。資料釋放請在 DeleteContents(),非解構函式。
  • 多文檔模板註冊:在 InitInstance 建立多個 CMultiDocTemplate 並 AddDocTemplate。
  • 取得開啟文檔列表:遍歷 m_templateList 呼叫 GetFirstDocPosition/GetNextDoc。
  • 啟動時不建立新文檔:ProcessShellCommand 前設 cmdInfo.m_nShellCommand = CCommandLineInfo::FileNothing。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved