自定義在RichEdit中插入對象的圖標

因爲有人要所以重新發出來。原文放在blogcn上。blogcn收費之後就刪除了。儘管在谷歌的博客上還有個備份,但是看來國內搜不到。

3/04/2004

自定義在RichEdit中插入對象的圖標

方法基本同Knowledge Base文章Q220844
HOWTO: Insert a Bitmap Into an RTF Document Using the RichEdit Control
只是在最後插入之前調用一下IOleCache::SetData,用一個HGLOBAL作爲參數,HGLOBAL裏面的數據是一個METAFILEPICT結構,包含自己提供的圖片

ASSERT_VALID(this);
ASSERT(m_lpObject != NULL);

// get IOleCache interface
LPOLECACHE lpOleCache = QUERYINTERFACE(m_lpObject, IOleCache);
if (lpOleCache == NULL)
{
TRACE0("Warning: object does not support IOleCache interface.\n");
return FALSE;
}
ASSERT(lpOleCache != NULL);

// new cache is for CF_METAFILEPICT, DVASPECT_ICON
FORMATETC formatEtc;
formatEtc.cfFormat = CF_METAFILEPICT;
formatEtc.ptd = NULL;
formatEtc.dwAspect = DVASPECT_ICON;
formatEtc.lindex = -1;
formatEtc.tymed = TYMED_MFPICT;

// setup the cache so iconic aspect is now included
DWORD dwConnection;
SCODE sc = lpOleCache->Cache(&formatEtc,
ADVF_NODATA|ADVF_PRIMEFIRST|ADVF_ONLYONCE, &dwConnection);
if (FAILED(sc))
{
lpOleCache->Release();
return FALSE;
}

// set data if iconic image provided
if (hMetaPict != NULL)
{
STGMEDIUM stgMedium;
stgMedium.tymed = TYMED_MFPICT;
stgMedium.hGlobal = hMetaPict;
stgMedium.pUnkForRelease = NULL;

sc = lpOleCache->SetData(&formatEtc, &stgMedium, FALSE);
if (FAILED(sc))
{
lpOleCache->Release();
return FALSE;
}
}
lpOleCache->Release();

return TRUE;

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章