Visual Studio .NET 2002Visual C++ 7.1Visual C++ 8.0COMVisual Studio 6Visual C++ 7.0Visual Studio .NET 2003Windows 2003Windows 2000Visual C++ 6.0Windows XPMFCC中级开发Visual StudioWindowsC++
可编程矢量图形






1.10/5 (11投票s)
2004年12月30日
1分钟阅读

91070

2609
创建矢量图形编辑器,实现矢量图形ActiveX。
- 下载源文件 - 153 Kb
- 下载演示 EXE - 5.29 MB [外部链接]
引言
什么是矢量图形 ActiveX?
矢量图形 ActiveX 是一个免费且易于使用的图形解决方案,用于创建技术图纸、插图、图表、图表等等。它提供了广泛的新功能和增强功能,旨在提高生产力并扩展您的应用程序的可能性。
为什么要使用矢量图形 ActiveX?
矢量图形 ActiveX 允许开发人员轻松创建和管理 2D 绘图项目并减少开发时间。 此外,它还提供了一个可视化开发环境,可以是图形用户界面 (GUI) 或代码驱动的。 它提供了 1000 多个方法、属性和事件,并且是完全面向对象的。
实现
首先,使用 ATL 支持创建一个空的 MFC 项目。 创建一个空表单,将矢量图形 ActiveX 放在其上,并生成生成的 IDispatch
包装器类。
不要忘记包含 .tlb 文件
# import "PGFTLB\prographer.tlb" no_namespace named_guids
下一步是向我们的表单类添加成员变量
CPGAX m_PGAX; IDocumentPtr m_spDocument; IWindowPtr m_spWindow;
要处理来自控件的事件,您应该创建类 CComInnerObject
并添加两个变量
template<class T> class CComInnerObject : public CComObjectNoLock<T> { STDMETHOD_(ULONG, Release)() { return InternalRelease(); } }; CComInnerObject<CDocEventSink> m_DocEventSink; CComInnerObject<CWndEventSink> m_WndEventSink;
描述表单的类应该像这样
// CPGAXTESTDlg dialog class CPGAXTESTDlg : public CDialog { DECLARE_DYNAMIC(CPGAXTESTDlg) public: CPGAXTESTDlg(CWnd* pParent = NULL); virtual ~CPGAXTESTDlg(); // Dialog Data enum { IDD = IDD_PGAXDLG }; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support DECLARE_MESSAGE_MAP() private: class CDocEventSink : public CComObjectRootEx<CComSingleThreadModel>, public IDispEventImpl<1, CDocEventSink, &DIID_IDocumentEvents, &LIBID_ProGrapherFoundation, 1, 0> { public: CDocEventSink() { m_pDlg = NULL; } public: CPGAXTESTDlg* m_pDlg; private: // Interface map BEGIN_COM_MAP(CDocEventSink) END_COM_MAP() BEGIN_SINK_MAP(CDocEventSink) SINK_ENTRY_EX(1, DIID_IDocumentEvents, 1, OnOpen) END_SINK_MAP() void _stdcall OnOpen(); }; class CWndEventSink : public CComObjectRootEx<CComSingleThreadModel>, public IDispEventImpl<1, CWndEventSink, &DIID_IWindowEvents, &LIBID_ProGrapherFoundation, 1, 0> { public: CWndEventSink() { m_pDlg = NULL; } public: CPGAXTESTDlg* m_pDlg; double ptX, ptY; private: // Interface map BEGIN_COM_MAP(CWndEventSink) END_COM_MAP() BEGIN_SINK_MAP(CWndEventSink) SINK_ENTRY_EX(1, DIID_IWindowEvents, 1, OnMouseMove) SINK_ENTRY_EX(1, DIID_IWindowEvents, 2, OnLButtonDown) SINK_ENTRY_EX(1, DIID_IWindowEvents, 3, OnLButtonUp) END_SINK_MAP() void _stdcall OnMouseMove(long Flags, double X, double Y); void _stdcall OnLButtonDown(long Flags, double X, double Y); void _stdcall OnLButtonUp(long Flags, double X, double Y); }; public: CComInnerObject<CDocEventSink> m_DocEventSink; CComInnerObject<CWndEventSink> m_WndEventSink; CPGAX m_PGAX; IDocumentPtr m_spDocument; IWindowPtr m_spWindow; IShapePtr m_spShape; private: virtual BOOL OnInitDialog(); public: afx_msg void OnDestroy(); afx_msg void OnBnClickedLoad(); afx_msg void OnBnClickedNew(); afx_msg void OnBnClickedZoomin(); afx_msg void OnBnClickedZoomout(); afx_msg void OnBnClickedOk(); afx_msg void OnBnClickedGenbtn(); };
初始化非常简单,看起来像
IDispatchPtr spDispatch; spDispatch.Attach(m_PGAX.get_Document(), true); m_spDocument = spDispatch; m_spWindow = m_spDocument->Window; m_DocEventSink.m_pDlg = this; m_WndEventSink.m_pDlg = this; m_DocEventSink.DispEventAdvise(m_spDocument); m_WndEventSink.DispEventAdvise(m_spWindow);
现在我们准备好使用图形了。 让我们创建图层和文本
ILayerPtr spLayer; spLayer = m_spDocument->CreateLayer(-1, L"Layer"); spLayer->Active = VARIANT_TRUE; ITextClassPtr spTextClass; spTextClass = spLayer->CreateClass(ciText, NULL, 0, 0); spTextClass->Styles->Alignment = taCenter; spTextClass->Create(0.01, 0.01, _bstr_t("Move this text" " using\r\nmouse or open any\r\ndocument and move\r\nany shapes."));
结论
矢量图形 ActiveX 是向您的应用程序添加矢量图形支持并提高其功能的最简单方法。 此外,开发人员可以完全控制所有对象,以便他们不仅可以处理图形文档,还可以分析和可视化任何类型的流程等等。