#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 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;
|
};
|