zoukankan      html  css  js  c++  java
  • 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

    
    
  • 相关阅读:
    Vue监视数据的原理
    JS 获取随机数
    Vue中的计算属性(computed)、方法(methods)、watch(侦听)
    Vue3中使用调试工具 Vue.js Devtools
    Vue3.X 新特性 Composition Api
    vue、js 保留小数点位数以及转化为百分比
    常用的网页布局之列表页
    CSS常见布局技巧
    2、C#入门第2课
    1、C#入门第一课
  • 原文地址:https://www.cnblogs.com/o594cql/p/4480669.html
Copyright © 2011-2022 走看看