#pragma once #include #include #include using SlotClickCallback = std::function; class CJobSlotGrid : public CWnd { DECLARE_DYNAMIC(CJobSlotGrid) public: CJobSlotGrid(); virtual ~CJobSlotGrid(); void SetGridSize(int nRows, int nCols); void SetColors(COLORREF colorHasJob, COLORREF colorNoJob); void SetSlotStatus(int nRow, int nCol, bool bHasJob, BOOL bInvalidate = TRUE); void SetSlotText(int nRow, int nCol, const CString& strText); void SetTextFont(const CString& strFontName, int nPointSize); void ClearAll(); void SetSlotClickable(int nRow, int nCol, bool bClickable); bool IsSlotClickable(int nRow, int nCol) const; void SetSlotClickCallback(SlotClickCallback fnCallback); protected: afx_msg void OnPaint(); afx_msg BOOL OnEraseBkgnd(CDC* pDC); afx_msg void OnMouseMove(UINT nFlags, CPoint point); afx_msg void OnMouseLeave(); afx_msg void OnLButtonDown(UINT nFlags, CPoint point); afx_msg void OnLButtonUp(UINT nFlags, CPoint point); DECLARE_MESSAGE_MAP() private: int m_nRows; int m_nCols; bool m_bLButtonDown = false; // Êó±êÊÇ·ñ°´Ï CPoint m_ptHover{ -1, -1 }; // µ±Ç°ÐüÍ£µÄ cell Ë÷Òý£¨row, col£© CFont m_fontText; COLORREF m_colorHasJob; COLORREF m_colorNoJob; CBrush m_brushHasJob; CBrush m_brushNoJob; std::vector> m_vSlotStatus; std::vector> m_vSlotText; std::vector> m_vSlotClickable; SlotClickCallback m_fnSlotClickCallback; void DrawGrid(CDC* pDC); };