C++ 编写 CorelDRAW CPG 插件例子(2)—ClearFill

这是另一个例子;

贴上主要代码:

  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

时间: 2024-08-09 21:54:01

C++ 编写 CorelDRAW CPG 插件例子(2)—ClearFill的相关文章

C++ 编写 CorelDRAW CPG 插件例子

据我所知,这是国外论坛最早的一个例子,原贴在此:http://forum.oberonplace.com/showthread.php?t=1880&highlight=Plugins 贴上主要代码: 1 #include "stdafx.h" 2 #include "resource.h" 3 4 // For Visual Studio 2003 5 #import "VGCoreAuto.tlb" 6 rename("Ge

学会编写Android Studio插件 别停留在用的程度了

本文为原创,授权公众号:hongyangAndroid独家代理原创发布. 转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/51548272: 本文出自:[张鸿洋的博客] 一.概述 相信大家在使用Android Studio的时候,或多或少的会使用一些插件,适当的配合插件可以帮助我们提升一定的开发效率,更加快乐.例如: https://github.com/zzz40500/GsonFormat 可以帮助我们从Gson转化为实体

如何编写一个gulp插件

很久以前,我们在"细说gulp"随笔中,以压缩JavaScript为例,详细地讲解了如何利用gulp来完成前端自动化. 再来短暂回顾下,当时除了借助gulp之外,我们还利用了第三方gulp插件”gulp-uglify”,来达到压缩JavaScript文件的目的. 代码如下: 今儿,我们的重点就是,自己也来实现一个gulp插件. 正文 其实,如果只是单纯地想要编写一个gulp插件不难,可以借助through2或者through-gulp来编写(through-gulp是基于through

JQuery编写自己的插件(七)

一:jQuery插件的编写基础1.插件的种类编写插件的目的是给一系列已经方法或函数做一个封装,以便在其他地方重复使用,方便后期维护和提高开发效率.常见的种类有以下三种:封装对象方法的插件 二:编写自己的插件1.封装jQuery对象方法的插件Step1:框架;(    function($) {    $.fn.extend({        ….        });    })(jQuery) 实例:改变背景色 ;( function($) { $.fn.extend({ "color&quo

如何自己编写一个easyui插件续

接着如何自己编写一个easyui插件继续分享一下如何从上一节写的“hello”插件继承出一个“hello2”. 参考了combobox的源码中继承combo,当然我这个简单很多了.都是根据自己的理解来写的,没有参考什么权威资料,欢迎各位看官拍砖. 1. 实现效果 点击这里在线查看增加了一个输入框,sayHello的是输入的名字. 2. 贴代码 (function ($) { function init(target) { $(target).addClass('hello2'); return

批处理bat脚本编写(附详细例子)

                                                    批处理bat脚本编写(附详细例子) 由于在项目开发的过程中经常需要编写bat脚本,而看大牛们编写的bat脚本简直一头雾水,木有办法,作为bat菜鸟的我只有通过最最简单的例子来熟悉bat脚本中的常用命令,由此来开启我的bat脚本学习之路.... 1.常用命令举例 a.创建文件夹:                         md    D:\mybat       //将在D盘下创建一个名为

如何编写一个Maven插件

如何编写一个Maven插件 本文基于eclipse ee. 建立一个maven插件工程: 主要就是让项目能依赖maven-plugin-api: 编写一个Mojo类: /** * 用于输出消息的Mojo * @goal hello */ public class HelloMojo extends AbstractMojo { /** * @parameter expression="${echo.message}" default-value="Hello Maven Wo

从零开始编写一个vue插件

title: 从零开始编写一个vue插件 toc: true date: 2018-12-17 10:54:29 categories: Web tags: vue mathjax 写毕设的时候需要一个mathjax编辑器,因此直接写一个插件试一下. 准备账号 进入npm注册账号 初始化项目 vue init webpack-simple mathjax-toolbar cd mathjax-toolbar npm install 得到的项目内的/src结构如下: src/ ├── assets

从零开始编写IntelliJ IDEA插件

写Java代码的时候,经常会涉及到重复性的操作,这个时候就会想要是有这样一个插件就好了,如果是大家都会遇到的场景,IDE或许已经提供了,再不然也有可能有人编写了相关的插件.要是这个操作是你们的编码环境特有的,那就只能自己写工具了.所以这里来学学如何编写IDEA插件,让自己的编程环境更加强大,更好的进行装逼. 开发环境 开发IDEA插件有以下这些依赖: IntelliJ IDEA Community Edition IntelliJ IDEA Community Edition 源码 Plugin