如题
把ActivX控件做为CRichEditCtrl的子窗口试试
用IOleObject::SetClientSite,OleSetContainedObject和IRichEditOle::InsertObjec
理论上来说还要inplace activate的,但是我的控件是windowless的,所以没写。
void CRichEditGifDlg::InsertGIF(LPCTSTR lpszText)
{
CString strText(lpszText);
CString strFile;
if(!m_mapTextToFile.Lookup(strText,strFile))
{
strFile=strText;
m_mapTextToFile.SetAt(strText,strFile);
}
LPRICHEDITOLE lpRichEditOle=NULL;
LPOLEOBJECT lpObject=NULL;
LPSTORAGE lpStorage=NULL;
LPOLECLIENTSITE lpClientSite=NULL;
LPLOCKBYTES lpLockBytes = NULL;
REOBJECT reobject;
ZeroMemory(&reobject, sizeof(REOBJECT));
reobject.cbStruct = sizeof(REOBJECT);
HRESULT hr=S_OK;
CLSID clsid=CLSID_NULL;
do{
lpRichEditOle=m_wndRichEdit.GetIRichEditOle();
if(lpRichEditOle==NULL)break;
hr= ::CreateILockBytesOnHGlobal(NULL, TRUE, &lpLockBytes);
if (hr != S_OK||lpLockBytes==NULL) break;
hr= ::StgCreateDocfileOnILockBytes(lpLockBytes,
STGM_SHARE_EXCLUSIVE|STGM_CREATE|STGM_READWRITE, 0, &lpStorage);
if (hr!= S_OK||lpStorage==NULL) break;
hr=lpRichEditOle->GetClientSite(&lpClientSite);
if (hr!= S_OK||lpClientSite==NULL) break;
try
{
ANIMATEPICLib::_DAnimatePicPtr ptrAnimatePic;
hr = ptrAnimatePic.CreateInstance(_T("ANIMATEPIC.AnimatePicCtrl.1"));
if( FAILED(hr) ) _com_issue_error(hr);
hr = ptrAnimatePic.QueryInterface(IID_IOleObject, (void**)&lpObject);
if( FAILED(hr)||lpObject==NULL) _com_issue_error(hr);
lpObject->SetClientSite(lpClientSite);
hr=OleSetContainedObject(lpObject, TRUE);
if( FAILED(hr) ) _com_issue_error(hr);
_bstr_t bstrPath((LPCTSTR)strFile);
hr = ptrAnimatePic->Load(bstrPath);
ptrAnimatePic->PutText((LPCTSTR)strText);
if( FAILED(hr) ) _com_issue_error(hr);
hr=lpObject->GetUserClassID(&clsid);
if( FAILED(hr) ) _com_issue_error(hr);
reobject.clsid = clsid;
reobject.cp = REO_CP_SELECTION;
reobject.dvaspect = DVASPECT_CONTENT;
reobject.dwFlags = REO_BELOWBASELINE;
reobject.dwUser = 0;
reobject.poleobj = lpObject;
reobject.polesite = lpClientSite;
reobject.pstg = lpStorage;
SIZEL sizel={0,0};
reobject.sizel = sizel;
hr=lpRichEditOle->InsertObject(&reobject);
}
catch( _com_error e )
{
LPCTSTR lpszErrMessage=e.ErrorMessage();
}
}while(FALSE);
if(lpObject)
lpObject->Release();
if(lpLockBytes)
lpLockBytes->Release();
if(lpClientSite)
lpClientSite->Release();
if(lpRichEditOle)
lpRichEditOle->Release();
}
UP
参考例子:
http://www.codeproject.com/richedit/COleRichEditCtrl.asp
不需要写任何东西
vc下建个ocx 选默认的选项
编译 把它放在一个dialog上 加变量 会生成一个类基于Cwnd的
将该类引入工程 在需要的地方 声明变量
然后象窗口一样create就行了。
up,被抢先了
关键在于 IRichEditOleCallback