Browse Source

创建非模态对话框,使用附加数据中传递 m_pApp 指针

蘭雅sRGB 8 months ago
parent
commit
bf160b98fa

+ 248 - 0
05_ToolsBox_CreateDialog/ToolsBox.cpp

@@ -0,0 +1,248 @@
+#include <windows.h>
+#include "resource.h"
+
+#import "VGCoreAuto.tlb" \
+rename("GetCommandLine", "VGGetCommandLine") \
+rename("CopyFile", "VGCore") \
+rename("FindWindow", "VGFindWindow")
+
+static HINSTANCE g_hResource = NULL;
+
+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 INT_PTR 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()
+{
+    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;
+
+        INT_PTR 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 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);
+}
+
+
+INT_PTR 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 IDC_NEWDOC:
+                cdr->CreateDocument();
+                EndDialog(hDlg, IDC_NEWDOC);
+                break;
+
+            case IDC_LASTDOC:
+                if (cdr->RecentFiles->Count > 0) {
+                    cdr->OpenDocument(cdr->RecentFiles->Item[1]->FullName, 0);
+                } else {
+                    MessageBox(NULL, "No documents were editied yet.", "Error", MB_ICONSTOP);
+                }
+                EndDialog(hDlg, IDC_LASTDOC);
+                break;
+
+            case IDC_CLEAR_FILL:
+                cdr->ActiveSelection->Fill->ApplyNoFill();
+                break;
+
+            case IDC_SR_FLIP:
+                {
+                  auto sr = cdr->ActiveSelectionRange;
+                  // CorelDRAW Shapes 物件 Item 编号从1开始
+                  for (auto i = 0; i != sr->Count; i++)
+                      sr->Shapes->Item[i + 1]->Flip(VGCore::cdrFlipHorizontal);
+                }
+                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) {
+        return 1;
+    }
+    return 0;
+}
+
+extern "C" __declspec(dllexport) DWORD APIENTRY AttachPlugin(VGCore::IVGAppPlugin** ppIPlugin)
+{
+    *ppIPlugin = new ToolsBoxPlugin;
+    return 0x100;
+}

+ 26 - 0
05_ToolsBox_CreateDialog/ToolsBox.rc

@@ -0,0 +1,26 @@
+// Generated by ResEdit 1.6.6
+// Copyright (C) 2006-2015
+// http://www.resedit.net
+
+#include <windows.h>
+#include <commctrl.h>
+#include <richedit.h>
+#include "resource.h"
+
+
+
+
+//
+// Dialog resources
+//
+LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
+IDD_TOOLS_BOX DIALOGEX 0, 0, 164, 73
+STYLE DS_MODALFRAME | DS_SHELLFONT | WS_CAPTION | WS_POPUP | WS_SYSMENU
+CAPTION "Tools Box"
+FONT 8, "MS Shell Dlg", 400, 0, 1
+{
+    PUSHBUTTON      "New Document", IDC_NEWDOC, 7, 7, 68, 24, 0, WS_EX_LEFT
+    PUSHBUTTON      "Last Document", IDC_LASTDOC, 88, 7, 68, 24, 0, WS_EX_LEFT
+    PUSHBUTTON      "ÎÞÌîÉ«", IDC_CLEAR_FILL, 7, 38, 68, 24, 0, WS_EX_LEFT
+    PUSHBUTTON      "ÅúÁ¿¾µÏñ", IDC_SR_FLIP, 89, 39, 68, 24, 0, WS_EX_LEFT
+}

+ 52 - 0
05_ToolsBox_CreateDialog/lycpg64.cbp

@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
+<CodeBlocks_project_file>
+	<FileVersion major="1" minor="6" />
+	<Project>
+		<Option title="lycpg64" />
+		<Option pch_mode="2" />
+		<Option compiler="microsoft_visual_c_2022" />
+		<Build>
+			<Target title="Debug">
+				<Option output="bin/Debug/lycpg64" prefix_auto="1" extension_auto="1" />
+				<Option object_output="obj/Debug/" />
+				<Option type="3" />
+				<Option compiler="microsoft_visual_c_2022" />
+				<Option createDefFile="1" />
+				<Option createStaticLib="1" />
+				<Compiler>
+					<Add option="/Zi" />
+					<Add option="/D_DEBUG" />
+				</Compiler>
+				<Linker>
+					<Add option="/debug" />
+				</Linker>
+			</Target>
+			<Target title="Release">
+				<Option output="bin/Release/lycpg64" prefix_auto="1" extension_auto="1" />
+				<Option object_output="obj/Release/" />
+				<Option type="3" />
+				<Option compiler="microsoft_visual_c_2022" />
+				<Option createDefFile="1" />
+				<Option createStaticLib="1" />
+				<Compiler>
+					<Add option="/Ox" />
+					<Add option="/DNDEBUG" />
+					<Add directory="../TypeLibs" />
+				</Compiler>
+			</Target>
+		</Build>
+		<Compiler>
+			<Add option="/W3" />
+			<Add option="/EHsc" />
+		</Compiler>
+		<Unit filename="ToolsBox.cpp" />
+		<Unit filename="ToolsBox.rc">
+			<Option compilerVar="WINDRES" />
+			<Option target="Release" />
+		</Unit>
+		<Unit filename="resource.h" />
+		<Extensions>
+			<lib_finder disable_auto="1" />
+		</Extensions>
+	</Project>
+</CodeBlocks_project_file>

+ 9 - 0
05_ToolsBox_CreateDialog/resource.h

@@ -0,0 +1,9 @@
+#ifndef IDC_STATIC
+#define IDC_STATIC (-1)
+#endif
+
+#define IDD_TOOLS_BOX                           100
+#define IDC_NEWDOC                              1001
+#define IDC_LASTDOC                             1002
+#define IDC_CLEAR_FILL                          1003
+#define IDC_SR_FLIP                             1004