首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

VC/MFC 添加類繼承 CDC 基礎類:先添加再手動修改頭檔與繼承關係

     編輯:程式設計綜合問答

現象

MFC 類向導「新增類」對話框中,基礎類下拉列表找不到 `CDC`,無法直接建立繼承 `CDC` 的類。

解決步驟

  1. **先用類向導建立類**,基礎類選 `CObject` 或 `CCmdTarget`(任意可用)。
  2. **向導生成 `.h`/.cpp 後,手動修改**:
    
    // MyDC.h
    #include  // CDC 定義在這裡
    
    class CMyDC : public CDC  // 手動改為繼承 CDC
    {
        DECLARE_DYNCREATE(CMyDC) // 若需動態建立
    public:
        CMyDC();
        virtual ~CMyDC();
        // 覆寫 CDC 虛函數...
    };
    
  3. **補全 `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` 參考,避免繼承複雜性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved