2016-02-12 111 views
-1

使用MFC vs2010 C++我試圖使用CRichEditCtrl來顯示圖像。CRichEditCtrl和插入圖像(JPG)

使用過程這裏https://support.microsoft.com/en-us/kb/220844

解釋,我能看到圖標下的「圖標」與圖像的名字,但我 希望看到在控制的實際圖像。如果我雙擊圖標 然後我會看到一個彈出式應用程序,顯示原始圖像。

我的圖片將全部爲JPG。我正在尋找類似於Windows 8.1寫字板插入圖片的功能。

我讀過使用HBITMAP的版本,但它顯示的是實際圖像或相同的圖標/名稱。我也希望保持jpg格式,因爲它在我的情況下更小。那麼有誰知道這個版本是否顯示圖像而不是圖標?

我是否缺少一些簡單的東西?

回答

1

MSDN示例應使用位圖圖像。您可以使用Gdiplus打開jpeg/png,然後從Gdiplus手柄獲取HBITMAP。使用OleCreateStaticFromData在RichEdit控件中插入圖片

void InsertBitmap(CRichEditCtrl *edit, HBITMAP hBitmap, int position) 
{ 
    STGMEDIUM stgm; 
    stgm.tymed = TYMED_GDI; 
    stgm.hBitmap = hBitmap; 
    stgm.pUnkForRelease = NULL; 

    FORMATETC fm; 
    fm.cfFormat = CF_BITMAP; 
    fm.ptd = NULL; 
    fm.dwAspect = DVASPECT_CONTENT; 
    fm.lindex = -1; 
    fm.tymed = TYMED_GDI; 

    COleDataSource oleDataSource; 
    oleDataSource.CacheData(CF_BITMAP, &stgm); 
    LPDATAOBJECT dataObject = (LPDATAOBJECT)oleDataSource.GetInterface(&IID_IDataObject); 

    if (OleQueryCreateFromData(dataObject) != OLE_S_STATIC) 
     return; 

    LPOLECLIENTSITE oleClientSite; 
    if (S_OK != edit->GetIRichEditOle()->GetClientSite(&oleClientSite)) 
     return; 

    //allocate memory 
    LPLOCKBYTES lockBytes = NULL; 
    if (S_OK == CreateILockBytesOnHGlobal(NULL, TRUE, &lockBytes) && lockBytes) 
    { 
     IStorage *storage = NULL; 
     if (S_OK == StgCreateDocfileOnILockBytes(lockBytes, STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, &storage) && storage) 
     { 
      IOleObject *oleObject = NULL; 
      if (S_OK == OleCreateStaticFromData(dataObject, IID_IOleObject, OLERENDER_FORMAT, &fm, oleClientSite, storage, (void **)&oleObject) && oleObject) 
      { 
       CLSID clsid; 
       if (S_OK == oleObject->GetUserClassID(&clsid)) 
       { 
        REOBJECT reobject = { sizeof(REOBJECT) }; 
        reobject.clsid = clsid; 
        reobject.cp = position; 
        reobject.dvaspect = DVASPECT_CONTENT; 
        reobject.poleobj = oleObject; 
        reobject.polesite = oleClientSite; 
        reobject.pstg = storage; 
        edit->GetIRichEditOle()->InsertObject(&reobject); 
       } 
       oleObject->Release(); 
      } 
      storage->Release(); 
     } 
     lockBytes->Release(); 
    } 
    oleClientSite->Release(); 
} 

用法:

Gdiplus::Bitmap *gdibmp = Gdiplus::Bitmap::FromFile(filename); 
HBITMAP hbitmap = NULL; 
gdibmp->GetHBITMAP(0, &hbitmap); 
if (hbitmap) 
    InsertBitmap(&richEdit, hbitmap, 0); 
delete gdibmp; 

注意,Gdiplus需要Unicode文件名。如果您的項目是ANSI(不應該是這樣),那麼使用CStringW將文件名轉換爲Unicode。