C++ 编写 CorelDRAW CPG 插件例子(2)—ClearFill
这是另一个例子;
贴上主要代码:
#include "stdafx.h"
#include <tchar.h> #import "libid:95E23C91-BC5A-49F3-8CD1-1FC515597048" version("d.0") \
rename("GetCommandLine", "VGGetCommandLine") \
rename("CopyFile", "VGCore") \
rename("FindWindow", "VGFindWindow") #ifdef _MANAGED
#pragma managed(push, off)
#endif BOOL APIENTRY DllMain( HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved )
{
switch (fdwReason)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
} #ifdef _MANAGED
#pragma managed(pop)
#endif class CVGAppPlugin : public VGCore::IVGAppPlugin
{
private:
VGCore::IVGApplication *m_pApp;
ULONG m_ulRefCount;
long m_lCookie;
bool m_bEnabled; bool CheckSelection();
void OnClearFill(); public:
CVGAppPlugin(); // IUnknown
public:
STDMETHOD(QueryInterface)(REFIID riid, void **ppvObject);
STDMETHOD_(ULONG, AddRef)(void) { return ++m_ulRefCount; }
STDMETHOD_(ULONG, Release)(void)
{
ULONG ulCount = --m_ulRefCount;
if(ulCount == )
{
delete this;
}
return ulCount;
} // IDispatch
public:
STDMETHOD(GetTypeInfoCount)(UINT *pctinfo) { return E_NOTIMPL; }
STDMETHOD(GetTypeInfo)(UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo) { return E_NOTIMPL; }
STDMETHOD(GetIDsOfNames)(REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId) { return E_NOTIMPL; }
STDMETHOD(Invoke)(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr); // IVGAppPlugin
public:
STDMETHOD(raw_OnLoad)(VGCore::IVGApplication *Application);
STDMETHOD(raw_StartSession)();
STDMETHOD(raw_StopSession)();
STDMETHOD(raw_OnUnload)();
}; bool CVGAppPlugin::CheckSelection()
{
bool bRet = false;
if(m_pApp->Documents->Count > )
{
bRet = (m_pApp->ActiveSelection->Shapes->Count > );
}
return bRet;
} void CVGAppPlugin::OnClearFill()
{
if(CheckSelection())
{
m_pApp->ActiveSelection->Fill->ApplyNoFill();
}
} CVGAppPlugin::CVGAppPlugin() :
m_pApp(NULL),
m_lCookie(),
m_ulRefCount(),
m_bEnabled(false)
{
} STDMETHODIMP CVGAppPlugin::QueryInterface(REFIID riid, void **ppvObject)
{
HRESULT hr = S_OK;
m_ulRefCount++;
if(riid == IID_IUnknown)
{
*ppvObject = (IUnknown *)this;
}
else if(riid == IID_IDispatch)
{
*ppvObject = (IDispatch *)this;
}
else if(riid == __uuidof(VGCore::IVGAppPlugin))
{
*ppvObject = (VGCore::IVGAppPlugin *)this;
}
else
{
m_ulRefCount--;
hr = E_NOINTERFACE;
}
return hr;
} STDMETHODIMP CVGAppPlugin::Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
{
switch(dispIdMember)
{
case 0x0011: //DISPID_APP_SELCHANGE
m_bEnabled = CheckSelection();
break; case 0x0014: // DISPID_APP_ONPLUGINCMD
if(pDispParams != NULL && pDispParams->cArgs == )
{
_bstr_t strCmd(pDispParams->rgvarg[].bstrVal);
if(strCmd == _bstr_t("ClearFill"))
{
OnClearFill();
}
}
break; case 0x0015: // DISPID_APP_ONPLUGINCMDSTATE
if(pDispParams != NULL && pDispParams->cArgs == )
{
_bstr_t strCmd(pDispParams->rgvarg[].bstrVal);
if(strCmd == _bstr_t("ClearFill"))
{
*pDispParams->rgvarg[].pboolVal = m_bEnabled ? VARIANT_TRUE : VARIANT_FALSE;
}
}
break;
}
return S_OK;
} STDMETHODIMP CVGAppPlugin::raw_OnLoad(VGCore::IVGApplication *Application)
{
m_pApp = Application;
if(m_pApp)
{
m_pApp->AddRef();
}
return S_OK;
} STDMETHODIMP CVGAppPlugin::raw_StartSession()
{
try
{
m_pApp->AddPluginCommand(_bstr_t("ClearFill"), _bstr_t("Clear Fill"), _bstr_t("Clears fill from selected objects"));
VGCore::CommandBarControlPtr ctl = m_pApp->CommandBars->Item[_bstr_t("Standard")]->Controls->AddCustomButton(VGCore::cdrCmdCategoryPlugins, _bstr_t("ClearFill"), , VARIANT_TRUE);
_bstr_t bstrPath(m_pApp->Path + _bstr_t("Plugins\\ClearFill.bmp"));
ctl->SetCustomIcon(bstrPath);
m_lCookie = m_pApp->AdviseEvents(this);
}
catch(_com_error &e)
{
MessageBox(NULL, e.Description(), _T("Error"), MB_ICONSTOP);
}
return S_OK;
} STDMETHODIMP CVGAppPlugin::raw_StopSession()
{
try
{
m_pApp->UnadviseEvents(m_lCookie);
m_pApp->RemovePluginCommand(_bstr_t("ClearFill"));
}
catch(_com_error &e)
{
MessageBox(NULL, e.Description(), _T("Error"), MB_ICONSTOP);
}
return S_OK;
} STDMETHODIMP CVGAppPlugin::raw_OnUnload()
{
if(m_pApp)
{
m_pApp->Release();
m_pApp = NULL;
}
return S_OK;
} extern "C" __declspec(dllexport) DWORD APIENTRY AttachPlugin(VGCore::IVGAppPlugin **ppIPlugin)
{
*ppIPlugin = new CVGAppPlugin;
return 0x100;
}
下载:
ClearFill_src.zip
ClearFill_cpg.zip
C++ 编写 CorelDRAW CPG 插件例子(2)—ClearFill的更多相关文章
- C++ 编写 CorelDRAW CPG 插件例子(1)—WelcomeScreen
据我所知,这是国外论坛最早的一个例子,原贴在此:http://forum.oberonplace.com/showthread.php?t=1880&highlight=Plugins 贴上主 ...
- 【jQuery基础学习】08 编写自定义jQuery插件
目的:虽然jQuery各种各样的功能已经很完善了,但是我们还是要学会自己去编写插件.这样我们可以去封装一些项目中经常用到的专属的代码,以便后期维护和提高开发效率. jQuery插件的类型: 封装对象方 ...
- 自己编写Android Studio插件 别停留在用的程度了(转载)
转自:自己编写Android Studio插件 别停留在用的程度了 1概述 相信大家在使用Android Studio的时候,或多或少的会使用一些插件,适当的配合插件可以帮助我们提升一定的开发效率,更 ...
- 用jquery编写的分页插件
用jquery编写的分页插件 源码 function _pager_go(total_page) { var page_str = $("#_pager_textbox").val ...
- 用jquery编写的tab插件
用jquery编写的tab插件 源码 $.fn.ss_tab = function (options) { var box = $(this); var btns = $(this).find(&qu ...
- 如何自己编写一个easyui插件续
接着如何自己编写一个easyui插件继续分享一下如何从上一节写的“hello”插件继承出一个“hello2”. 参考了combobox的源码中继承combo,当然我这个简单很多了.都是根据自己的理解来 ...
- 用Javascript编写Chrome浏览器插件
原文:http://homepage.yesky.com/62/11206062.shtml 用Javascript编写Chrome浏览器插件 2010-04-12 07:30 来源:天极网软件频道 ...
- 批处理bat脚本编写(附详细例子)
批处理bat脚本编写(附详细例子) 由于在项目开发的过程中经常需要编写bat脚本,而看大牛们编写 ...
- 如何编写一个gulp插件
很久以前,我们在"细说gulp"随笔中,以压缩JavaScript为例,详细地讲解了如何利用gulp来完成前端自动化. 再来短暂回顾下,当时除了借助gulp之外,我们还利用了第三方 ...
随机推荐
- java.lang.ClassNotFoundException: com.servlet.HandlesearchclassesServlet
错误的原因: 原来命名为Handlesearchclasses导致与系统预留字冲突, 导致servlet找不到,出现404错误, 因此该变类名和web.xml里面的配置文件即可.
- Java 文件名操作的相关工具类
项目中的操作文件名的工具类: import java.io.File; import java.util.regex.Matcher; import java.util.regex.Pattern; ...
- [改善Java代码]使用valueOf前必须进行校验
每个枚举都是java.lang.Enum的子类,都可以访问Enum类提供的方法,比如hashCode(),name(),valueOf()等..... 其中valueOf()方法会把一个String类 ...
- [未完成]关于Java网络编程总结
网络的七层结构: 第一层:物理层,网线. 第二层: 数据链路层,交换机.交换机有IP地址.这一层的数据叫做帧 第三层:网络层,数据包方向的定义,路由器.现在也有具有路由功能的交换机.主要将从下层接收到 ...
- (转载)Java NIO:NIO原理分析(二)
NIO中的两个核心对象:缓冲区和通道,在谈到缓冲区时,我们说缓冲区对象本质上是一个数组,但它其实是一个特殊的数组,缓冲区对象内置了一些机制,能够跟踪和记录缓冲区的状态变化情况,如果我们使用 ...
- 【BZOJ1212】[HNOI2004]L语言 Trie树
[BZOJ1212][HNOI2004]L语言 Description 标点符号的出现晚于文字的出现,所以以前的语言都是没有标点的.现在你要处理的就是一段没有标点的文章. 一段文章T是由若干小写字母构 ...
- simple水平导航条
话不多说,看代码: html部分 <body> <ul> <li><a href="#">Home</a></li ...
- Commons JXPath - Object Graph Traversal
JXPath 提供了使用 Xpath 语法操纵符合 Java 类命名规范的 JavaBeans 的工具.也支持 maps.DOM 和其他对象模型.对于深层次结构的 JavaBean,使用 JXPath ...
- 网易新闻RSS阅读器
首先需要分析网易RSS订阅中心的网页布局情况. 网易RSS订阅中心:http://www.163.com/rss/ 你会发现RSS文件由一个<channel>元素及其子元素组成,除了频道本 ...
- SQL Server监测查询性能
SQL Server提供了以下工具(SET选项)来支持查询的监测: IO统计 TIME统计 PROFILER统计 XML统计 1. IO统计 当这个选项开启的时,对一批查询中的每一个数据对象访问的查询 ...