#pragma once #include #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 ONCONNECTPIN; typedef std::function ONDISCONNECTPIN; typedef std::function ONDELETEEQITEM; typedef std::function ONEQITEMPOSCHANGED; typedef struct _EqsGraphListener { ONCONNECTPIN onConnectPin; ONCONNECTPIN onCheckConnectPin; ONDISCONNECTPIN onDisconnectPin; ONDELETEEQITEM onDeleteEqItem; ONEQITEMPOSCHANGED onEqItemPosChanged; ONDELETEEQITEM onDblckEqItem; ONDELETEEQITEM onRclickEqItem; ONDELETEEQITEM onSelectEqItem; } 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; };