mrDarker
2025-03-24 3628a707a38e1c590216c5983c9b97b9c742f86c
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;
};