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

MFC 同時編輯文字與圖片:CRichEditView OLE 嵌入物件完整指南

     編輯:程式設計疑難解答

需求澄清

MFC 中 CRichEditView / CRichEditCtrl 原生支援文字編輯,圖片處理需透過 OLE (Object Linking and Embedding) 機制嵌入物件,而非直接「輸入圖片」。

核心架構

層級類別/介面職責
視圖CRichEditViewUI 容器、訊息路由、列印
控制項CRichEditCtrlRich Edit 2.0/3.0/4.1 封裝
OLE 客戶端CRichEditCntrItem嵌入物件生命週期管理
OLE 伺服器WordPad、Paint、Excel 等提供編輯能力的外部應用

實作步驟

1. 專案設定啟用 OLE

  • AppWizard 建立專案時勾選 Compound Document Support (容器/伺服器)
  • 或手動在 InitInstance 呼叫 AfxEnableControlContainer()、AfxOleInit()

2. 衍生 RichEditCntrItem 處理嵌入物件

class CMyRichEditCntrItem : public CRichEditCntrItem {
public:
    CMyRichEditCntrItem(REOBJECT* preo = NULL, CRichEditView* pView = NULL)
        : CRichEditCntrItem(preo, pView) {}
    
    // 覆寫雙擊編輯行為
    virtual void OnEdit() {
        // 預設啟動關聯應用 (如 Paint 編輯圖片)
        CRichEditCntrItem::OnEdit();
    }
};

3. 視圖類別關聯 Item

class CMyRichEditView : public CRichEditView {
protected:
    virtual CRichEditCntrItem* CreateClientItem(REOBJECT* preo) {
        return new CMyRichEditCntrItem(preo, this);
    }
    
    // 插入圖片功能
    void InsertImage() {
        CFileDialog dlg(TRUE, _T("bmp"), NULL, OFN_FILEMUSTEXIST,
            _T("圖片檔案 (*.bmp;*.jpg;*.png)|*.bmp;*.jpg;*.png|"));
        if (dlg.DoModal() == IDOK) {
            // 透過 OLE 插入檔案
            HRESULT hr = GetRichEditCtrl().InsertFile(dlg.GetPathName());
            if (FAILED(hr)) AfxMessageBox(_T("插入失敗"));
        }
    }
};

關鍵 API 對照

操作方法說明
插入檔案/圖片InsertFile(path)建立 OLE 連結/嵌入
插入位圖InsertBitmap(hBitmap)直接嵌入 HBITMAP
取得選取物件GetSelectedItem()回傳 CRichEditCntrItem*
儲存 RTFStreamOut(SF_RTF, es)含 OLE 物件資料
載入 RTFStreamIn(SF_RTF, es)自動還原 OLE 物件

常見誤區

「Word 也不支援輸入圖片」—— 正確說法:Word 將圖片作為 OLE 嵌入物件 或 DrawingML 圖形 處理,雙擊啟動關聯編輯器 (如 Picture Manager)。MFC RichEdit 同樣遵循此模型。

替代方案:自繪控制項

若需即時編輯圖片像素 (而非啟動外部編輯器),建議:

  • 自繪 CScrollView 衍生類
  • 維護 vector<Layer> (文字層、圖片層、繪圖層)
  • 滑鼠事件分派至對應圖層編輯器
  • 參考 CImage、GDI+ 進行像素操作
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved