描述:
先谈谈我的理解:
基本的实现方法是: GetIRichEditOle()->InsertObject( REOBJECT *reobj );
关于这个reobj :
reobj.cbStruct = sizeof REOBJECT;
reobj.clsid = clsid_ole; // CLSID of IOleObject
reobj.cp = REO_CP_SELECTION;
reobj.dvaspect = DVASPECT_CONTENT;
reobj.poleobj = m_lpObject; // a piont to IOleObject
reobj.polesite = pOleClientSite; //GetIRichEditOle()->GetClientSite();
reobj.pstg = y.pstg;
至于这个reobj.pstg ? 直接使用 QueryInterface 么?
可能是这样的方式:
LPLOCKBYTES lpLockBytes = NULL;
SCODE sc;
IStorage *pStorage;
sc = ::CreateILockBytesOnHGlobal(NULL, TRUE, &lpLockBytes);
if (sc != S_OK)
AfxThrowOleException(sc);
ASSERT(lpLockBytes != NULL);
sc = ::StgCreateDocfileOnILockBytes(lpLockBytes,
STGM_SHARE_EXCLUSIVE|STGM_CREATE|STGM_READWRITE, 0, &pStorage);
if (sc != S_OK)
{
VERIFY(lpLockBytes->Release() == 0);
lpLockBytes = NULL;
AfxThrowOleException(sc);
}
ASSERT(pStorage != NULL);
这样可能能够把这个对象插入到CRichEditCtrl,但是它不是一直想bmp这个的系统预定义文件对象,它有UI,还有交互,它是谁呢?它是一个gif播放的控件,这个是它的一个接口的定义:
// Generated .IDL file (by the OLE/COM Object Viewer)
//
// typelib filename: ImageOle.dll
[
uuid(710993A2-4F87-41D7-B6FE-F5A20368465F),
version(1.0),
helpstring("ImageOle 1.0 Type Library")
]
library ImageOleLib
{
// TLib : // TLib : OLE Automation : {00020430-0000-0000-C000-000000000046}
importlib("stdole2.tlb");
// Forward declare all types defined in this typelib
interface IGifAnimator;
[
uuid(06ADA938-0FB0-4BC0-B19B-0A38AB17F182),
helpstring("GifAnimator Class")
]
coclass GifAnimator {
[default] interface IGifAnimator;
};
[
odl,
uuid(0C1CF2DF-05A3-4FEF-8CD4-F5CFC4355A16),
helpstring("IGifAnimator Interface"),
dual,
nonextensible,
oleautomation
]
interface IGifAnimator : IDispatch {
[id(0x00000001), helpstring("method LoadFromFile")]
HRESULT LoadFromFile([in] BSTR FileName);
[id(0x00000002), helpstring("method TriggerFrameChange")]
HRESULT TriggerFrameChange([out, retval] VARIANT_BOOL* pbChanged);
[id(0x00000003), helpstring("method GetFilePath")]
HRESULT GetFilePath([out, retval] BSTR* pFilePath);
[id(0x00000004), helpstring("method ShowText")]
HRESULT ShowText([in] BSTR Text);
};
};
它还实现了其他作为一个ActiveX应该实现的其他的接口,它是谁呢?
/////////////////////////////////////////////////////////////////////////////////////
You can find her here : %Program files%\Tencent\qq\ImageOle.dll
/////////////////////////////////////////////////////////////////////////////////////
它是来自QQ的一个播放gif的控件,我已经用ActiveX Control Test Container测试过了它,它显示并播放gif的步骤是:
m_CurrentGifAnimator->LoadFromFile(strFileName);
然后通过一个固定的频率调用 m_CurrentGifAnimator->TriggerFrameChange(); 实现动画的播放。
我读过了Insert any bitmap into a richeditctrl的代码
觉得,相比这个来说,那个简单得多可以很好的得到IStorage,也不需要后期的控制,只要一个IOleObject就行了。
现在我们回我们的问题上来,首先得得到 IGifAnimator, IOleObject其他的我就不知道了。
还有,是不是还有得到IStorage?还有Create... From ...?
然后激活它的ui,可能在每次调用m_CurrentGifAnimator->TriggerFrameChange();后还得刷新(测试知)
所有的细节我不是很清楚。现在关于纯OLE的资料不是很好找。希望那位com大师,能给我讲讲,最好写好了给我一份代码,我弄了好长的时间了。不胜感激。
测试文件可以从你的qq目录下获得。
dtianx@hotmail.com
您可能想查找下面的文章:
- QQ图文发送方式?可否将OCX控件当作OLE对象插入CRichEditCtrl?ADO如何读取XML中的记录集?寻求技术高人请进
- 想做一个可插入到CRichEditCtrl中显示GIF动画的组件,遇到点问题,请朋友们帮忙指点谢谢
- ATL做的一个控件,用于插入到CRichEditCtrl中显示GIF图片,控件中用一个线程显示GIF图片,
- ATL写的ActiveX控件,在CRichEditCtrl容器里怎样控制ActiveX大小?
- 如何开发一个OLE组件,可以插入到OLE容器中使用比如插入CRichEditCtrl?
- 急问:CRichEditCtrl中StreamOut用法出错的问题???????????????
- CRichEditCtrl插入ole图片与Ctrl+V插入图片不一样??
- 请教CRichEditCtrl修改字间距问题
- CRichEditCtrl和数据库交互!
- CRichEditCtrl里无窗口的控件怎么添加窗口提示?