#include "cdrapp.h" #include #include #include "resource.h" corel *cdr = NULL; static HINSTANCE g_hResource = NULL; 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); void OpenToolsBox(); public: ToolsBoxPlugin(); VGCore::IVGApplication* m_pApp; // 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; } STDMETHODIMP ToolsBoxPlugin::raw_StartSession() { // 接口转交给cdr cdr = m_pApp; try { m_pApp->AddPluginCommand(_bstr_t("OpenToolsBox"), _bstr_t("Tools Box"), _bstr_t("打开工具窗口")); VGCore::ICUIControlPtr ctl = m_pApp->CommandBars->Item[_bstr_t("Standard")]->Controls->AddCustomButton(VGCore::cdrCmdCategoryPlugins, _bstr_t("OpenToolsBox"), 10, VARIANT_FALSE); ctl->SetIcon2(_bstr_t("guid://d2fdc0d9-09f8-4948-944c-4297395c05b7")); 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(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 dlgWidth = dlgRect.right - dlgRect.left; int dlgHeight = dlgRect.bottom - dlgRect.top; // 计算对话框窗口的左上角坐标,使其居中显示 int x = (screenWidth - dlgWidth) / 2; int y = (screenHeight - dlgHeight) / 2; // 设置对话框窗口的位置 SetWindowPos(hDlgWnd, NULL, x, y, 0, 0, SWP_NOSIZE | SWP_NOZORDER); // 设置对话框窗口的父窗口 // #define GWL_HWNDPARENT (-8) SetWindowLong(hDlgWnd, -8, (LONG)hAppWnd); // 显示对话框窗口 ShowWindow(hDlgWnd, SW_SHOW); } // 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(GetWindowLongPtr(hDlg, DWLP_USER)); if (uMsg == WM_COMMAND) { try { switch (LOWORD(wParam)) { case IDC_RED :{ 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 IDOK: case IDCANCEL: EndDialog(hDlg, 0); break; } } catch (_com_error &e) { MessageBox(NULL, e.Description(), "Error", MB_ICONSTOP); } } 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; }