現象
MFC 類向導「新增類」對話框中,基礎類下拉列表找不到 `CDC`,無法直接建立繼承 `CDC` 的類。
解決步驟
- **先用類向導建立類**,基礎類選 `CObject` 或 `CCmdTarget`(任意可用)。
- **向導生成 `.h`/.cpp 後,手動修改**:
// MyDC.h
#include // CDC 定義在這裡
class CMyDC : public CDC // 手動改為繼承 CDC
{
DECLARE_DYNCREATE(CMyDC) // 若需動態建立
public:
CMyDC();
virtual ~CMyDC();
// 覆寫 CDC 虛函數...
};
- **補全 `IMPLEMENT_DYNCREATE` / `IMPLEMENT_DYNAMIC`** (在 `.cpp`):
IMPLEMENT_DYNCREATE(CMyDC, CDC)
// 或
IMPLEMENT_DYNAMIC(CMyDC, CDC)
為什麼向導沒有 CDC?
- 類向導預設只列出常用視窗/對話框/文檔/視圖基類 (`CWnd`, `CDialog`, `CView`, `CDocument`...)。
- `CDC`、`CGdiObject`、`CFile` 等 **非視窗類** 不在列表,但完全可以手動繼承。
- 第三方庫、自定義基類同理:向導建殼 → 手動改繼承 → 補巨集。
注意事項
- 繼承 `CDC` 通常意味著**自訂繪圖裝置上下文**(如雙緩衝 `CMemDC`、PDF 輸出、列印預覽)。需覆寫 `GetSafeHdc()`、`StartDoc()` 等虛函數。
- 若只是封裝繪圖邏輯,**組合 (Composition) 優於繼承**:類內含 `CDC* m_pDC` 或 `CDC& m_dc`,轉發呼叫,耦合更低。
總結
MFC 類向導無 `CDC` 基礎類選項 → **先建立類再手動改 `public CDC`、包含 ``、補 `IMPLEMENT_DYNCREATE`**。或改用組合模式持有 `CDC` 參考,避免繼承複雜性。