GifOleControl 可插入圖片,包括BMP、jpg、png等,圖片大小不限,重點是可以在richedit中插入gif動畫,暫不支援插入SWF格式。同時可以在插入的圖片、gif中直接顯示tooltip,方便應用。
GifOleControl 定義的介面如下
interface IGifCtrl : IDispatch{
[propput, bindable, requestedit, id(DISPID_BORDERCOLOR)]
HRESULT BorderColor([in]OLE_COLOR clr);
[propget, bindable, requestedit, id(DISPID_BORDERCOLOR)]
HRESULT BorderColor([out, retval]OLE_COLOR* pclr);
[propget, bindable, requestedit, id(DISPID_HWND)]
HRESULT HWND([out, retval]LONG_PTR* pHWND);
[id(1), helpstring("方法LoadFromFile")] HRESULT LoadFromFile([in] BSTR bstrFileName);
[id(2), helpstring("方法LoadFromFileSized")] HRESULT LoadFromFileSized([in] BSTR bstrFileName, [in] INT nHeight);
[id(3)] HRESULT GetRECT( [out] RECT *rc );
[id(4)] HRESULT ShowHint( );
[id(5)] HRESULT SetHostWindow( [in] long hwndHostWindow, [in] INT nNotyfyMode );
[id(6)] HRESULT LoadFlash( [in] BSTR bstrFileName, [in] BSTR bstrFlashVars, [in] INT nWidth, [in] INT nHeight );
[id(7)] HRESULT SetTooltip( [in] BSTR bstrHint);
[id(8)] HRESULT GetTooltip( [out, retval] BSTR * bstrHint);
[id(9)] HRESULT GetFilePath( [out, retval] BSTR * bstPath);
};
通過匯入ActiveX後產生的類:
/////////////////////////////////////////////////////////////////////////////<br />// CGifCtrl wrapper class</p><p>class CGifCtrl : public CWnd<br />{<br />protected:<br /> DECLARE_DYNCREATE(CGifCtrl)<br />public:<br /> CLSID const& GetClsid()<br /> {<br /> static CLSID const clsid<br /> = { 0xc44ec05f, 0x86a8, 0x410c, { 0xba, 0xcd, 0xf8, 0xdd, 0x18, 0x6c, 0xfc, 0x46 } };<br /> return clsid;<br /> }<br /> virtual BOOL Create(LPCTSTR lpszClassName,<br /> LPCTSTR lpszWindowName, DWORD dwStyle,<br /> const RECT& rect,<br /> CWnd* pParentWnd, UINT nID,<br /> CCreateContext* pContext = NULL)<br /> { return CreateControl(GetClsid(), lpszWindowName, dwStyle, rect, pParentWnd, nID); }</p><p> BOOL Create(LPCTSTR lpszWindowName, DWORD dwStyle,<br /> const RECT& rect, CWnd* pParentWnd, UINT nID,<br /> CFile* pPersist = NULL, BOOL bStorage = FALSE,<br /> BSTR bstrLicKey = NULL)<br /> { return CreateControl(GetClsid(), lpszWindowName, dwStyle, rect, pParentWnd, nID,<br /> pPersist, bStorage, bstrLicKey); }</p><p>// Attributes<br />public:</p><p>// Operations<br />public:<br /> void SetBorderColor(unsigned long newValue);<br /> unsigned long GetBorderColor();<br /> long GetHwnd();<br /> void LoadFromFile(LPCTSTR bstrFileName);<br /> void LoadFromFileSized(LPCTSTR bstrFileName, long nHeight);<br /> // method 'GetRECT' not emitted because of invalid return type or parameter type<br /> // method 'OnMsg' not emitted because of invalid return type or parameter type<br /> void ShowHint();<br /> void SetHostWindow(long hwndHostWindow, long nNotyfyMode);<br /> void LoadFlash(LPCTSTR bstrFileName, LPCTSTR bstrFlashVars, long nWidth, long nHeight);<br /> void SetTooltip(LPCTSTR bstrHint);<br /> CString GetTooltip();<br /> CString GetFilePath();<br />};<br />
通過該COM組件,demo如下:
下面介紹控制項的使用方法,包括兩種形式:1、在對話方塊中使用;2、在RichEdit中使用。
1、在對話方塊中使用:
首先註冊控制項GifOleControl .dll,將GifOleControl .dll拷貝到系統目錄下,然後使用命令regsvr32 GifOleControl .dll註冊控制項。
在對話方塊資源編輯器中,右擊並選擇“插入ActiveX控制項”,選擇“Gifctrl class”,插入本控制項。然後在插入的ActiveX控制項上右擊,並選擇“添加變數”,產生對應的封裝類和對應的執行個體,這樣就可以調用對象的方法了。
2、 在RichEdit中使用
在RichEdit中使用的方法和上篇文章中的方法基本相同,只需替換調對應的類和函數調用即可。但是在這裡,可以直接使用介面和介面GUID的定義。具體的代碼如下
IRichEditOle *lpRichEditOle = m_rich.GetIRichEditOle();<br />if (NULL == lpRichEditOle)<br />{<br />return ;<br />}</p><p>IStorage* lpStorage = NULL;<br />IOleObject* lpOleObject = NULL;<br />LPLOCKBYTES lpLockBytes = NULL;<br />IOleClientSite* lpOleClientSite = NULL;<br />IGifCtrl *lpDynamicGif = NULL;<br />CLSID clsid;<br />REOBJECT reobject;</p><p>HRESULT hr; </p><p>hr = ::CoCreateInstance(CLSID_GifCtrl,0,CLSCTX_INPROC,<br />IID_IGifCtrl,<br />(LPVOID*)&lpDynamicGif);</p><p>int n = GetLastError();<br />if( lpDynamicGif == NULL )<br />{</p><p>return ;<br /> }</p><p> if (FAILED(hr))<br /> {</p><p>return ;<br /> }<br /> CString szPath = m_path;//("c://21.gif");<br /> BSTR path = szPath.AllocSysString();<br />try<br /> {<br />try<br />{<br />lpDynamicGif->LoadFromFile(path);<br />BSTR p= lpDynamicGif->GetFilePath();</p><p>}<br />catch (...)<br />{<br />AfxThrowOleException(hr);<br />}</p><p>if (FAILED(hr))<br />{<br />AfxThrowOleException(hr);<br /> }//擷取OLE對象介面</p><p> hr = lpDynamicGif->QueryInterface(IID_IOleObject,(void**)&lpOleObject);<br /> if (FAILED(hr))<br /> {<br />AfxThrowOleException(hr);<br /> }<br />OleSetContainedObject(lpOleObject,TRUE);<br /> //擷取CLSID<br /> hr = lpOleObject->GetUserClassID(&clsid);<br /> if (FAILED(hr))<br /> {<br />AfxThrowOleException(hr);<br /> }</p><p> hr = ::CreateILockBytesOnHGlobal(NULL,TRUE,&lpLockBytes); //建立LOCKBYTE對象<br /> if (FAILED(hr))<br /> {<br /> AfxThrowOleException(hr);<br /> }<br /> ASSERT(lpLockBytes != NULL);<br /> hr = ::StgCreateDocfileOnILockBytes(lpLockBytes,<br />STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE,<br />0,&lpStorage);<br /> if (FAILED(hr))<br /> {<br /> VERIFY(lpLockBytes->Release() == 0);<br /> lpLockBytes = NULL;<br /> AfxThrowOleException(hr);<br /> }<br /> OleSetContainedObject(lpOleObject,TRUE);<br /> lpRichEditOle->GetClientSite(&lpOleClientSite);<br /> ZeroMemory(&reobject,sizeof(REOBJECT)); //初始化一對象<br /> reobject.cbStruct = sizeof(REOBJECT);<br /> reobject.clsid = clsid;<br /> reobject.cp = REO_CP_SELECTION;<br /> reobject.dvaspect = DVASPECT_CONTENT;<br /> reobject.dwFlags = REO_BELOWBASELINE;<br /> reobject.poleobj = lpOleObject;<br /> reobject.polesite = lpOleClientSite;<br /> reobject.pstg = lpStorage;<br />reobject.dwUser = (DWORD)lpDynamicGif;</p><p>lpOleObject->SetClientSite(lpOleClientSite);<br />lpDynamicGif->SetHostWindow((long)m_rich.GetSafeHwnd(), 1);</p><p>lpOleObject->DoVerb(OLEIVERB_SHOW, NULL, lpOleClientSite, -1, m_hWnd, NULL);</p><p>CString szPath2("22222222222");</p><p>BSTR path2 = szPath2.AllocSysString();</p><p>lpDynamicGif->SetTooltip(path2); // 設定GIF的toolt</p><p>lpDynamicGif->ShowHint();</p><p>szPath2.AllocSysString();<br /> hr = lpRichEditOle->InsertObject(&reobject);</p><p> if (FAILED(hr))<br /> {<br /> AfxThrowOleException(hr);<br /> }</p><p> RedrawWindow(); //重新整理表單</p><p> }<br /> catch (CException* e)<br /> {<br /> e->Delete();<br /> }</p><p>lpRichEditOle->Release();<br />lpRichEditOle = NULL;
DEMO下載:http://sv004d.mofile.com/7125120180791962/RGlzazEvNTQvNTQyNzI4MTQyMC83Lzc0OTQ0NjQwNjA4NjQ1Nw../TestGif.rar