据我所知,这是国外论坛最早的一个例子,原贴在此: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("GetCommandLine", "VGGetCommandLine") \
  7             rename("CopyFile", "VGCore") \
  8             rename("FindWindow", "VGFindWindow")
  9
 10 // For Visual Studio 2005
 11 /*
 12 #import "libid:95E23C91-BC5A-49F3-8CD1-1FC515597048" version("d.0") \
 13             rename("GetCommandLine", "VGGetCommandLine") \
 14             rename("CopyFile", "VGCore") \
 15             rename("FindWindow", "VGFindWindow")
 16 */
 17
 18 static HINSTANCE g_hResource = NULL;
 19
 20 BOOL APIENTRY DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
 21 {
 22   if(fdwReason == DLL_PROCESS_ATTACH)
 23   {
 24     g_hResource = (HINSTANCE)hinstDLL;
 25   }
 26   return TRUE;
 27 }
 28
 29 class CWelcomeScreenPlugin : public VGCore::IVGAppPlugin
 30 {
 31 private:
 32   VGCore::IVGApplication *m_pApp;
 33   volatile ULONG m_ulRefCount;
 34   long m_lCookie;
 35
 36   static INT_PTR CALLBACK DlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
 37   void OnAppStart();
 38
 39 public:
 40   CWelcomeScreenPlugin();
 41
 42 // IUnknown
 43 public:
 44   STDMETHOD(QueryInterface)(REFIID riid, void **ppvObject);
 45   STDMETHOD_(ULONG, AddRef)(void) { return ++m_ulRefCount; }
 46   STDMETHOD_(ULONG, Release)(void)
 47   {
 48     ULONG ulCount = --m_ulRefCount;
 49     if(ulCount == 0)
 50     {
 51       delete this;
 52     }
 53     return ulCount;
 54   }
 55
 56 // IDispatch
 57 public:
 58   STDMETHOD(GetTypeInfoCount)(UINT *pctinfo) { return E_NOTIMPL; }
 59   STDMETHOD(GetTypeInfo)(UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo) { return E_NOTIMPL; }
 60   STDMETHOD(GetIDsOfNames)(REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId) { return E_NOTIMPL; }
 61   STDMETHOD(Invoke)(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr);
 62
 63 // IVGAppPlugin
 64 public:
 65   STDMETHOD(raw_OnLoad)(VGCore::IVGApplication *Application);
 66   STDMETHOD(raw_StartSession)();
 67   STDMETHOD(raw_StopSession)();
 68   STDMETHOD(raw_OnUnload)();
 69 };
 70
 71 CWelcomeScreenPlugin::CWelcomeScreenPlugin()
 72 {
 73   m_pApp = NULL;
 74   m_lCookie = 0;
 75   m_ulRefCount = 1;
 76 }
 77
 78 STDMETHODIMP CWelcomeScreenPlugin::QueryInterface(REFIID riid, void **ppvObject)
 79 {
 80   HRESULT hr = S_OK;
 81   m_ulRefCount++;
 82   if(riid == IID_IUnknown)
 83   {
 84     *ppvObject = (IUnknown *)this;
 85   }
 86   else if(riid == IID_IDispatch)
 87   {
 88     *ppvObject = (IDispatch *)this;
 89   }
 90   else if(riid == __uuidof(VGCore::IVGAppPlugin))
 91   {
 92     *ppvObject = (VGCore::IVGAppPlugin *)this;
 93   }
 94   else
 95   {
 96     m_ulRefCount--;
 97     hr = E_NOINTERFACE;
 98   }
 99   return hr;
100 }
101
102 STDMETHODIMP CWelcomeScreenPlugin::Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
103 {
104   switch(dispIdMember)
105   {
106     case 0x0012: //DISPID_APP_START
107       OnAppStart();
108       break;
109   }
110   return S_OK;
111 }
112
113 STDMETHODIMP CWelcomeScreenPlugin::raw_OnLoad(VGCore::IVGApplication *Application)
114 {
115   m_pApp = Application;
116   if(m_pApp)
117   {
118     m_pApp->AddRef();
119   }
120   return S_OK;
121 }
122
123 STDMETHODIMP CWelcomeScreenPlugin::raw_StartSession()
124 {
125   try
126   {
127     m_lCookie = m_pApp->AdviseEvents(this);
128   }
129   catch(_com_error &e)
130   {
131     MessageBox(NULL, e.Description(), "Error", MB_ICONSTOP);
132   }
133   return S_OK;
134 }
135
136 STDMETHODIMP CWelcomeScreenPlugin::raw_StopSession()
137 {
138   try
139   {
140     m_pApp->UnadviseEvents(m_lCookie);
141   }
142   catch(_com_error &e)
143   {
144     MessageBox(NULL, e.Description(), "Error", MB_ICONSTOP);
145   }
146   return S_OK;
147 }
148
149 STDMETHODIMP CWelcomeScreenPlugin::raw_OnUnload()
150 {
151   if(m_pApp)
152   {
153     m_pApp->Release();
154     m_pApp = NULL;
155   }
156   return S_OK;
157 }
158
159 void CWelcomeScreenPlugin::OnAppStart()
160 {
161   try
162   {
163     m_pApp->StartupMode = VGCore::cdrStartupDoNothing;
164     // To avoid 64 bit portability warning, store the long handle value into an INT_PTR
165     // before casting it to HWND:
166     INT_PTR nHandle = m_pApp->AppWindow->Handle;
167     HWND hAppWnd = reinterpret_cast<HWND>(nHandle);
168     INT_PTR nRet = DialogBoxParam(g_hResource, MAKEINTRESOURCE(IDD_WELCOME), hAppWnd, DlgProc, (LPARAM)this);
169     switch(nRet)
170     {
171     case IDC_NEWDOC:
172       m_pApp->CreateDocument();
173       break;
174
175     case IDC_LASTDOC:
176       if(m_pApp->RecentFiles->Count > 0)
177       {
178         m_pApp->OpenDocument(m_pApp->RecentFiles->Item[1]->FullName, 0);
179       }
180       else
181       {
182         MessageBox(NULL, "No documents were editied yet.", "Error", MB_ICONSTOP);
183       }
184       break;
185     }
186   }
187   catch(_com_error &e)
188   {
189     MessageBox(NULL, e.Description(), "Error", MB_ICONSTOP);
190   }
191 }
192
193 INT_PTR CALLBACK CWelcomeScreenPlugin::DlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
194 {
195   if(uMsg == WM_COMMAND)
196   {
197     switch(LOWORD(wParam))
198     {
199       case IDC_NEWDOC:
200         EndDialog(hDlg, IDC_NEWDOC);
201         break;
202
203       case IDC_LASTDOC:
204         EndDialog(hDlg, IDC_LASTDOC);
205         break;
206
207       case IDOK:
208       case IDCANCEL:
209         EndDialog(hDlg, 0);
210         break;
211     }
212   }
213   else if(uMsg == WM_INITDIALOG)
214   {
215     return 1;
216   }
217   return 0;
218 }
219
220 extern "C" __declspec(dllexport) DWORD APIENTRY AttachPlugin(VGCore::IVGAppPlugin **ppIPlugin)
221 {
222   *ppIPlugin = new CWelcomeScreenPlugin;
223   return 0x100;
224 }

下载:

WelcomeScreen_Src.zip
WelcomeScreen_cpg.zip

转载于:https://www.cnblogs.com/o594cql/p/4480669.html

C++ 编写 CorelDRAW CPG 插件例子(1)—WelcomeScreen相关推荐

  1. CDR插件开发之CPG插件016 -【实例】在CPG插件中动态导出图像到临时文件夹

    在上篇文章中,讲解了文档事件在CPG插件中的开发方式和使用例子.本文在文档事件的基础上,编写一个实用的例子:当文档打开后,自动导出当前页面的图像到系统临时文件夹下面的子文件夹中,子文件夹按照日期动态创 ...

  2. 编写一个VSCode插件

    原文链接: 编写一个VSCode插件 - 愧怍的小站 自从使用过 VSCode 后就再也离不开 VSCode,其轻量的代码编辑器与诸多插件让多数开发者爱不释手.同样我也不例外,一年前的我甚至还特意买本 ...

  3. 编写Android Studio插件

    一.概述 相信大家在使用Android Studio的时候,或多或少的会使用一些插件,适当的配合插件可以帮助我们提升一定的开发效率,更加快乐.例如: https://github.com/zzz405 ...

  4. CDR插件开发之CPG插件001 - 什么是CPG插件

    CPG,英文缩写 Corel Plugin,中文含义是 Corel 插件,简称CPG插件,典型代表有魔镜.CDR是鼎鼎大名的创意图形设计软件,几乎是广告.印刷行业的标准,而正是由于CDR在日常的排版. ...

  5. CDR插件开发之CPG插件017 - 在VS2019中实现CPG插件调试(自动写入CPG、自动启动CDR)

    在上篇文章中,讲解了图像导出实例:当文档打开后,自动导出当前页面的图像到系统临时文件夹.在之前的CPG插件开发过程中,每次都需要先编写代码.再编译生成CPG,将生成的CPG文件拷贝到CDR所在目录,启 ...

  6. CDR插件开发之CPG插件003 - 使用VS2019编译CDR类型库 VGCoreAuto.tlb

    在上篇文章中讲到了CPG插件环境的搭建,实际上主要是使用VS2019这个集成开发环境.由于要使用C++语言环境,因此在安装VS2019的过程中勾选了C++桌面开发环境.CDR软件环境请自行安装X4.X ...

  7. CDR插件开发之CPG插件006 - 怎么实现一个CPG插件类(上篇)

    上篇文章讲到通过暴露 AttachPlugin 函数,使得编译后的CPG插件可以被CDR成功调用,弹出了消息框.然而这个CPG插件,还没有获得CDR提供的编程能力,因为它只有一行实现代码.即便如此,这 ...

  8. 编写一个GStreamer插件

    前面章节对GStreamer做了概述,不过我们最终用到主要是插件,下面我们对插件做一个简单介绍,大部分内容都是copy的,并非原创,主要用于学习记录,英文好的可以看官方文档,我和官方校对过,翻译的大体 ...

  9. 从零开始编写一个vue插件

    title: 从零开始编写一个vue插件 toc: true date: 2018-12-17 10:54:29 categories: Web tags: vue mathjax 写毕设的时候需要一 ...

  10. 如何编写一个Jquery插件

    首先我们来搞清楚一些关于Jquery插件的知识: 一.插件的种类: 封装对象方法的插件 这种插件是将对象方法封装起来,用于对通过选择器获取的jQuery对象进行操作,是最常见的一种插件 封装全局函数的 ...

最新文章

  1. 调查显示:手机单芯片处理器作用日显重要
  2. unity调用 Android 分享图片文字 方法 不需要第三方sdk 兼容android7.0+
  3. 设计模式示例_代理设计模式示例
  4. YY:马化腾的大漏招
  5. 广电总局拟规定设立未成年人频道
  6. nested exception is java.lang.NoClassDefFoundError: org/codehaus/jettison/json/JSONObject异常的解决办法
  7. C++基础——tricks,让人惊艳的那些代码
  8. i9-10900K比9900K性能提升了多少?i9-10900K和i9-9900K区别对比评测
  9. bin文件用cad打开_bin文件怎么打开?实测可靠方法
  10. 比较复杂的sql面试题
  11. xpath获取同级元素 子元素,子元素取父元素等
  12. 【回归分析】[3]--回归方程的显著性检验
  13. drupal主题_50个精心挑选的美丽Drupal 6个主题
  14. 激荡三十年:银行数据库的发展与变迁
  15. jboss启动oracle表不存在,JBoss的部署及运行
  16. Arduino框架下对ESP32 NVS非易失性存储解读以及应用示例
  17. win11蓝牙无法使用 Windows11蓝牙无法使用的解决方法
  18. 数字图像处理第四版胡学龙著课后习题
  19. 网络安全篇 防火墙技术的介绍-01
  20. iss信息服务器,配置iss服务器

热门文章

  1. android http 本地 web服务(tomcat)
  2. 有关Silverlight ChildWindow组件(子窗体组件)的研究——Silverlight学习笔记(2)...
  3. 阿里面试官:LongAdder和AtomicLong哪个性能更好?我有点懵~
  4. 千万级用户-亿级请求的平台架构演变
  5. 全站HTTPS来了!有何优势、与HTTP有何不同
  6. 英特尔、高通等禁止员工与华为私下交流
  7. 再也回不去的 GitHub。。。
  8. python基础之模块初识
  9. P1052 过河 线性dp
  10. Linux安装Tomcat-Nginx-FastDFS-Redis-Solr-集群——【第十集之Nginx反向代理原理】(有参考其他文章)...