| ¶Ô±ÈÐÂÎļþ |
| | |
| | | #include "stdafx.h" |
| | | #pragma once |
| | | |
| | | #include <vector> |
| | | |
| | | #ifndef _AFX |
| | | #include <afxwin.h> |
| | | #endif |
| | | |
| | | |
| | | // æ¾å° CCarrierSlotGrid ç±»å®ä¹åæå
é¨ public: åºé½å¯ |
| | | enum { CSGN_SEL_CHANGED = 1, CSGN_MAT_CHANGED = 2 }; |
| | | |
| | | struct CSG_SEL_CHANGE { |
| | | NMHDR hdr; // hdr.code = CSGN_SEL_CHANGED |
| | | int port; // 0..GetPortCount()-1 |
| | | int slot; // 0..GetSlotCount()-1 |
| | | BOOL checked; |
| | | }; |
| | | |
| | | struct CSG_MAT_CHANGE { |
| | | NMHDR hdr; // hdr.code = CSGN_MAT_CHANGED |
| | | int port; |
| | | int slot; |
| | | int material; // 1=G1, 2=G2 |
| | | }; |
| | | |
| | | |
| | | class CCarrierSlotGrid : public CWnd |
| | | { |
| | | public: |
| | | enum MaterialType { MAT_G1 = 1, MAT_G2 = 2 }; |
| | | |
| | | struct SlotCell { |
| | | bool hasGlass = false; |
| | | CString coreId; |
| | | int material = MAT_G1; |
| | | bool checked = false; |
| | | }; |
| | | struct PortColumn { |
| | | CString portName; |
| | | CString carrierName; |
| | | bool allocated = false; |
| | | CString allocatedBy; |
| | | std::vector<SlotCell> slots; |
| | | }; |
| | | |
| | | public: |
| | | CCarrierSlotGrid(); |
| | | virtual ~CCarrierSlotGrid(); |
| | | |
| | | BOOL SubclassDlgItem(UINT nID, CWnd* pParent) { |
| | | BOOL ok = CWnd::SubclassDlgItem(nID, pParent); |
| | | if (ok) { |
| | | if (pParent && pParent->GetFont()) SetFont(pParent->GetFont()); |
| | | EnsureFonts(); |
| | | Invalidate(FALSE); |
| | | } |
| | | return ok; |
| | | } |
| | | virtual void PreSubclassWindow() override; |
| | | |
| | | // åå§å |
| | | void InitGrid(int nPorts, int nSlots); |
| | | void SetColumnWidths(int slotColWidth, int portColWidth); |
| | | void SetRowHeight(int cy); |
| | | void SetHeaderHeight(int cy); |
| | | void SetShowMaterialToggle(BOOL bShow); |
| | | |
| | | // 读/å |
| | | int GetPortCount() const { return (int)m_ports.size(); } |
| | | int GetSlotCount() const { return m_nSlots; } |
| | | |
| | | void SetPortInfo(int portIndex, LPCTSTR portName, LPCTSTR carrierName); |
| | | void SetPortAllocated(int portIndex, BOOL allocated, LPCTSTR byName = nullptr); |
| | | BOOL IsPortAllocated(int portIndex) const; |
| | | |
| | | void SetSlotGlass(int portIndex, int slotIndex, BOOL hasGlass, LPCTSTR coreId, int material); |
| | | void SetSlotChecked(int portIndex, int slotIndex, BOOL checked, BOOL bNotify = FALSE); |
| | | BOOL GetSlotChecked(int portIndex, int slotIndex) const; |
| | | |
| | | int GetSlotMaterialType(int portIndex, int slotIndex) const; |
| | | void SetSlotMaterialType(int portIndex, int slotIndex, int material, BOOL bNotify = TRUE); |
| | | |
| | | CString GetDisplayId(int portIndex, int slotIndex) const; |
| | | void CheckAllInPort(int portIndex, BOOL checked, BOOL bNotify = TRUE); |
| | | |
| | | void RebuildTexts(); |
| | | void EnableColumnResize(BOOL enable) { m_bAllowResize = !!enable; Invalidate(FALSE); } |
| | | |
| | | // è®¡ç®æä½³å¤§å°ï¼ |
| | | // - CalcBestClientSizeï¼å
容åºåï¼ä¸å«æ»å¨æ¡/é客æ·åºï¼å好容纳表头+ææè¡ãå
¨é¨å |
| | | // - CalcBestWindowSizeï¼å¨å½åçªå£æ ·å¼ä¸ï¼å°âå
容大å°â转æ¢ä¸ºçªå£å¤æ¡å¤§å°ï¼ä¼èè WS_BORDER/CLIENTEDGE çï¼ |
| | | // é»è®¤æâéèæ»å¨æ¡âçç®æ æ¥ç®ï¼å³ä¸æ WS_HSCROLL/WS_VSCROLL 计å
¥è°æ´ï¼ |
| | | // è®¡ç®æä½³å¤§å°ï¼æ¯æå¯éå®å
¨è¾¹è·ï¼é»è®¤æ DPI 约çäº 2pxï¼ |
| | | CSize CalcBestClientSize(int nSlotsOverride = -1) const; |
| | | CSize CalcBestWindowSize(BOOL includeNonClient = TRUE, |
| | | int nSlotsOverride = -1, |
| | | int extraPadX = -1, // -1 表示æ DPI èªå¨ |
| | | int extraPadY = -1) const; |
| | | |
| | | // æ°¸ä¹
ç¦ç¨ç³»ç»æ»å¨æ¡ï¼å»ææ ·å¼å¹¶å·æ°é客æ·åºï¼ |
| | | void DisableSystemScrollbars(); |
| | | |
| | | // æçªå£å°ºå¯¸è°å°æ£å¥½å®¹çº³ææå
容ï¼ä¸åºç°æ»å¨æ¡ï¼ |
| | | void ResizeWindowToFitAll(BOOL includeNonClient = TRUE, int nSlotsOverride = -1); |
| | | |
| | | // è¿å
¥/éåºæ æ»å¨æ¡æ¨¡å¼ï¼å»æ ·å¼ãæ¸
æ»å¨ãå¿½ç¥æ»å¨æ¶æ¯ï¼ |
| | | void SetNoScrollbarsMode(BOOL enable); |
| | | |
| | | // å¨âæ æ»å¨æ¡æ¨¡å¼âä¸ï¼æçªå£å°ºå¯¸è°å°å好容纳ææå
容ï¼ä¸åºç°æ»å¨æ¡ï¼ |
| | | void FitWindowToContentNoScroll(BOOL includeNonClient = TRUE, int nSlotsOverride = -1); |
| | | |
| | | protected: |
| | | // æ°æ® |
| | | int m_nSlots = 0; |
| | | std::vector<PortColumn> m_ports; |
| | | BOOL m_bShowMatToggle = TRUE; |
| | | |
| | | // 尺寸/æ»å¨ |
| | | int m_rowHeight = 26; |
| | | int m_headerCY = 28; |
| | | int m_slotColCX = 100; |
| | | std::vector<int> m_portColCXs; |
| | | int m_scrollY = 0; |
| | | int m_scrollX = 0; |
| | | int m_slotColMin = 60; |
| | | int m_portColMin = 80; |
| | | |
| | | // é¢è² |
| | | COLORREF m_colBg = RGB(255, 255, 255); |
| | | COLORREF m_colAlt = RGB(240, 242, 245); |
| | | COLORREF m_colLock = RGB(255, 244, 214); |
| | | COLORREF m_gridMajor = RGB(210, 214, 220); |
| | | COLORREF m_gridMinor = RGB(220, 224, 230); |
| | | COLORREF m_text = RGB(40, 40, 40); |
| | | COLORREF m_textDim = RGB(150, 150, 150); |
| | | |
| | | // åä½ |
| | | CFont m_fntText; |
| | | CFont m_fntBold; |
| | | CFont m_fntSmall; |
| | | |
| | | // æå¨å宽 |
| | | bool m_bResizing = false; |
| | | int m_resizeEdge = -1; // 0=Slot|Port1ï¼1..N-1=Port i|i+1 |
| | | int m_resizeStartX = 0; |
| | | int m_slotColCXStart = 0; |
| | | std::vector<int> m_portColCXsStart; |
| | | int m_hitEdgeHover = -1; |
| | | bool m_bAllowResize = true; // â æ°å¢ï¼æ¯å¦å
许æå¨å宽 |
| | | bool m_noScrollbars = false; // â æ°å¢ï¼æ æ»å¨æ¡æ¨¡å¼ |
| | | |
| | | // å·¥å
· |
| | | void EnsureFonts(); |
| | | void UpdateScrollRange(); |
| | | int GetTotalContentWidth() const; |
| | | void NotifySelectionChanged(int port, int slot, BOOL checked); |
| | | void NotifyMaterialChanged(int port, int slot, int material); |
| | | |
| | | // å ä½ |
| | | CRect GetClientRectNoSB() const; |
| | | BOOL GetCellRect(int row, int sub, CRect& rc) const; // sub: 0=Slot, 1..N=Port |
| | | CRect GetHeaderRect() const; |
| | | CRect GetHeaderItemRect(int iItem) const; |
| | | CRect GetHeaderCheckboxRect(int iItem) const; |
| | | CRect GetCheckboxRect(const CRect& cell) const; |
| | | CRect GetMaterialTagRect(const CRect& cell) const; |
| | | CRect GetStatusDotRect(const CRect& cell) const; |
| | | BOOL IsColumnResizeEnabled() const { return m_bAllowResize ? TRUE : FALSE; } |
| | | |
| | | int HitHeaderEdge(CPoint pt) const; |
| | | |
| | | // ç»å¶ |
| | | void DrawFlatCheckbox(CDC* pDC, const CRect& r, bool checked, bool disabled); |
| | | void PaintTo(CDC* pDC); |
| | | |
| | | protected: |
| | | // æ¶æ¯ |
| | | afx_msg BOOL OnEraseBkgnd(CDC* pDC); |
| | | afx_msg void OnPaint(); |
| | | afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct); |
| | | afx_msg void OnSize(UINT nType, int cx, int cy); |
| | | afx_msg void OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar); |
| | | afx_msg void OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar); // â
çºµåæ»å¨æ¡ |
| | | afx_msg void OnLButtonDown(UINT nFlags, CPoint pt); |
| | | afx_msg void OnLButtonUp(UINT nFlags, CPoint pt); |
| | | afx_msg BOOL OnMouseWheel(UINT nFlags, short zDelta, CPoint pt); |
| | | afx_msg void OnMouseMove(UINT nFlags, CPoint pt); |
| | | afx_msg BOOL OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message); |
| | | afx_msg void OnShowWindow(BOOL bShow, UINT nStatus); |
| | | afx_msg void OnWindowPosChanged(WINDOWPOS* wp); |
| | | |
| | | DECLARE_MESSAGE_MAP() |
| | | }; |