From 3628a707a38e1c590216c5983c9b97b9c742f86c Mon Sep 17 00:00:00 2001
From: mrDarker <mr.darker@163.com>
Date: 星期一, 24 三月 2025 09:01:42 +0800
Subject: [PATCH] Merge branch 'clh' into liuyang
---
SourceCode/Bond/Servo/EqsGraphWnd.h | 235 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 235 insertions(+), 0 deletions(-)
diff --git a/SourceCode/Bond/Servo/EqsGraphWnd.h b/SourceCode/Bond/Servo/EqsGraphWnd.h
new file mode 100644
index 0000000..1c4ff41
--- /dev/null
+++ b/SourceCode/Bond/Servo/EqsGraphWnd.h
@@ -0,0 +1,235 @@
+#pragma once
+#include <functional>
+
+
+#ifndef EQSGRAPHWND_TAG
+
+#ifdef _WIN32
+
+#define EQSGRAPHWND_CLASSA "EqsGraphWnd"
+#define EQSGRAPHWND_CLASSW L"EqsGraphWnd"
+
+#ifdef UNICODE
+#define EQSGRAPHWND_CLASS EQSGRAPHWND_CLASSW
+#else
+#define EQSGRAPHWND_CLASS EQSGRAPHWND_CLASSA
+#endif
+
+#else
+#define EQSGRAPHWND_CLASS "EqsGraphWnd"
+#endif
+
+
+#define EQSGRAPHWND_TAG _T("EQSGRAPHWND_TAG")
+
+#define EQSGRAPHWND_FIRST (0U-2890U)
+#define EQSGRAPHWND_LAST (0U-2850U)
+#define EQSGRAPHWND_ (EQSGRAPHWND_FIRST - 1)
+
+
+#ifndef MIN
+#define MIN(X,Y) (((X)>(Y))?(Y):(X))
+#endif
+
+#ifndef MAX
+#define MAX(X,Y) (((X)>(Y))?(X):(Y))
+#endif
+
+typedef struct tagEQSGRAPHWND_NMHDR
+{
+ NMHDR nmhdr;
+ DWORD dwData;
+ DWORD dwData1;
+ DWORD dwData2;
+} EQSGRAPHWND_NMHDR;
+
+typedef struct tagEQITEM
+{
+ unsigned int id;
+ RECT rect;
+ char text[64];
+ BOOL bHighlight;
+ int nShowType;
+ DWORD_PTR pData;
+ DWORD_PTR pInPins;
+ DWORD_PTR pOutPins;
+ int nFlashFlag;
+} EQITEM;
+
+typedef struct tagPIN
+{
+ int nIndex;
+ int nType;
+ char text[64];
+ BOOL bHighlight;
+ EQITEM* pItem;
+ tagPIN *pConnectedPin;
+ POINT ptConnectedLine[6];
+ int nLinePtCount;
+ DWORD_PTR pData;
+} PIN;
+
+#define ITEM_NORMAL 0
+#define ITEM_SMALL 1
+#define ITEM_LARGE 2
+
+#endif
+
+typedef std::function<bool(PIN *pPin1, PIN *pPin2)> ONCONNECTPIN;
+typedef std::function<bool(PIN *pPin)> ONDISCONNECTPIN;
+typedef std::function<bool(EQITEM* pItem)> ONDELETEEQITEM;
+typedef std::function<void(EQITEM* pItem, int x, int y)> ONEQITEMPOSCHANGED;
+
+typedef struct _EqsGraphListener
+{
+ ONCONNECTPIN onConnectPin;
+ ONCONNECTPIN onCheckConnectPin;
+ ONDISCONNECTPIN onDisconnectPin;
+ ONDELETEEQITEM onDeleteEqItem;
+ ONEQITEMPOSCHANGED onEqItemPosChanged;
+ ONDELETEEQITEM onDblckEqItem;
+ ONDELETEEQITEM onRclickEqItem;
+} EqsGraphListener;
+
+class CEqsGraphWnd
+{
+ typedef struct tagRECTF
+ {
+ float left;
+ float top;
+ float right;
+ float bottom;
+ } RECTF;
+
+public:
+ CEqsGraphWnd();
+ ~CEqsGraphWnd();
+
+public:
+ static BOOL RegisterWndClass();
+ static CEqsGraphWnd* FromHandle(HWND hWnd);
+ void SetFrameColor(COLORREF color);
+ void SetBkgndColor(COLORREF color);
+
+public:
+ void EnableScroll(BOOL bEnable);
+ void EnableMultiSelect();
+ void SetItemRound(int nRound);
+ void SetDefaultItemBackgroundColor(COLORREF crNormal, COLORREF crSel);
+ void SetDefaultItemFrameColor(COLORREF crNormal, COLORREF crSel);
+ void SetDefaultItemTextColor(COLORREF crNormal, COLORREF crSel);
+ void SetOnListener(EqsGraphListener& listener);
+ BOOL SetCurSel(int nSel);
+ BOOL SetCurSel(CString strItemName);
+ BOOL SetCurSel(DWORD_PTR pData);
+ EQITEM * AddItem(int id, CString strText, DWORD_PTR dwData, int nType = ITEM_NORMAL);
+ void RemoveItem(EQITEM* pItem);
+ PIN * AddPin(EQITEM* pItem, int nType, CString strName, DWORD_PTR dwData);
+ int DeleteItem(EQITEM* pItem);
+ void DeleteAllItems();
+ void SetItemSelectState(int nIndex, BOOL bSelect);
+ void SetCurrentItem(EQITEM* pItem);
+ BOOL GetItemRect(EQITEM* pItem, LPRECT lpRect);
+ BOOL GetItemWarperRect(EQITEM* pItem, LPRECT lpRect);
+ BOOL GetInPinRect(EQITEM* pItem, int nPinIndex, LPRECT lpRect);
+ BOOL GetOutPinRect(EQITEM* pItem, int nPinIndex, LPRECT lpRect);
+ BOOL GetPinPoint(PIN *pPin, LPPOINT lpPoint);
+ EQITEM* GetItem(DWORD_PTR dwData);
+ PIN * GetPin(DWORD_PTR dwItemData, DWORD_PTR dwPinData);
+ int ConnectPin(DWORD_PTR dwItem1Data, DWORD_PTR dwPin1Data, DWORD_PTR dwItem2Data, DWORD_PTR dwPin2Data);
+ void SetItemText(EQITEM* pItem, CString strText);
+ void SetItemType(EQITEM* pItem, int type);
+ void SetItemPos(EQITEM* pItem, int x, int y);
+ void FlashItem(EQITEM* pItem);
+ void AnimationItem(EQITEM*pItem);
+
+private:
+ void Init();
+ void InitFont();
+ void Notify(int nCode, int dwData, int dwData1 = 0, int dwData2 = 0);
+ void Release();
+ void ReleaseItem(EQITEM* pItem);
+ void ReleaseAllItems();
+ void CalculateScollbar();
+ void CalculateMapPos();
+ void CalculateMagneticLine(EQITEM* pItem, LPRECT lprcItemRect, int &hoz, int &ver);
+ int HighTest(POINT pt, OUT EQITEM*& pItem, OUT PIN *& pPin);
+ int GetPinState(PIN *pPin);
+ void ClearConnectedLinePoint(EQITEM*& pItem);
+ void DrawMagneticLine(LPRECT lprcClient, int nHozLine1, int nHozLine2, int nVerLine1, int nVerLine2);
+ void DrawArrow(Gdiplus::Graphics *pGraphics, Gdiplus::Brush* pBrush, Gdiplus::Pen *pPen,
+ int x, int y, int nArrowLen);
+ void DrawDropItemRectangle(LPRECT lpRect1, LPRECT lpRect2);
+ void DrawPinConnectedLine(Gdiplus::Graphics *pGraphics, Gdiplus::Brush *pBrush, Gdiplus::Pen *pPen, LPPOINT lpPt1, LPPOINT lpPt2,
+ LPRECT lpRect1, LPRECT lpRect2, PIN *pOwnerPin);
+ void DrawPinWillConnectLine(COLORREF color, LPPOINT lpPt1, LPPOINT lpPt2);
+ double PointToSegDist(double x, double y, double x1, double y1, double x2, double y2);
+ static CEqsGraphWnd* Hook(HWND hWnd);
+ static LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
+ static LRESULT OnNcCreate(HWND hWnd, WPARAM wParam, LPARAM lParam);
+ LRESULT OnDestroy(WPARAM wParam, LPARAM lParam);
+ LRESULT OnTimer(WPARAM wParam, LPARAM lParam);
+ LRESULT OnNcPaint(WPARAM wParam, LPARAM lParam);
+ LRESULT OnPaint(WPARAM wParam, LPARAM lParam);
+ LRESULT OnMouseMove(WPARAM wParam, LPARAM lParam);
+ LRESULT OnLButtonDown(WPARAM wParam, LPARAM lParam);
+ LRESULT OnRButtonDown(WPARAM wParam, LPARAM lParam);
+ LRESULT OnLButtonDblclk(WPARAM wParam, LPARAM lParam);
+ LRESULT OnMouseWheel(WPARAM wParam, LPARAM lParam);
+ LRESULT OnMouseHWheel(WPARAM wParam, LPARAM lParam);
+ LRESULT OnKeyDown(WPARAM wParam, LPARAM lParam);
+ LRESULT OnSize(WPARAM wParam, LPARAM lParam);
+ LRESULT OnVScroll(WPARAM wParam, LPARAM lParam);
+ LRESULT OnHScroll(WPARAM wParam, LPARAM lParam);
+ LRESULT OnNitify(WPARAM wParam, LPARAM lParam);
+
+private:
+ EQITEM* m_pCurItem;
+ int m_nFlashCount;
+ EQITEM* m_pFlashItem;
+ EQITEM* m_pAnimationItem;
+ PIN * m_pCurPin;
+ PIN * m_pSelLineOutPin; // 选中的连线的两个pin中的out pin
+
+private:
+ HWND m_hWnd;
+ COLORREF m_crBkgnd;
+ COLORREF m_crFrame;
+ HFONT m_hFontTitle;
+
+private:
+ BOOL m_bUseGdiPlus; // 使用GDI+绘图?
+ COLORREF m_crItemBackground[2]; // item的颜色,normal, active
+ COLORREF m_crItemFrame[2]; // item的边框,normal, active
+ COLORREF m_crItemNameText[2];
+ COLORREF m_crItemIdText[2];
+ COLORREF m_crPinBkgnd[3]; // pin的颜色,normal, active, enable connect
+ int m_nCurSel;
+ EqsGraphListener m_listener;
+ CPtrArray m_arItem;
+ BOOL m_bMultiSelect;
+ int m_nItemRound;
+
+private:
+ int m_nStageCx; // 画布大小
+ int m_nStageCy;
+ int m_nOffsetX;
+ int m_nOffsetY;
+
+ // 动画
+ RECTF m_rcAnimation;
+ RECTF m_rcAninationStep;
+ int m_nAninationStep;
+ int m_nAninationDuration; // ms
+
+ // 字体
+ HFONT m_hFontName;
+ HFONT m_hFontId;
+
+private:
+ HWND m_hWndMapPos;
+ BOOL m_bEnableScroll;
+ int m_nMagneticLinHoz;
+ int m_nMagneticLinVer;
+};
+
--
Gitblit v1.9.3