From 863f21995955fb3e9aa471430218967d4e642c27 Mon Sep 17 00:00:00 2001
From: mrDarker <mr.darker@163.com>
Date: 星期四, 29 五月 2025 16:11:24 +0800
Subject: [PATCH] Merge branch 'liuyang'

---
 SourceCode/Bond/Servo/GridControl/NewCellTypes/GridCellCheck.cpp |  185 ++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 185 insertions(+), 0 deletions(-)

diff --git a/SourceCode/Bond/Servo/GridControl/NewCellTypes/GridCellCheck.cpp b/SourceCode/Bond/Servo/GridControl/NewCellTypes/GridCellCheck.cpp
new file mode 100644
index 0000000..2db8970
--- /dev/null
+++ b/SourceCode/Bond/Servo/GridControl/NewCellTypes/GridCellCheck.cpp
@@ -0,0 +1,185 @@
+// GridCellCheck.cpp : implementation file
+//
+// MFC Grid Control - Main grid cell class
+//
+// Provides the implementation for a combobox cell type of the
+// grid control.
+//
+// Written by Chris Maunder <chris@codeproject.com>
+// Copyright (c) 1998-2005. All Rights Reserved.
+//
+// Parts of the code contained in this file are based on the original
+// CInPlaceList from http://www.codeguru.com/listview
+//
+// This code may be used in compiled form in any way you desire. This
+// file may be redistributed unmodified by any means PROVIDING it is 
+// not sold for profit without the authors written consent, and 
+// providing that this notice and the authors name and all copyright 
+// notices remains intact. 
+//
+// An email letting me know how you are using it would be nice as well. 
+//
+// This file is provided "as is" with no expressed or implied warranty.
+// The author accepts no liability for any damage/loss of business that
+// this product may cause.
+//
+// For use with CGridCtrl v2.22+
+//
+// History:
+// 23 Jul 2001 - Complete rewrite
+// 13 Mar 2004 - GetCellExtent and GetCheckPlacement fixed by Yogurt
+//             - Read-only now honoured - Yogurt
+//
+/////////////////////////////////////////////////////////////////////////////
+
+#include "stdafx.h"
+#include "GridCell.h"
+#include "GridCtrl.h"
+#include "GridCellCheck.h"
+
+
+#ifdef _DEBUG
+#define new DEBUG_NEW
+#undef THIS_FILE
+static const char* THIS_FILE = __FILE__;
+#endif
+
+IMPLEMENT_DYNCREATE(CGridCellCheck, CGridCell)
+
+CGridCellCheck::CGridCellCheck() : CGridCell()
+{
+    m_bChecked = FALSE;
+    //m_Rect.IsRectNull();
+}
+
+CSize CGridCellCheck::GetCellExtent(CDC* pDC)
+{
+    // Using SM_CXHSCROLL as a guide to the size of the checkbox
+    int nWidth = GetSystemMetrics(SM_CXHSCROLL) + 2*GetMargin();	
+    CSize	cellSize = CGridCell::GetCellExtent(pDC);	
+    cellSize.cx += nWidth;	
+    cellSize.cy = max (cellSize.cy, nWidth);	
+    return  cellSize;
+}
+
+// i/o:  i=dims of cell rect; o=dims of text rect
+BOOL CGridCellCheck::GetTextRect( LPRECT pRect)
+{
+    BOOL bResult = CGridCell::GetTextRect(pRect);
+    if (bResult)
+    {
+        int nWidth = GetSystemMetrics(SM_CXHSCROLL) + 2*GetMargin();
+        pRect->left += nWidth;
+        if (pRect->left > pRect->right)
+            pRect->left = pRect->right;
+    }
+    return bResult;
+}
+
+// Override draw so that when the cell is selected, a drop arrow is shown in the RHS.
+BOOL CGridCellCheck::Draw(CDC* pDC, int nRow, int nCol, CRect rect,  BOOL bEraseBkgnd /*=TRUE*/)
+{
+    BOOL bResult = CGridCell::Draw(pDC, nRow, nCol, rect,  bEraseBkgnd);
+
+#ifndef _WIN32_WCE
+    // Store the cell's dimensions for later
+    m_Rect = rect;
+
+    CRect CheckRect = GetCheckPlacement();
+    rect.left = CheckRect.right;
+
+    // enough room to draw?
+    // if (CheckRect.Width() < rect.Width() && CheckRect.Height() < rect.Height()) {
+
+    // Do the draw 
+    pDC->DrawFrameControl(GetCheckPlacement(), DFC_BUTTON, 
+	    (m_bChecked)? DFCS_BUTTONCHECK | DFCS_CHECKED : DFCS_BUTTONCHECK);
+
+    // }
+#endif
+    return bResult;
+}
+
+void CGridCellCheck::OnClick(CPoint PointCellRelative)
+{
+	// PointCellRelative is relative to the topleft of the cell. Convert to client coords
+	PointCellRelative += m_Rect.TopLeft();
+
+    // Bail if cell is read-only
+    CCellID cell = GetGrid()->GetCellFromPt(PointCellRelative);	
+	if (GetGrid()->isCellMaskActivated(cell.row, cell.col))
+	{
+		if (!GetGrid()->isCellMaskEditable(cell.row, cell.col))
+		{
+			return;
+		}
+	}
+	else
+	{
+		if (!GetGrid()->IsCellEditable(cell))		
+			return;
+	}
+    
+	// GetCheckPlacement returns the checkbox dimensions in client coords. Only check/
+	// uncheck if the user clicked in the box
+	if (GetCheckPlacement().PtInRect(PointCellRelative))
+	{
+		m_bChecked = !m_bChecked;
+		GetGrid()->InvalidateRect(m_Rect);
+	}
+}
+
+//////////////////////////////////////////////////////////////////////
+// Operations
+//////////////////////////////////////////////////////////////////////
+
+BOOL CGridCellCheck::SetCheck(BOOL bChecked /*=TRUE*/)
+{
+	BOOL bTemp = m_bChecked;
+	m_bChecked = bChecked;
+	if (!m_Rect.IsRectEmpty())
+		GetGrid()->InvalidateRect(m_Rect);
+
+	return bTemp;
+}
+
+BOOL CGridCellCheck::GetCheck()
+{
+	return m_bChecked;
+}
+
+//////////////////////////////////////////////////////////////////////
+// Protected implementation
+//////////////////////////////////////////////////////////////////////
+
+// Returns the dimensions and placement of the checkbox in client coords.
+CRect CGridCellCheck::GetCheckPlacement()
+{
+	int nWidth = GetSystemMetrics(SM_CXHSCROLL);
+	CRect place = m_Rect + CSize(GetMargin(), GetMargin());
+    place.right = place.left + nWidth;
+    place.bottom = place.top + nWidth;
+
+	/* for centering
+	int nDiff = (place.Width() - nWidth)/2;
+	if (nDiff > 0)
+	{
+		place.left += nDiff;
+		place.right = place.left + nWidth;
+	}
+	nDiff = (place.Height() - nWidth)/2;
+	if (nDiff > 0)
+	{
+		place.top += nDiff;
+		place.bottom = place.top + nWidth;
+	}
+    */
+
+    if (m_Rect.Height() < nWidth + 2 * static_cast<int> (GetMargin())) 
+    {		
+        place.top = m_Rect.top + (m_Rect.Height() - nWidth) / 2;	    
+        place.bottom = place.top + nWidth;	
+    }
+
+	return place;
+}
\ No newline at end of file

--
Gitblit v1.9.3