GifOleControl 1.0.2 功能說明

來源:互聯網
上載者:User

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.