这是另一个例子;

贴上主要代码:

  1 #include "stdafx.h"
  2 #include <tchar.h>
  3 
  4 #import "libid:95E23C91-BC5A-49F3-8CD1-1FC515597048" version("d.0") \
  5       rename("GetCommandLine", "VGGetCommandLine") \
  6       rename("CopyFile", "VGCore") \
  7       rename("FindWindow", "VGFindWindow")
  8 
  9 #ifdef _MANAGED
 10 #pragma managed(push, off)
 11 #endif
 12 
 13 BOOL APIENTRY DllMain( HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved )
 14 {
 15   switch (fdwReason)
 16   {
 17     case DLL_PROCESS_ATTACH:
 18     case DLL_THREAD_ATTACH:
 19     case DLL_THREAD_DETACH:
 20     case DLL_PROCESS_DETACH:
 21       break;
 22   }
 23   return TRUE;
 24 }
 25 
 26 #ifdef _MANAGED
 27 #pragma managed(pop)
 28 #endif
 29 
 30 class CVGAppPlugin : public VGCore::IVGAppPlugin
 31 {
 32 private:
 33   VGCore::IVGApplication *m_pApp;
 34   ULONG m_ulRefCount;
 35   long m_lCookie;
 36   bool m_bEnabled;
 37 
 38   bool CheckSelection();
 39   void OnClearFill();
 40 
 41 public:
 42   CVGAppPlugin();
 43 
 44 // IUnknown
 45 public:
 46   STDMETHOD(QueryInterface)(REFIID riid, void **ppvObject);
 47   STDMETHOD_(ULONG, AddRef)(void) { return ++m_ulRefCount; }
 48   STDMETHOD_(ULONG, Release)(void) 
 49   {
 50     ULONG ulCount = --m_ulRefCount; 
 51     if(ulCount == 0)
 52     {
 53       delete this;
 54     }
 55     return ulCount;
 56   }
 57 
 58 // IDispatch
 59 public:
 60   STDMETHOD(GetTypeInfoCount)(UINT *pctinfo) { return E_NOTIMPL; }
 61   STDMETHOD(GetTypeInfo)(UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo) { return E_NOTIMPL; }
 62   STDMETHOD(GetIDsOfNames)(REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId) { return E_NOTIMPL; }
 63   STDMETHOD(Invoke)(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr);
 64 
 65 // IVGAppPlugin
 66 public:
 67   STDMETHOD(raw_OnLoad)(VGCore::IVGApplication *Application);
 68   STDMETHOD(raw_StartSession)();
 69   STDMETHOD(raw_StopSession)();
 70   STDMETHOD(raw_OnUnload)();
 71 };
 72 
 73 bool CVGAppPlugin::CheckSelection()
 74 {
 75   bool bRet = false;
 76   if(m_pApp->Documents->Count > 0)
 77   {
 78     bRet = (m_pApp->ActiveSelection->Shapes->Count > 0);
 79   }
 80   return bRet;
 81 }
 82 
 83 void CVGAppPlugin::OnClearFill()
 84 {
 85   if(CheckSelection())
 86   {
 87     m_pApp->ActiveSelection->Fill->ApplyNoFill();
 88   }
 89 }
 90 
 91 CVGAppPlugin::CVGAppPlugin() :
 92   m_pApp(NULL),
 93   m_lCookie(0),
 94   m_ulRefCount(1),
 95   m_bEnabled(false)
 96 {
 97 }
 98 
 99 STDMETHODIMP CVGAppPlugin::QueryInterface(REFIID riid, void **ppvObject)
100 {
101   HRESULT hr = S_OK;
102   m_ulRefCount++;
103   if(riid == IID_IUnknown)
104   {
105     *ppvObject = (IUnknown *)this;
106   }
107   else if(riid == IID_IDispatch)
108   {
109     *ppvObject = (IDispatch *)this;
110   }
111   else if(riid == __uuidof(VGCore::IVGAppPlugin))
112   {
113     *ppvObject = (VGCore::IVGAppPlugin *)this;
114   }
115   else
116   {
117     m_ulRefCount--;
118     hr = E_NOINTERFACE;
119   }
120   return hr;
121 }
122 
123 STDMETHODIMP CVGAppPlugin::Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
124 {
125   switch(dispIdMember)
126   {
127     case 0x0011: //DISPID_APP_SELCHANGE
128       m_bEnabled = CheckSelection();
129       break;
130 
131     case 0x0014: // DISPID_APP_ONPLUGINCMD
132       if(pDispParams != NULL && pDispParams->cArgs == 1)
133       {
134         _bstr_t strCmd(pDispParams->rgvarg[0].bstrVal);
135         if(strCmd == _bstr_t("ClearFill"))
136         {
137           OnClearFill();
138         }
139       }
140       break;
141 
142     case 0x0015: // DISPID_APP_ONPLUGINCMDSTATE
143       if(pDispParams != NULL && pDispParams->cArgs == 3)
144       {
145         _bstr_t strCmd(pDispParams->rgvarg[2].bstrVal);
146         if(strCmd == _bstr_t("ClearFill"))
147         {
148           *pDispParams->rgvarg[1].pboolVal = m_bEnabled ? VARIANT_TRUE : VARIANT_FALSE;
149         }
150       }
151       break;
152   }
153   return S_OK;
154 }
155 
156 STDMETHODIMP CVGAppPlugin::raw_OnLoad(VGCore::IVGApplication *Application)
157 {
158   m_pApp = Application;
159   if(m_pApp)
160   {
161     m_pApp->AddRef();
162   }
163   return S_OK;
164 }
165 
166 STDMETHODIMP CVGAppPlugin::raw_StartSession()
167 {
168   try
169   {
170     m_pApp->AddPluginCommand(_bstr_t("ClearFill"), _bstr_t("Clear Fill"), _bstr_t("Clears fill from selected objects"));
171     VGCore::CommandBarControlPtr ctl = m_pApp->CommandBars->Item[_bstr_t("Standard")]->Controls->AddCustomButton(VGCore::cdrCmdCategoryPlugins, _bstr_t("ClearFill"), 0, VARIANT_TRUE);
172     _bstr_t bstrPath(m_pApp->Path + _bstr_t("Plugins\\ClearFill.bmp"));
173     ctl->SetCustomIcon(bstrPath);
174     m_lCookie = m_pApp->AdviseEvents(this);
175   }
176   catch(_com_error &e)
177   {
178     MessageBox(NULL, e.Description(), _T("Error"), MB_ICONSTOP);
179   }
180   return S_OK;
181 }
182 
183 STDMETHODIMP CVGAppPlugin::raw_StopSession()
184 {
185   try
186   {
187     m_pApp->UnadviseEvents(m_lCookie);
188     m_pApp->RemovePluginCommand(_bstr_t("ClearFill"));
189   }
190   catch(_com_error &e)
191   {
192     MessageBox(NULL, e.Description(), _T("Error"), MB_ICONSTOP);
193   }
194   return S_OK;
195 }
196 
197 STDMETHODIMP CVGAppPlugin::raw_OnUnload()
198 {
199   if(m_pApp)
200   {
201     m_pApp->Release();
202     m_pApp = NULL;
203   }
204   return S_OK;
205 }
206 
207 extern "C" __declspec(dllexport) DWORD APIENTRY AttachPlugin(VGCore::IVGAppPlugin **ppIPlugin)
208 {
209   *ppIPlugin = new CVGAppPlugin;
210   return 0x100;
211 }

下载:

ClearFill_src.zip
ClearFill_cpg.zip

posted on 2015-05-06 09:28  秋舞影  阅读(2799)  评论(0编辑  收藏  举报