CUserException 的自訂異常?A: 必須在自訂異常類使用 DECLARE_DYNAMIC 與 IMPLEMENT_DYNAMIC 巨集,讓 CATCH 巨集能取得執行期類別資訊。
CUserException 嗎?A: 不必。「User」僅指使用者拋出的異常,並非唯一基類。
HDC 建立 CDC 物件?A: 兩種方式:
// 方法 1:Attach/Detach
CDC dc;
dc.Attach(hDC);
// ... 使用 dc ...
dc.Detach(); // 必須 Detach,否則 DC 會被釋放導致問題
// 方法 2:FromHandle(推薦,無需 Detach)
CDC* pDC = CDC::FromHandle(hDC);
A: MFC 無直接支援,參考範例:DIBLOOK、MULTDOCS、SDK 的 DIBVIEW、SHOWDIB。
A: 視圖是框架視窗的子視窗,調整父框架大小即可:
GetParentFrame()->MoveWindow(x, y, w, h); // 視圖自動適應
CFormView 大小?A: 覆寫 OnInitialUpdate:
void CMyView::OnInitialUpdate() {
CFormView::OnInitialUpdate();
GetParentFrame()->RecalcLayout();
ResizeParentToFit(); // 或 ResizeParentToFit(FALSE) 不捲動
}
A: 用 ClassWizard 從 CView/CScrollView 衍生新類,修改 InitInstance 中 AddDocTemplate 的 RUNTIME_CLASS 參數。MDI 可多次呼叫 AddDocTemplate 實現多視圖類型共存。
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;
}
CDocument* pDoc = ((CFrameWnd*)AfxGetApp()->m_pMainWnd)->GetActiveDocument();
CView* pView = ((CFrameWnd*)AfxGetApp()->m_pMainWnd)->GetActiveView();
// 建議封裝為 CMyDoc::GetCurrentDoc() 等靜態函式,並檢查 RUNTIME_CLASS
注意:OLE 就地啟動或非啟動視圖時此法失效。
A: 呼叫 CDocTemplate::CreateNewFrame(pDoc, pFrame),參考 CHKBOOK、MULTVIEW 範例。
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); ... }
}
AUTOSV.LZH (MSMFC 庫),實現輔助訊息迴圈管理滑鼠。HELLO、MDI、HELLOAPP 範例皆未使用,但會失去列印預覽、OLE 等功能。DeleteContents(),非解構函式。InitInstance 建立多個 CMultiDocTemplate 並 AddDocTemplate。m_templateList 呼叫 GetFirstDocPosition/GetNextDoc。ProcessShellCommand 前設 cmdInfo.m_nShellCommand = CCommandLineInfo::FileNothing。