C++ 编写 CorelDRAW CPG 插件例子(1)—WelcomeScreen
据我所知,这是国外论坛最早的一个例子,原贴在此: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相关推荐
- CDR插件开发之CPG插件016 -【实例】在CPG插件中动态导出图像到临时文件夹
在上篇文章中,讲解了文档事件在CPG插件中的开发方式和使用例子.本文在文档事件的基础上,编写一个实用的例子:当文档打开后,自动导出当前页面的图像到系统临时文件夹下面的子文件夹中,子文件夹按照日期动态创 ...
- 编写一个VSCode插件
原文链接: 编写一个VSCode插件 - 愧怍的小站 自从使用过 VSCode 后就再也离不开 VSCode,其轻量的代码编辑器与诸多插件让多数开发者爱不释手.同样我也不例外,一年前的我甚至还特意买本 ...
- 编写Android Studio插件
一.概述 相信大家在使用Android Studio的时候,或多或少的会使用一些插件,适当的配合插件可以帮助我们提升一定的开发效率,更加快乐.例如: https://github.com/zzz405 ...
- CDR插件开发之CPG插件001 - 什么是CPG插件
CPG,英文缩写 Corel Plugin,中文含义是 Corel 插件,简称CPG插件,典型代表有魔镜.CDR是鼎鼎大名的创意图形设计软件,几乎是广告.印刷行业的标准,而正是由于CDR在日常的排版. ...
- CDR插件开发之CPG插件017 - 在VS2019中实现CPG插件调试(自动写入CPG、自动启动CDR)
在上篇文章中,讲解了图像导出实例:当文档打开后,自动导出当前页面的图像到系统临时文件夹.在之前的CPG插件开发过程中,每次都需要先编写代码.再编译生成CPG,将生成的CPG文件拷贝到CDR所在目录,启 ...
- CDR插件开发之CPG插件003 - 使用VS2019编译CDR类型库 VGCoreAuto.tlb
在上篇文章中讲到了CPG插件环境的搭建,实际上主要是使用VS2019这个集成开发环境.由于要使用C++语言环境,因此在安装VS2019的过程中勾选了C++桌面开发环境.CDR软件环境请自行安装X4.X ...
- CDR插件开发之CPG插件006 - 怎么实现一个CPG插件类(上篇)
上篇文章讲到通过暴露 AttachPlugin 函数,使得编译后的CPG插件可以被CDR成功调用,弹出了消息框.然而这个CPG插件,还没有获得CDR提供的编程能力,因为它只有一行实现代码.即便如此,这 ...
- 编写一个GStreamer插件
前面章节对GStreamer做了概述,不过我们最终用到主要是插件,下面我们对插件做一个简单介绍,大部分内容都是copy的,并非原创,主要用于学习记录,英文好的可以看官方文档,我和官方校对过,翻译的大体 ...
- 从零开始编写一个vue插件
title: 从零开始编写一个vue插件 toc: true date: 2018-12-17 10:54:29 categories: Web tags: vue mathjax 写毕设的时候需要一 ...
- 如何编写一个Jquery插件
首先我们来搞清楚一些关于Jquery插件的知识: 一.插件的种类: 封装对象方法的插件 这种插件是将对象方法封装起来,用于对通过选择器获取的jQuery对象进行操作,是最常见的一种插件 封装全局函数的 ...
最新文章
- 调查显示:手机单芯片处理器作用日显重要
- unity调用 Android 分享图片文字 方法 不需要第三方sdk 兼容android7.0+
- 设计模式示例_代理设计模式示例
- YY:马化腾的大漏招
- 广电总局拟规定设立未成年人频道
- nested exception is java.lang.NoClassDefFoundError: org/codehaus/jettison/json/JSONObject异常的解决办法
- C++基础——tricks,让人惊艳的那些代码
- i9-10900K比9900K性能提升了多少?i9-10900K和i9-9900K区别对比评测
- bin文件用cad打开_bin文件怎么打开?实测可靠方法
- 比较复杂的sql面试题
- xpath获取同级元素 子元素,子元素取父元素等
- 【回归分析】[3]--回归方程的显著性检验
- drupal主题_50个精心挑选的美丽Drupal 6个主题
- 激荡三十年:银行数据库的发展与变迁
- jboss启动oracle表不存在,JBoss的部署及运行
- Arduino框架下对ESP32 NVS非易失性存储解读以及应用示例
- win11蓝牙无法使用 Windows11蓝牙无法使用的解决方法
- 数字图像处理第四版胡学龙著课后习题
- 网络安全篇 防火墙技术的介绍-01
- iss信息服务器,配置iss服务器
热门文章
- android http 本地 web服务(tomcat)
- 有关Silverlight ChildWindow组件(子窗体组件)的研究——Silverlight学习笔记(2)...
- 阿里面试官:LongAdder和AtomicLong哪个性能更好?我有点懵~
- 千万级用户-亿级请求的平台架构演变
- 全站HTTPS来了!有何优势、与HTTP有何不同
- 英特尔、高通等禁止员工与华为私下交流
- 再也回不去的 GitHub。。。
- python基础之模块初识
- P1052 过河 线性dp
- Linux安装Tomcat-Nginx-FastDFS-Redis-Solr-集群——【第十集之Nginx反向代理原理】(有参考其他文章)...