|
@@ -0,0 +1,353 @@
|
|
|
|
+#include "cdrapi.h"
|
|
|
|
+#include "cdrapp.h"
|
|
|
|
+#include "resource.h"
|
|
|
|
+#include <stdio.h>
|
|
|
|
+#include <windows.h>
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+corel *cdr = NULL;
|
|
|
|
+static HINSTANCE g_hResource = NULL;
|
|
|
|
+HICON g_hIcon; // 窗口图标句柄
|
|
|
|
+bool debug_flg = false; // 调试->高级模式
|
|
|
|
+char infobuf[256] = {0};
|
|
|
|
+BOOL APIENTRY DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) {
|
|
|
|
+ if (fdwReason == DLL_PROCESS_ATTACH) {
|
|
|
|
+ g_hResource = (HINSTANCE)hinstDLL;
|
|
|
|
+ }
|
|
|
|
+ return TRUE;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+class ToolsBoxPlugin : public VGCore::IVGAppPlugin {
|
|
|
|
+private:
|
|
|
|
+ volatile ULONG m_ulRefCount;
|
|
|
|
+ long m_lCookie;
|
|
|
|
+ static intptr_t CALLBACK DlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
|
|
|
|
+
|
|
|
|
+public:
|
|
|
|
+ ToolsBoxPlugin();
|
|
|
|
+ VGCore::IVGApplication *m_pApp;
|
|
|
|
+ void OpenToolsBox();
|
|
|
|
+
|
|
|
|
+ // 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 == 0) {
|
|
|
|
+ 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)();
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+ToolsBoxPlugin::ToolsBoxPlugin() {
|
|
|
|
+ m_pApp = NULL;
|
|
|
|
+ m_lCookie = 0;
|
|
|
|
+ m_ulRefCount = 1;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+STDMETHODIMP ToolsBoxPlugin::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 ToolsBoxPlugin::Invoke(DISPID dispIdMember, REFIID riid, LCID lcid,WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr) {
|
|
|
|
+ switch (dispIdMember) {
|
|
|
|
+
|
|
|
|
+ case 0x0014: // DISPID_APP_ONPLUGINCMD
|
|
|
|
+ if (pDispParams != NULL && pDispParams->cArgs == 1) {
|
|
|
|
+ _bstr_t strCmd(pDispParams->rgvarg[0].bstrVal);
|
|
|
|
+ if (strCmd == _bstr_t("OpenToolsBox")) {
|
|
|
|
+ // MessageBox(NULL, _bstr_t("OpenToolsBox"), _bstr_t("OpenToolsBox"),
|
|
|
|
+ // MB_ICONSTOP);
|
|
|
|
+ OpenToolsBox();
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ break;
|
|
|
|
+
|
|
|
|
+ case 0x0015: // DISPID_APP_ONPLUGINCMDSTATE
|
|
|
|
+ if (pDispParams != NULL && pDispParams->cArgs == 3) {
|
|
|
|
+ _bstr_t strCmd(pDispParams->rgvarg[2].bstrVal);
|
|
|
|
+ if (strCmd == _bstr_t("OpenToolsBox")) {
|
|
|
|
+ *pDispParams->rgvarg[1].pboolVal = VARIANT_TRUE;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ return S_OK;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+STDMETHODIMP ToolsBoxPlugin::raw_OnLoad(VGCore::IVGApplication *Application) {
|
|
|
|
+ m_pApp = Application;
|
|
|
|
+ if (m_pApp) {
|
|
|
|
+ m_pApp->AddRef();
|
|
|
|
+ }
|
|
|
|
+ return S_OK;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+ToolsBoxPlugin* lycpg = nullptr;
|
|
|
|
+STDMETHODIMP ToolsBoxPlugin::raw_StartSession() {
|
|
|
|
+ // 接口转交给cdr
|
|
|
|
+ cdr = m_pApp;
|
|
|
|
+ lycpg = this;
|
|
|
|
+
|
|
|
|
+ try {
|
|
|
|
+ m_pApp->AddPluginCommand(_bstr_t("OpenToolsBox"), _bstr_t("Tools Box"), _bstr_t("打开工具窗口"));
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ m_lCookie = m_pApp->AdviseEvents(this);
|
|
|
|
+ } catch (_com_error &e) {
|
|
|
|
+ MessageBox(NULL, e.Description(), _bstr_t("Error"), MB_ICONSTOP);
|
|
|
|
+ }
|
|
|
|
+ return S_OK;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+STDMETHODIMP ToolsBoxPlugin::raw_StopSession() {
|
|
|
|
+ try {
|
|
|
|
+ m_pApp->UnadviseEvents(m_lCookie);
|
|
|
|
+ m_pApp->RemovePluginCommand(_bstr_t("OpenToolsBox"));
|
|
|
|
+ } catch (_com_error &e) {
|
|
|
|
+ MessageBox(NULL, e.Description(), _bstr_t("Error"), MB_ICONSTOP);
|
|
|
|
+ }
|
|
|
|
+ return S_OK;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+STDMETHODIMP ToolsBoxPlugin::raw_OnUnload() {
|
|
|
|
+ if (m_pApp) {
|
|
|
|
+ m_pApp->Release();
|
|
|
|
+ m_pApp = NULL;
|
|
|
|
+ }
|
|
|
|
+ return S_OK;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void ToolsBoxPlugin::OpenToolsBox() {
|
|
|
|
+ m_pApp->StartupMode = VGCore::cdrStartupDoNothing;
|
|
|
|
+
|
|
|
|
+ intptr_t nHandle = m_pApp->AppWindow->Handle;
|
|
|
|
+ HWND hAppWnd = reinterpret_cast<HWND>(nHandle);
|
|
|
|
+
|
|
|
|
+ // 创建非模态对话框
|
|
|
|
+ HWND hDlgWnd = CreateDialogParam(g_hResource, MAKEINTRESOURCE(IDD_TOOLS_BOX), hAppWnd, DlgProc, (LPARAM)m_pApp);
|
|
|
|
+ // 在创建对话框之前存储 m_pApp 指针
|
|
|
|
+ SetWindowLongPtr(hDlgWnd, DWLP_USER, (LONG_PTR)m_pApp);
|
|
|
|
+
|
|
|
|
+ // 获取屏幕的宽度和高度
|
|
|
|
+ RECT rect;
|
|
|
|
+ GetWindowRect(GetDesktopWindow(), &rect);
|
|
|
|
+ int screenWidth = rect.right - rect.left;
|
|
|
|
+ int screenHeight = rect.bottom - rect.top;
|
|
|
|
+
|
|
|
|
+ // 计算对话框窗口的宽度和高度
|
|
|
|
+ RECT dlgRect;
|
|
|
|
+ GetWindowRect(hDlgWnd, &dlgRect);
|
|
|
|
+ int w = dlgRect.right - dlgRect.left;
|
|
|
|
+ int h = dlgRect.bottom - dlgRect.top;
|
|
|
|
+
|
|
|
|
+ // 计算对话框窗口的左上角坐标,使其居中显示
|
|
|
|
+ int x = (screenWidth - w) / 2;
|
|
|
|
+ int y = (screenHeight - h) / 2;
|
|
|
|
+
|
|
|
|
+ // 创建窗口数据实例 // 从文件加载
|
|
|
|
+ WinData win = {x, y, w, h};
|
|
|
|
+ win = loadWinData("window.dat", win);
|
|
|
|
+
|
|
|
|
+ // 设置对话框窗口的位置
|
|
|
|
+ SetWindowPos(hDlgWnd, NULL, win.x, win.y, win.w, win.h, SWP_NOZORDER | SWP_NOACTIVATE);
|
|
|
|
+ // 设置对话框窗口的父窗口 // #define GWL_HWNDPARENT (-8)
|
|
|
|
+ SetWindowLong(hDlgWnd, -8, (LONG)hAppWnd);
|
|
|
|
+
|
|
|
|
+ // 显示对话框窗口
|
|
|
|
+ ShowWindow(hDlgWnd, SW_SHOW);
|
|
|
|
+
|
|
|
|
+ // 使用 g_hResource 作为 HINSTANCE
|
|
|
|
+ g_hIcon = ::LoadIcon(g_hResource, MAKEINTRESOURCE(IDI_ICON1));
|
|
|
|
+ // 小图标:就是窗口左上角对应的那个图标
|
|
|
|
+ ::SendMessage(hDlgWnd, WM_SETICON, ICON_SMALL, (LPARAM)g_hIcon);
|
|
|
|
+
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+// MessageBox(NULL, "更新提示信息: 激活CorelDRAW窗口", "CPG代码测试", MB_ICONSTOP);
|
|
|
|
+#define UPDATE_INFO_ACTIVE_CDRWND \
|
|
|
|
+ PutTextValue(hDlg, INFO_TEXT, infobuf); \
|
|
|
|
+ Active_CorelWindows(hDlg);
|
|
|
|
+intptr_t CALLBACK ToolsBoxPlugin::DlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) {
|
|
|
|
+ // 从附加数据中获取 m_pApp 指针
|
|
|
|
+ VGCore::IVGApplication *cdr = reinterpret_cast<VGCore::IVGApplication *>(
|
|
|
|
+ GetWindowLongPtr(hDlg, DWLP_USER));
|
|
|
|
+
|
|
|
|
+ if (uMsg == WM_COMMAND) {
|
|
|
|
+ try {
|
|
|
|
+ switch (LOWORD(wParam)) {
|
|
|
|
+
|
|
|
|
+ case ID_BOUNDARY_GROUP: {
|
|
|
|
+
|
|
|
|
+ if (BST_CHECKED == IsDlgButtonChecked(hDlg, DEBUG_FLG))
|
|
|
|
+ debug_flg = true;
|
|
|
|
+ else
|
|
|
|
+ debug_flg = false;
|
|
|
|
+ double exp = GetTextValue(hDlg, EXP_TEXT);
|
|
|
|
+
|
|
|
|
+ run_BoundaryGroup(cdr);
|
|
|
|
+ UPDATE_INFO_ACTIVE_CDRWND
|
|
|
|
+ } break;
|
|
|
|
+
|
|
|
|
+ case IDC_BOX_GROUP: {
|
|
|
|
+ double exp = GetTextValue(hDlg, EXP_TEXT);
|
|
|
|
+ AutoMakeSelection(cdr);
|
|
|
|
+ Box_AutoGroup(cdr, exp);
|
|
|
|
+ UPDATE_INFO_ACTIVE_CDRWND
|
|
|
|
+
|
|
|
|
+ } break;
|
|
|
|
+
|
|
|
|
+ case IDC_CQL_OUTLINE:
|
|
|
|
+ cql_OutlineColor(cdr);
|
|
|
|
+
|
|
|
|
+ UPDATE_INFO_ACTIVE_CDRWND
|
|
|
|
+ break;
|
|
|
|
+
|
|
|
|
+ case IDC_CQL_FILL:
|
|
|
|
+ cql_FillColor(cdr);
|
|
|
|
+
|
|
|
|
+ UPDATE_INFO_ACTIVE_CDRWND
|
|
|
|
+ break;
|
|
|
|
+
|
|
|
|
+ case IDC_CQL_SIZE:
|
|
|
|
+ cql_SameSize(cdr);
|
|
|
|
+
|
|
|
|
+ UPDATE_INFO_ACTIVE_CDRWND
|
|
|
|
+ break;
|
|
|
|
+
|
|
|
|
+ case IDC_CLEAR_FILL: {
|
|
|
|
+ double exp = GetTextValue(hDlg, EXP_TEXT);
|
|
|
|
+ AutoMakeSelection(cdr);
|
|
|
|
+ BBox_DrawRectangle(cdr, exp);
|
|
|
|
+
|
|
|
|
+ UPDATE_INFO_ACTIVE_CDRWND
|
|
|
|
+ } break;
|
|
|
|
+
|
|
|
|
+ case IDC_SR_FLIP:
|
|
|
|
+ Shapes_Filp(cdr);
|
|
|
|
+ break;
|
|
|
|
+
|
|
|
|
+ case IDC_CDR2AI: {
|
|
|
|
+ CdrCopy_to_AdobeAI(cdr);
|
|
|
|
+ sprintf(infobuf, "把CorelDRAW软件中选择物件复制到剪贴板,请切换到AI软件粘贴");
|
|
|
|
+ UPDATE_INFO_ACTIVE_CDRWND
|
|
|
|
+ } break;
|
|
|
|
+
|
|
|
|
+ case IDC_AI2CDR: {
|
|
|
|
+ AdobeAI_Copy_ImportCdr(cdr);
|
|
|
|
+ sprintf(infobuf, "请先在AI软件选择物件复制,再切换到CorelDRAW软件点执行本功能");
|
|
|
|
+ UPDATE_INFO_ACTIVE_CDRWND
|
|
|
|
+ } break;
|
|
|
|
+
|
|
|
|
+//////////// 窗口扩展、最小化、恢复按钮按钮////////////////////////////////////////////////
|
|
|
|
+ case EXPAND_TOOLS: {
|
|
|
|
+ // 获取当前窗口的句柄
|
|
|
|
+ HWND hwnd = GetActiveWindow();
|
|
|
|
+ // 获取当前窗口的矩形区域
|
|
|
|
+ RECT rect;
|
|
|
|
+ GetWindowRect(hwnd, &rect);
|
|
|
|
+ // 计算新的宽度
|
|
|
|
+ int newWidth = rect.right - rect.left + 100; // 增加100单位
|
|
|
|
+ // 移动窗口到新的大小
|
|
|
|
+ SetWindowPos(hwnd, NULL, rect.left, rect.top, newWidth, rect.bottom - rect.top, SWP_NOZORDER | SWP_NOACTIVATE);
|
|
|
|
+ // 隐藏按钮 (假设按钮的句柄为 buttonHandle)
|
|
|
|
+ ShowWindow(::GetDlgItem(hDlg, EXPAND_TOOLS), SW_HIDE);
|
|
|
|
+ } break;
|
|
|
|
+
|
|
|
|
+ case MIN_TOOLS: {
|
|
|
|
+ RECT rect;
|
|
|
|
+ GetWindowRect(hDlg, &rect);
|
|
|
|
+ int currentWidth = rect.right - rect.left;
|
|
|
|
+ int currentHeight = rect.bottom - rect.top;
|
|
|
|
+ int h = 98;
|
|
|
|
+ SetWindowPos(hDlg, NULL, rect.left, rect.top, currentWidth, h, SWP_NOZORDER | SWP_NOACTIVATE);
|
|
|
|
+ ShowWindow(::GetDlgItem(hDlg, MIN_TOOLS), SW_HIDE);
|
|
|
|
+
|
|
|
|
+ int x = rect.left;
|
|
|
|
+ int y = rect.top;
|
|
|
|
+ int w = currentWidth;
|
|
|
|
+ // 保存窗口位置
|
|
|
|
+ WinData win = {x, y, w, h};
|
|
|
|
+ saveWinData("window.dat", &win);
|
|
|
|
+ } break;
|
|
|
|
+
|
|
|
|
+ case RENEW_TOOLS: {
|
|
|
|
+ RECT rect;
|
|
|
|
+ GetWindowRect(hDlg, &rect);
|
|
|
|
+ int x = rect.left;
|
|
|
|
+ int y = rect.top;
|
|
|
|
+ int h = 232; // 恢复宽高
|
|
|
|
+ int w = 207;
|
|
|
|
+ SetWindowPos(hDlg, NULL, x, y, w, h, SWP_NOZORDER | SWP_NOACTIVATE);
|
|
|
|
+ ShowWindow(::GetDlgItem(hDlg, MIN_TOOLS), !SW_HIDE);
|
|
|
|
+ ShowWindow(::GetDlgItem(hDlg, EXPAND_TOOLS), !SW_HIDE);
|
|
|
|
+
|
|
|
|
+ // 保存窗口位置
|
|
|
|
+ WinData win = {x, y, w, h};
|
|
|
|
+ saveWinData("window.dat", &win);
|
|
|
|
+
|
|
|
|
+ } break;
|
|
|
|
+
|
|
|
|
+ case IDOK:
|
|
|
|
+ break;
|
|
|
|
+ case IDCANCEL:
|
|
|
|
+ EndDialog(hDlg, 0);
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ } catch (_com_error &e) {
|
|
|
|
+ MessageBox(NULL, e.Description(), "Error", MB_ICONSTOP);
|
|
|
|
+ EndOpt(cdr);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ } else if (uMsg == WM_INITDIALOG) {
|
|
|
|
+ SetWindowText(::GetDlgItem(hDlg, EXP_TEXT), "0");
|
|
|
|
+ return 1;
|
|
|
|
+ }
|
|
|
|
+ return 0;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+extern "C" __declspec(dllexport) DWORD APIENTRY AttachPlugin(VGCore::IVGAppPlugin **ppIPlugin) {
|
|
|
|
+ *ppIPlugin = new ToolsBoxPlugin;
|
|
|
|
+ return 0x100;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void open_lycpg() {
|
|
|
|
+ if (lycpg) {
|
|
|
|
+ lycpg->OpenToolsBox(); // 使用类的实例调用成员函数
|
|
|
|
+ }
|
|
|
|
+}
|