65.9K
CodeProject 正在变化。 阅读更多。
Home

可编程矢量图形

starIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIconemptyStarIcon

1.10/5 (11投票s)

2004年12月30日

1分钟阅读

viewsIcon

91070

downloadIcon

2609

创建矢量图形编辑器,实现矢量图形ActiveX。

Sample Image - ProgrammVectorGraphics.jpg

引言

什么是矢量图形 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 是向您的应用程序添加矢量图形支持并提高其功能的最简单方法。 此外,开发人员可以完全控制所有对象,以便他们不仅可以处理图形文档,还可以分析和可视化任何类型的流程等等。

© . All rights reserved.