| | |
| | | #pragma once |
| | | #include <afxwin.h> |
| | | #include <vector> |
| | | #include <functional> |
| | | |
| | | using SlotClickCallback = std::function<void(int nRow, int nCol)>; |
| | | |
| | | class CJobSlotGrid : public CWnd |
| | | { |
| | |
| | | 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_brushNoJob; |
| | | std::vector<std::vector<bool>> m_vSlotStatus; |
| | | std::vector<std::vector<CString>> m_vSlotText; |
| | | std::vector<std::vector<bool>> m_vSlotClickable; |
| | | SlotClickCallback m_fnSlotClickCallback; |
| | | |
| | | void DrawGrid(CDC* pDC); |
| | | }; |