CDR插件开发之Application(应用程序)
在CorelDRAW提供的對象模型中,Application是被開發者經常使用的一個對象,也是最頂級的對象。本文對CorelDRAW(以下簡稱CDR)對象模型中的 Application 類做了一個簡單的解析,以幫助開發者能夠清楚認識 Application 類的作用。
Application(應用程序)
Application是最頂層的對象,表示一個 CorelDRAW 軟件啟動后對應的實例。所謂實例,可以這樣理解:舉個例子,在你電腦上安裝了 CorelDRAW X8,當你啟動了X8,就有一個X8的實例,再啟動一個X8,就又是一個新的實例。當然,CorelDRAW 軟件本身是不支持多開的,也就是同時只能有一個X8啟動。
Application對象定義了 CorelDRAW 應用程序的屬性,它是 CorelDRAW 對象層次結構中的頂級對象,通過它提供的函數、方法和屬性,你可以訪問應用程序的所有其他特性,因此該對象具備了操控 CorelDRAW 的絕大部分能力。在 CorelDRAW 中,Application對象是所有其他對象的“根”。
一、獲取Application應用程序對象的實例
參考代碼(VBA):
在CDR自帶的宏編輯器中,不需要自己手動實例化對象,可以直接使用 Application 來獲取當前的應用程序對象的實例,參考代碼如下:
MsgBox "當前CDR版本:" & Application.Version以上代碼運行效果如下:
參考代碼(C#):
在C#中,CDR應用程序對象的實例,是通過插件在加載過程中的參數進行初始化的:
// CDR應用程序全局對象的靜態引用 public static corel.Application myCdrApp { get; set; }/// <summary> /// 構造器 /// </summary> public ControlUI(corel.Application cdrApp) {// 插件構造時會通過參數將應用程序的實例傳進來// 開發者可以用全局靜態變量將其保存下來,后續使用自己的引用對象即可myCdrApp = cdrApp; }參考代碼(C++):
在C++中,CDR應用程序對象的實例,是通過插件在加載過程中的參數進行初始化的:
STDMETHODIMP HelloWorldPlugin::raw_OnLoad(VGCore::IVGApplication* Application) {// 當CDR加載時,此時獲得了一個應用程序的實例,將其傳遞給 cdrAppVGCore::IVGApplication* cdrApp = Application;if (cdrApp) {// 添加引用cdrApp->AddRef();}MessageBox(NULL, cdrApp->Version, _bstr_t("CDR版本信息"), MB_OK);return S_OK; }參考代碼(JavaScript):
在較高版本的CDR版本中,可以通過頂級對象 host 來獲取當前的應用程序對象的實例,參考代碼如下:
// 通過host頂級對象得到應用程序的實例,彈框顯示當前CDR應用程序的路徑 alert(host.Application.Version);以上代碼運行效果如下:
二、創建CDR文檔
在獲得了CDR應用程序對象的實例后,就可以通過它來實現針對CDR的各種操作。例如下面的代碼例子,創建了一個新的CorelDRAW文檔,向文檔的活動層添加一個彩色橢圓,并以新名稱保存新文檔:
參考代碼(VBA):
Sub Test()' 聲明一個文檔對象,取名為docDim doc As Document' 調用應用程序提供的 CreateDocument(創建文檔)的方法,創建(實例化)一個文檔對象(等同于人工操作中的“文件” → “新建”)Set doc = Application.CreateDocument()' 在新建文檔的當前活動圖層上,創建一個橢圓,并填充CMYK顏色,值分別為:0, 100, 100, 0doc.ActiveLayer.CreateEllipse(0, 3, 5, 1).Fill.UniformColor.CMYKAssign 0, 100, 100, 0' 將文檔另存到當前電腦我的文檔目錄下,文件名稱:test.cdrdoc.SaveAs "C:\Users\Administrator\Documents\test.cdr"' 消息提示MsgBox "文檔保存成功,請查看" End Sub參考代碼(C#):
using Corel.Interop.VGCore; using System.Windows; using corel = Corel.Interop.VGCore;namespace CdrCloudPlugin {class Demo {public void Test(corel.Application cdrApp) {// 聲明一個文檔對象,取名為docDocument doc;// 調用應用程序提供的 CreateDocument(創建文檔)的方法,創建(實例化)一個文檔對象(等同于人工操作中的“文件” → “新建”)doc = cdrApp.CreateDocument();// 在新建文檔的當前活動圖層上,創建一個橢圓,并填充CMYK顏色,值分別為:0, 100, 100, 0doc.ActiveLayer.CreateEllipse(0, 3, 5, 1).Fill.UniformColor.CMYKAssign(0, 100, 100, 0);// 將文檔另存到當前電腦我的文檔目錄下,文件名稱:test.cdrdoc.SaveAs(@"C:\Users\Administrator\Documents\test.cdr");// 消息提示MessageBox.Show("文檔保存成功,請查看");}} }參考代碼(C++):
void Test() {// 聲明一個文檔對象,取名為docVGCore::IVGDocumentPtr doc;// 調用應用程序提供的 CreateDocument(創建文檔)的方法,創建(實例化)一個文檔對象(等同于人工操作中的“文件” → “新建”)doc = cdrApp->CreateDocument();// 在新建文檔的當前活動圖層上,創建一個橢圓,并填充CMYK顏色,值分別為:0, 100, 100, 0doc->ActiveLayer->CreateEllipse(0, 3, 5, 1, 0, 0, FALSE)->Fill->UniformColor->CMYKAssign(0, 100, 100, 0);// 將文檔另存到當前電腦我的文檔目錄下,文件名稱:test.cdrdoc->SaveAs("C:/Users/Administrator/Documents/test.cdr", cdrApp->CreateStructSaveAsOptions());// 消息提示MessageBox(NULL, _bstr_t("文檔保存成功,請查看"), _bstr_t("www.cdrvba.com"), MB_OK); }參考代碼(JavaScript):
使用JS腳本時,可能會出現部分API無法調用的情況,比如文檔的另存為(SaveAs),因此在部分場景下功能有限。
// 聲明一個文檔對象,取名為doc var doc; // 調用應用程序提供的 CreateDocument(創建文檔)的方法,創建(實例化)一個文檔對象(等同于人工操作中的“文件” → “新建”) doc = host.Application.CreateDocument(); // 在新建文檔的當前活動圖層上,創建一個橢圓,并填充CMYK顏色,值分別為:0, 100, 100, 0 doc.ActiveLayer.CreateEllipse(0, 3, 5, 1).Fill.UniformColor.CMYKAssign(0, 100, 100, 0); // 消息提示 alert("ok");三、打開CDR文檔
除了創建文檔外,還可以通過應用程序提供的 OpenDocument 函數來打開一個存在的CDR文檔。
參考代碼(VBA):
Sub Test()' 定義CDR文件的路徑Dim path As Stringpath = "F:\zebe\CDR\懸浮瓷鉆\未命名-1.cdr"' 檢查CDR文件是否存在If Dir(path) = "" ThenMsgBox "文件不存在:" & pathExit SubEnd If' 定義一個文檔對象的引用,取名為myDocDim myDoc As Document' 通過應用程序對象提供的 OpenDocument 方法來打開一個已經存在的CDR文檔Set myDoc = Application.OpenDocument(path) End Sub參考代碼(C#):
using Corel.Interop.VGCore; using System.IO; using System.Windows; using corel = Corel.Interop.VGCore;namespace CdrCloudPlugin {class Demo {public void Test(corel.Application cdrApp) {// 定義CDR文件的路徑string path = @"F:\zebe\CDR\懸浮瓷鉆\未命名-1.cdr";// 檢查CDR文件是否存在if (!File.Exists(path)) {MessageBox.Show("文件不存在:" + path);return;}// 定義一個文檔對象的引用,取名為myDocDocument myDoc;// 通過應用程序對象提供的 OpenDocument 方法來打開一個已經存在的CDR文檔myDoc = cdrApp.OpenDocument(path);}} }參考代碼(C++):
// 暫無,待補充完善四、繪制直線和曲線段
Application對象還提供了圖形繪制的能力,比如創建直線或曲線段。
參考代碼(VBA):
Sub Test()' 創建一個新文檔Application.CreateDocument' 聲明曲線對象引用Dim crv As Curve' 聲明形狀對象引用Dim s As Shape' 聲明子路徑對象引用Dim sp As SubPath' 創建一個曲線對象,這時候曲線對象在內存中,還只是一個數據Set crv = Application.CreateCurve(ActiveDocument)' 在曲線上創建一個子路徑Set sp = crv.CreateSubPath(1, 5)' 為曲線上的子路徑添加幾條線段(直線段、曲線段)sp.AppendLineSegment 2, 0sp.AppendCurveSegment2 5, 7, 6, 6, 3, 5sp.AppendCurveSegment2 7, 2, 3, 6, 7, 1sp.AppendLineSegment 9, 6' 將子路徑的第3個節點的類型改為平滑節點sp.Nodes(3).Type = cdrSmoothNode' 將內存中的曲線對象,創建到當前圖層上,這樣就可以看見了Set s = ActiveLayer.CreateCurve(crv) End Sub參考代碼(C#):
using Corel.Interop.VGCore; using corel = Corel.Interop.VGCore;namespace CdrCloudPlugin {class Demo {public void Test(corel.Application cdrApp) {// 創建一個新文檔cdrApp.CreateDocument();// 聲明曲線對象引用Curve crv;// 聲明形狀對象引用Shape s;// 聲明子路徑對象引用SubPath sp;// 創建一個曲線對象,這時候曲線對象在內存中,還只是一個數據crv = cdrApp.CreateCurve(cdrApp.ActiveDocument);// 在曲線上創建一個子路徑sp = crv.CreateSubPath(1, 5);// 為曲線上的子路徑添加幾條線段(直線段、曲線段)sp.AppendLineSegment(2, 0);sp.AppendCurveSegment2(5, 7, 6, 6, 3, 5);sp.AppendCurveSegment2(7, 2, 3, 6, 7, 1);sp.AppendLineSegment(9, 6);// 將子路徑的第3個節點的類型改為平滑節點sp.Nodes[3].Type = cdrNodeType.cdrSmoothNode;// 將內存中的曲線對象,創建到當前圖層上,這樣就可以看見了s = cdrApp.ActiveLayer.CreateCurve(crv);}} }參考代碼(C++):
// 暫無,待補充完善參考代碼(JavaScript):
// 創建一個新文檔 host.Application.CreateDocument(); // 聲明曲線對象引用 var crv; // 聲明形狀對象引用 var s; // 聲明子路徑對象引用 var sp; // 創建一個曲線對象,這時候曲線對象在內存中,還只是一個數據 crv = host.Application.CreateCurve(host.Application.ActiveDocument); // 在曲線上創建一個子路徑 sp = crv.CreateSubPath(1, 5); // 為曲線上的子路徑添加幾條線段(直線段、曲線段) sp.AppendLineSegment(2, 0); sp.AppendCurveSegment2(5, 7, 6, 6, 3, 5); sp.AppendCurveSegment2(7, 2, 3, 6, 7, 1); sp.AppendLineSegment(9, 6); // 將子路徑的第3個節點的類型改為平滑節點(經測試,JS獲取不到 sp 的 Nodes 對象,原因未知) // 將內存中的曲線對象,創建到當前圖層上,這樣就可以看見了 s = host.Application.ActiveLayer.CreateCurve(crv);上面創建曲線的代碼,運行后效果如下所示:
五、創建顏色
Application對象提供了創建顏色的方法,可供開發者靈活的使用自定義的顏色。
參考代碼(VBA):
Sub Test()' 判斷是否選擇了圖形If ActiveShape Is Nothing ThenMsgBox "請選擇要填充顏色的圖形"Exit SubEnd If' 聲明一個顏色對象Dim c As Color' 創建一個顏色對象Set c = CreateColor' 給顏色對象分配CMYK色值(青色)c.CMYKAssign 100, 0, 0, 0' 將當前選擇的圖形填充為青色ActiveShape.Fill.ApplyUniformFill c End Sub參考代碼(C#):
using Corel.Interop.VGCore; using System.Windows; using corel = Corel.Interop.VGCore;namespace CdrCloudPlugin {class Demo {public void Test(corel.Application cdrApp) {// 判斷是否選擇了圖形if (cdrApp.ActiveShape == null) {MessageBox.Show("請選擇要填充顏色的圖形");return;}// 聲明一個顏色對象Color c;// 創建一個顏色對象c = cdrApp.CreateColor();// 給顏色對象分配CMYK色值(青色)c.CMYKAssign(100, 0, 0, 0);// 將當前選擇的圖形填充為青色cdrApp.ActiveShape.Fill.ApplyUniformFill(c);}} }參考代碼(C++):
// 暫無,待補充完善參考代碼(JavaScript):
注意:在JS中使用 return 會報錯,因此要通過判斷語句來實現邏輯的跳轉。
// 判斷是否選擇了圖形 if (host.ActiveShape == null) {alert("請選擇要填充顏色的圖形"); } else {// 聲明一個顏色對象var c;// 創建一個顏色對象c = host.Application.CreateColor();// 給顏色對象分配CMYK色值(青色)c.CMYKAssign(100, 0, 0, 0);// 將當前選擇的圖形填充為青色host.ActiveShape.Fill.ApplyUniformFill(c); }上面創建顏色的代碼,運行后效果如下所示:
六、Application應用程序的屬性
以 CorelDRAW X7 版本為例,Application對象提供了 67 個可以給開發者使用的屬性,分別如下:
| ActiveDocument | 活動文檔。 |
| ActiveLayer | 活動圖層。 |
| ActivePage | 活動頁面。 |
| ActivePalette | 活動調色板。 |
| ActiveSelection | 活動選擇。 |
| ActiveSelectionRange | 活動選擇范圍。 |
| ActiveShape | 活動形狀。 |
| ActiveSpread | 活動擴展。 |
| ActiveTool | 活動工具。 |
| ActiveTreeManager | 活動樹管理器。 |
| ActiveVirtualLayer | 活動虛擬圖層。 |
| ActiveWindow | 活動窗口 |
| ActiveWorkspace | 活動工作區。 |
| Application | 應用程序。 |
| AppWindow | 應用程序窗口。 |
| ArrowHeads | 箭頭對象。 |
| Class | 類。 |
| Clipboard | 剪貼板。 |
| ColorManager | 顏色管理器。 |
| CommandBars | 命令欄。 |
| Components | 組件。 |
| ConfigPath | 配置路徑。 |
| DefaultColorContext | 默認顏色上下文。 |
| Documents | 文檔。 |
| EnhancedOutlines | 增強輪廓。 |
| EventsEnabled | 事件是否開啟。 |
| FontList | 字體列表。 |
| FrameWork | 框架。 |
| GlobalUserData | 全局用戶數據。 |
| GMSManager | 全局宏管理器。 |
| ID | ID。 |
| LanguagePath | 語言路徑。 |
| MainMenu | 主菜單。 |
| Name | 名稱。 |
| Optimization | 是否開啟優化。 |
| OutlineStyles | 輪廓樣式。 |
| PageSizes | 頁面尺寸。 |
| PaletteManager | 調色板管理器。 |
| Palettes | 調色板 |
| PanoseMatching | PANOSE匹配類型。 |
| Parent | 上級。 |
| Path | 路徑。 |
| PatternCanvases | 圖案畫布。 |
| PlatformVersionMajor | 平臺主要版本。 |
| PlatformVersionMinor | 平臺次要版本。 |
| Printers | 打印機。 |
| PrintJob | 打印作業。 |
| ProgramPath | 程序路徑。 |
| RecentFiles | 最近的文件。 |
| SessionUserData | 會話中的用戶數據。 |
| SetupPath | 設置文件夾的路徑。 |
| StartupMode | 啟動模式。 |
| Status | 狀態。 |
| StatusBar | 狀態欄。 |
| SymbolLibraries | 符號庫。 |
| UILanguage | 用戶界面語言。 |
| Unit | 單位。 |
| UserDataPath | 用戶數據路徑。 |
| UserWorkspacePath | 用戶工作空間路徑。 |
| VBE | 宏編輯器。 |
| Version | 版本。 |
| VersionBuild | 構建版本。 |
| VersionMajor | 主要版本。 |
| VersionMinor | 次要版本。 |
| Visible | 是否可見。 |
| Windows | 窗口。 |
| Workspaces | 工作區。 |
七、Application應用程序的方法和函數
以 CorelDRAW X7 版本為例,Application對象提供了 59 個可以給開發者使用的方法和函數,分別如下:
| AddPluginCommand | 添加插件命令。 |
| AdviseEvents | 通知事件。 |
| cdrMixedDouble | CDR混合雙精度。 |
| cdrMixedLong | CDR混合長整數。 |
| cdrMixedSingle | CDR混合單精度。 |
| CheckPlatformVersion | 檢查平臺版本。 |
| ConvertFromUnicode | 從Unicode轉換。 |
| ConvertToUnicode | 轉換到Unicode。 |
| ConvertUnits | 轉換單位。 |
| CreateBWColor | 創建BW顏色。 |
| CreateCMYColor | 創建CMY顏色。 |
| CreateCMYKColor | 創建CMYK顏色。 |
| CreateColor | 創建顏色。 |
| CreateColorContext | 創建顏色上下文。 |
| CreateColorContext2 | 創建顏色上下文2。 |
| CreateColorEx | 創建顏色擴展。 |
| CreateCurve | 創建曲線。 |
| CreateDocument | 創建文檔。 |
| CreateDocumentEx | 創建文檔擴展。 |
| CreateDocumentFromTemplate | 從模板創建文檔。 |
| CreateDuotone | 創建雙色版。 |
| CreateFillMetadata | 創建元數據填充。 |
| CreateGrayColor | 創建灰度顏色。 |
| CreateHLSColor | 創建HLS顏色。 |
| CreateHSBColor | 創建HSB顏色。 |
| CreateLabColor | 創建LAB顏色。 |
| CreateNodeRange | 創建節點范圍。 |
| CreateOutlineStyle | 創建輪廓樣式。 |
| CreatePaletteColor | 創建調色板顏色。 |
| CreatePatternCanvas | 創建圖案畫布。 |
| CreateProofColorSettings | 創建一個 ProofColorSettings 對象。 |
| CreateRect | 創建矩形區域。 |
| CreateRegistrationColor | 創建注冊顏色。 |
| CreateRGBColor | 創建RGB顏色。 |
| CreateSegmentRange | 創建線段范圍。 |
| CreateShapeRange | 創建形狀范圍。 |
| CreateSpotColor | 創建專色。 |
| CreateSpotColorByName | 根據名稱創建專色。 |
| CreateStructCreateOptions | 創建結構化創建選項。 |
| CreateStructExportOptions | 創建結構化導出選項。 |
| CreateStructImportOptions | 創建結構化導入選項。 |
| CreateStructOpenOptions | 創建結構化創打開選項。 |
| CreateStructPaletteOptions | 創建結構化調色板選項。 |
| CreateStructPasteOptions | 創建結構化粘貼選項。 |
| CreateStructSaveAsOptions | 創建結構化另存為選項。 |
| CreateYIQColor | 創建YIQ顏色。 |
| Evaluate | 計算表達式。 |
| ForceUpdateFontTable | 強制更新字體表。 |
| GetSupportedOpenTypeFeatures | 獲得支持的開放類型功能。 |
| ImportWorkspace | 導入工作區。 |
| InitializeVBA | 初始化VBA。 |
| IsUILanguageAvailable | 用戶界面語言是否可用。 |
| OpenDocument | 打開文檔。 |
| OpenDocumentAsCopy | 作為副本打開文檔。 |
| OpenDocumentEx | 打開文檔擴展。 |
| Quit | 退出。 |
| Refresh | 刷新。 |
| RemovePluginCommand | 移除插件命令。 |
| UnadviseEvents | 解除通知事件。 |
八、Application應用程序的事件
以 CorelDRAW X7 版本為例,Application對象提供了 21 個可以給開發者使用的事件,分別如下:
| DocumentAfterExport | 文檔導出后事件。 |
| DocumentAfterPrint | 文檔打印后事件。 |
| DocumentAfterSave | 文檔保存后事件。 |
| DocumentBeforeExport | 文檔導出前事件。 |
| DocumentBeforePrint | 文檔打印前事件。 |
| DocumentBeforeSave | 文檔保存前事件。 |
| DocumentClose | 文檔關閉事件。 |
| DocumentNew | 文檔新建事件。 |
| DocumentOpen | 文檔打開事件。 |
| OnPluginCommand | 插件命令事件。 |
| OnUpdatePluginCommand | 更新插件命令事件。 |
| QueryDocumentClose | 文檔詢問關閉事件。 |
| QueryDocumentExport | 文檔詢問導出事件。 |
| QueryDocumentPrint | 文檔詢問打印事件。 |
| QueryDocumentSave | 文檔詢問保存事件。 |
| QueryQuit | 詢問退出事件。 |
| Quit | 退出事件。 |
| SelectionChange | 選擇改變事件。 |
| Start | 啟動事件。 |
| WindowActivate | 窗口成為活動狀態事件。 |
| WindowDeactivate | 窗口失去活動狀態事件。 |
以 DocumentNew(文檔新建)事件為例,以下是事件的使用例子舉例:
參考代碼(VBA):
注意:由于 Application 的事件是整個CDR應用程序級別的,因此需要將相關事件處理的代碼,編寫在 GlobalMacros.gms 中才可以生效。
Private Sub GlobalMacroStorage_DocumentNew(ByVal doc As Document, ByVal FromTemplate As Boolean, ByVal Template As String, ByVal IncludeGraphics As Boolean)MsgBox "檢測到新文檔被創建,文檔名稱:" & doc.Title End Sub參考代碼(C#):
using System.Windows; using corel = Corel.Interop.VGCore;namespace CdrCloudPlugin {class Demo {public void Test(corel.Application cdrApp) {// 綁定文檔新建事件cdrApp.DocumentNew += CdrApp_DocumentNew;}// 文檔新建事件處理方法private static void CdrApp_DocumentNew(corel.Document Doc, bool FromTemplate, string Template, bool IncludeGraphics) {MessageBox.Show("檢測到新文檔被創建,文檔名稱:" + Doc.Title);}} }參考代碼(C++):
// 暫無,待補充完善上面針對文檔新建事件處理的代碼,每當新建一個文檔時,其運行效果如下所示:
九、本文總結
Application 類是整個 CorelDRAW 對象層次結構中的頂級對象,通過它提供的函數、方法和屬性,你可以訪問應用程序的所有其他特性。
十、寫給讀者
創作不易,每篇文章的創作都要花費作者很大的時間和精力,好文要頂!請通過評論、收藏的形式來支持作者。因作者水平有限,如文章中有錯誤還請指出來,方便作者修復,以免誤導他人。若遇到代碼不能運行或者報錯的情況,請留言評論,作者會抽空回復,協助解決。
總結
以上是生活随笔為你收集整理的CDR插件开发之Application(应用程序)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 绘制svg
- 下一篇: 一篇文章读懂,物联网项目的5大技术要素