富文本框没有提供直接显示OLE对象的属性或方法设置。
丰富的编辑控件通过组件对象模型(COM)接口公开它们的一些功能。 通过从控件获取接口,您可以使用控件中的其他对象。 您可以通过发送EM_GETOLEINTERFACE消息来获取此接口。 然后,您可以从IRichEditOle界面获取文本对象模型中使用的接口。
另一个接口IRichEditOleCallback由应用程序实现,用于在控件与对象交互时定义控件的行为。
以下代码示例将文件对象插入到富编辑控件中。如果程序与用户计算机上的文件类型相关联(例如,Microsoft Excel表示.xls文件),则文件内容将显示在控件中;否则,会出现一个图标。
//hRichEdit是富文本框控件的句柄
BOOL InsertObject(CRichEditUI* hRichEdit, LPCTSTR pszFileName)
{
HRESULT hr;
//1.Get the IRichEditOle interface.
LPRICHEDITOLE pRichEditOle;
LRESULT lResult;
hRichEdit->TxSendMessage(EM_GETOLEINTERFACE, 0, (LPARAM)(LPVOID*)&pRichEditOle, &lResult);
if (pRichEditOle == NULL)
{
return FALSE;
}
//2.Create structured storage.
LPLOCKBYTES pLockBytes = NULL;
hr = CreateILockBytesOnHGlobal(NULL, TRUE, &pLockBytes);
if (FAILED(hr))
{
return FALSE;
}
LPSTORAGE pStorage;
hr = StgCreateDocfileOnILockBytes(pLockBytes,
STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE,
0, &pStorage);
if (FAILED(hr))
{
return FALSE;
}
//3.Set up the data format.
FORMATETC formatEtc;
formatEtc.cfFormat = 0;
formatEtc.ptd = NULL;
formatEtc.dwAspect = DVASPECT_CONTENT;
formatEtc.lindex = -1;
formatEtc.tymed = TYMED_NULL;
//4.Get a pointer to the display site.
LPOLECLIENTSITE pClientSite;
hr = pRichEditOle->GetClientSite(&pClientSite);
if (FAILED(hr))
{
return FALSE;
}
//5.Create the object and retrieve its IUnknown interface.
LPUNKNOWN pUnk;
CLSID clsid = CLSID_NULL;
hr = OleCreateFromFile(clsid,
pszFileName,
IID_IUnknown,
OLERENDER_DRAW,
&formatEtc,
pClientSite,
pStorage,
(void**)&pUnk);
pClientSite->Release();
if (FAILED(hr))
{
return FALSE;
}
//6.Get the IOleObject interface to the object.
LPOLEOBJECT pObject;
hr = pUnk->QueryInterface(IID_IOleObject, (void**)&pObject);
pUnk->Release();
if (FAILED(hr))
{
return FALSE;
}
//7.To ensure that references are counted correctly, notify the object that it is contained.
OleSetContainedObject(pObject, TRUE);
//8.Set up object info.
REOBJECT reobject = { sizeof(REOBJECT) };
hr = pObject->GetUserClassID(&clsid);
if (FAILED(hr))
{
return FALSE;
}
reobject.clsid = clsid;
reobject.cp = REO_CP_SELECTION;
reobject.dvaspect = DVASPECT_CONTENT;
reobject.dwFlags = REO_NULL;
reobject.dwUser = 0;
reobject.poleobj = pObject;
reobject.polesite = pClientSite;
reobject.pstg = pStorage;
SIZEL sizel = { 0 };
reobject.sizel = sizel;
//9.Move the caret to the end of the text and add a carriage return.
hRichEdit->SetSel(0, -1);
DWORD dwStart, dwEnd;
hRichEdit->GetSel((long&)dwStart, (long&)dwEnd);
hRichEdit->SetSel(dwEnd + 1, dwEnd + 1);
hRichEdit->ReplaceSel(L"\n", TRUE);
//10.Insert the object.
hr = pRichEditOle->InsertObject(&reobject);
//11.Clean up.
pObject->Release();
pRichEditOle->Release();
if (FAILED(hr))
{
return FALSE;
}
return TRUE;
}
参考资料:https://docs.microsoft.com/zh-cn/windows/desktop/Controls/using-rich-edit-com