Document/Bond Server-Connect Function Manual.pdfBinary files differ
Document/BondÈí¼þ¿ª·¢½ø¶È±í.xlsxBinary files differ
SourceCode/Bond/BEQLibrary/BEQLibrary.vcxproj
@@ -199,7 +199,8 @@ <AdditionalIncludeDirectories>$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> </ResourceCompile> <PostBuildEvent> <Command>copy "$(SolutionDir)$(ProjectName)\IEquipment.h" "$(SolutionDir)BEQLibrarySDK\Include\IEquipment.h" <Command>mkdir "$(SolutionDir)BEQLibrarySDK\lib\$(Platform)\$(Configuration)" 2>nul copy "$(SolutionDir)$(ProjectName)\IEquipment.h" "$(SolutionDir)BEQLibrarySDK\Include\IEquipment.h" copy "$(SolutionDir)$(ProjectName)\IRemoteEquipment.h" "$(SolutionDir)BEQLibrarySDK\Include\IRemoteEquipment.h" copy "$(SolutionDir)$(ProjectName)\IUnit.h" "$(SolutionDir)BEQLibrarySDK\Include\IUnit.h" copy "$(SolutionDir)$(ProjectName)\IServo.h" "$(SolutionDir)BEQLibrarySDK\Include\IServo.h" SourceCode/Bond/BLControlsSDK/GridControl/CellRange.h
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,156 @@ /////////////////////////////////////////////////////////////////////// // CellRange.h: header file // // MFC Grid Control - interface for the CCellRange class. // // Written by Chris Maunder <cmaunder@mail.com> // Copyright (c) 1998-2002. All Rights Reserved. // // 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.20+ // ////////////////////////////////////////////////////////////////////// #if !defined(AFX_CELLRANGE_H__F86EF761_725A_11D1_ABBA_00A0243D1382__INCLUDED_) #define AFX_CELLRANGE_H__F86EF761_725A_11D1_ABBA_00A0243D1382__INCLUDED_ #if _MSC_VER >= 1000 #pragma once #endif // _MSC_VER >= 1000 // The code contained in this file is based on the original // WorldCom Grid control written by Joe Willcoxson, // mailto:chinajoe@aol.com // http://users.aol.com/chinajoe #ifndef max #define max(a,b) (((a) > (b)) ? (a) : (b)) #endif #ifndef min #define min(a,b) (((a) < (b)) ? (a) : (b)) #endif class AFX_EXT_CLASS CCellID { // Attributes public: int row, col; // Operations public: explicit CCellID(int nRow = -1, int nCol = -1) : row(nRow), col(nCol) {} int IsValid() const { return (row >= 0 && col >= 0); } int operator==(const CCellID& rhs) const { return (row == rhs.row && col == rhs.col); } int operator!=(const CCellID& rhs) const { return !operator==(rhs); } }; class CCellRange { public: CCellRange(int nMinRow = -1, int nMinCol = -1, int nMaxRow = -1, int nMaxCol = -1) { Set(nMinRow, nMinCol, nMaxRow, nMaxCol); } void Set(int nMinRow = -1, int nMinCol = -1, int nMaxRow = -1, int nMaxCol = -1); int IsValid() const; int InRange(int row, int col) const; int InRange(const CCellID& cellID) const; int Count() { return (m_nMaxRow - m_nMinRow + 1) * (m_nMaxCol - m_nMinCol + 1); } CCellID GetTopLeft() const; CCellRange Intersect(const CCellRange& rhs) const; int GetMinRow() const {return m_nMinRow;} void SetMinRow(int minRow) {m_nMinRow = minRow;} int GetMinCol() const {return m_nMinCol;} void SetMinCol(int minCol) {m_nMinCol = minCol;} int GetMaxRow() const {return m_nMaxRow;} void SetMaxRow(int maxRow) {m_nMaxRow = maxRow;} int GetMaxCol() const {return m_nMaxCol;} void SetMaxCol(int maxCol) {m_nMaxCol = maxCol;} int GetRowSpan() const {return m_nMaxRow - m_nMinRow + 1;} int GetColSpan() const {return m_nMaxCol - m_nMinCol + 1;} void operator=(const CCellRange& rhs); int operator==(const CCellRange& rhs); int operator!=(const CCellRange& rhs); protected: int m_nMinRow; int m_nMinCol; int m_nMaxRow; int m_nMaxCol; }; inline void CCellRange::Set(int minRow, int minCol, int maxRow, int maxCol) { m_nMinRow = minRow; m_nMinCol = minCol; m_nMaxRow = maxRow; m_nMaxCol = maxCol; } inline void CCellRange::operator=(const CCellRange& rhs) { if (this != &rhs) Set(rhs.m_nMinRow, rhs.m_nMinCol, rhs.m_nMaxRow, rhs.m_nMaxCol); } inline int CCellRange::operator==(const CCellRange& rhs) { return ((m_nMinRow == rhs.m_nMinRow) && (m_nMinCol == rhs.m_nMinCol) && (m_nMaxRow == rhs.m_nMaxRow) && (m_nMaxCol == rhs.m_nMaxCol)); } inline int CCellRange::operator!=(const CCellRange& rhs) { return !operator==(rhs); } inline int CCellRange::IsValid() const { return (m_nMinRow >= 0 && m_nMinCol >= 0 && m_nMaxRow >= 0 && m_nMaxCol >= 0 && m_nMinRow <= m_nMaxRow && m_nMinCol <= m_nMaxCol); } inline int CCellRange::InRange(int row, int col) const { return (row >= m_nMinRow && row <= m_nMaxRow && col >= m_nMinCol && col <= m_nMaxCol); } inline int CCellRange::InRange(const CCellID& cellID) const { return InRange(cellID.row, cellID.col); } inline CCellID CCellRange::GetTopLeft() const { return CCellID(m_nMinRow, m_nMinCol); } inline CCellRange CCellRange::Intersect(const CCellRange& rhs) const { return CCellRange(max(m_nMinRow,rhs.m_nMinRow), max(m_nMinCol,rhs.m_nMinCol), min(m_nMaxRow,rhs.m_nMaxRow), min(m_nMaxCol,rhs.m_nMaxCol)); } #endif // !defined(AFX_CELLRANGE_H__F86EF761_725A_11D1_ABBA_00A0243D1382__INCLUDED_) SourceCode/Bond/BLControlsSDK/GridControl/GridCell.h
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,143 @@ ///////////////////////////////////////////////////////////////////////////// // GridCell.h : header file // // MFC Grid Control - Grid cell class header file // // Written by Chris Maunder <chris@codeproject.com> // Copyright (c) 1998-2005. All Rights Reserved. // // 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.20+ // ////////////////////////////////////////////////////////////////////// #if !defined(AFX_GRIDCELL_H__519FA702_722C_11D1_ABBA_00A0243D1382__INCLUDED_) #define AFX_GRIDCELL_H__519FA702_722C_11D1_ABBA_00A0243D1382__INCLUDED_ #if _MSC_VER >= 1000 #pragma once #endif // _MSC_VER >= 1000 class CGridCtrl; #include "GridCellBase.h" // Each cell contains one of these. Fields "row" and "column" are not stored since we // will usually have acces to them in other ways, and they are an extra 8 bytes per // cell that is probably unnecessary. class AFX_EXT_CLASS CGridCell : public CGridCellBase { friend class CGridCtrl; DECLARE_DYNCREATE(CGridCell) // Construction/Destruction public: CGridCell(); virtual ~CGridCell(); // Attributes public: void operator=(const CGridCell& cell); virtual void SetText(LPCTSTR szText) { m_strText = szText; } virtual void SetImage(int nImage) { m_nImage = nImage; } virtual void SetData(LPARAM lParam) { m_lParam = lParam; } virtual void SetGrid(CGridCtrl* pGrid) { m_pGrid = pGrid; } // virtual void SetState(const DWORD nState); - use base class version virtual void SetFormat(DWORD nFormat) { m_nFormat = nFormat; } virtual void SetTextClr(COLORREF clr) { m_crFgClr = clr; } virtual void SetBackClr(COLORREF clr) { m_crBkClr = clr; } virtual void SetFont(const LOGFONT* plf); virtual void SetMargin(UINT nMargin) { m_nMargin = nMargin; } virtual CWnd* GetEditWnd() const { return m_pEditWnd; } virtual void SetCoords(int /*nRow*/, int /*nCol*/) {} // don't need to know the row and // column for base implementation virtual LPCTSTR GetText() const { return (m_strText.IsEmpty())? _T("") : LPCTSTR(m_strText); } virtual int GetImage() const { return m_nImage; } virtual LPARAM GetData() const { return m_lParam; } virtual CGridCtrl* GetGrid() const { return m_pGrid; } // virtual DWORD GetState() const - use base class virtual DWORD GetFormat() const; virtual COLORREF GetTextClr() const { return m_crFgClr; } // TODO: change to use default cell virtual COLORREF GetBackClr() const { return m_crBkClr; } virtual LOGFONT* GetFont() const; virtual CFont* GetFontObject() const; virtual UINT GetMargin() const; virtual BOOL IsEditing() const { return m_bEditing; } virtual BOOL IsDefaultFont() const { return (m_plfFont == NULL); } virtual void Reset(); // editing cells public: virtual BOOL Edit(int nRow, int nCol, CRect rect, CPoint point, UINT nID, UINT nChar); virtual void EndEdit(); protected: virtual void OnEndEdit(); protected: CString m_strText; // Cell text (or binary data if you wish...) LPARAM m_lParam; // 32-bit value to associate with item int m_nImage; // Index of the list view itemæ¯ icon DWORD m_nFormat; COLORREF m_crFgClr; COLORREF m_crBkClr; LOGFONT* m_plfFont; UINT m_nMargin; BOOL m_bEditing; // Cell being edited? CGridCtrl* m_pGrid; // Parent grid control CWnd* m_pEditWnd; }; // This class is for storing grid default values. It's a little heavy weight, so // don't use it in bulk class CGridDefaultCell : public CGridCell { DECLARE_DYNCREATE(CGridDefaultCell) // Construction/Destruction public: CGridDefaultCell(); virtual ~CGridDefaultCell(); public: virtual DWORD GetStyle() const { return m_dwStyle; } virtual void SetStyle(DWORD dwStyle) { m_dwStyle = dwStyle; } virtual int GetWidth() const { return m_Size.cx; } virtual int GetHeight() const { return m_Size.cy; } virtual void SetWidth(int nWidth) { m_Size.cx = nWidth; } virtual void SetHeight(int nHeight) { m_Size.cy = nHeight; } // Disable these properties virtual void SetData(LPARAM /*lParam*/) { ASSERT(FALSE); } virtual void SetState(DWORD /*nState*/) { ASSERT(FALSE); } virtual DWORD GetState() const { return CGridCell::GetState()|GVIS_READONLY; } virtual void SetCoords( int /*row*/, int /*col*/) { /*ASSERT(FALSE);*/ } virtual void SetFont(const LOGFONT* /*plf*/); virtual LOGFONT* GetFont() const; virtual CFont* GetFontObject() const; protected: CSize m_Size; // Default Size CFont m_Font; // Cached font DWORD m_dwStyle; // Cell Style - unused }; //{{AFX_INSERT_LOCATION}} // Microsoft Developer Studio will insert additional declarations immediately before the previous line. #endif // !defined(AFX_GRIDCELL_H__519FA702_722C_11D1_ABBA_00A0243D1382__INCLUDED_) SourceCode/Bond/BLControlsSDK/GridControl/GridCellBase.h
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,172 @@ ///////////////////////////////////////////////////////////////////////////// // GridCellBase.h : header file // // MFC Grid Control - Grid cell base class header file // // Written by Chris Maunder <chris@codeproject.com> // Copyright (c) 1998-2005. All Rights Reserved. // // 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+ // ////////////////////////////////////////////////////////////////////// #if !defined(AFX_GRIDCELLBASE_H__519FA702_722C_11D1_ABBA_00A0243D1382__INCLUDED_) #define AFX_GRIDCELLBASE_H__519FA702_722C_11D1_ABBA_00A0243D1382__INCLUDED_ #if _MSC_VER >= 1000 #pragma once #endif // _MSC_VER >= 1000 class CGridCtrl; // Cell states #define GVIS_FOCUSED 0x0001 #define GVIS_SELECTED 0x0002 #define GVIS_DROPHILITED 0x0004 #define GVIS_READONLY 0x0008 #define GVIS_FIXED 0x0010 #define GVIS_FIXEDROW 0x0020 #define GVIS_FIXEDCOL 0x0040 #define GVIS_MODIFIED 0x0080 // Cell data mask #define GVIF_TEXT LVIF_TEXT #define GVIF_IMAGE LVIF_IMAGE #define GVIF_PARAM LVIF_PARAM #define GVIF_STATE LVIF_STATE #define GVIF_BKCLR (GVIF_STATE<<1) #define GVIF_FGCLR (GVIF_STATE<<2) #define GVIF_FORMAT (GVIF_STATE<<3) #define GVIF_FONT (GVIF_STATE<<4) #define GVIF_MARGIN (GVIF_STATE<<5) #define GVIF_ALL (GVIF_TEXT|GVIF_IMAGE|GVIF_PARAM|GVIF_STATE|GVIF_BKCLR|GVIF_FGCLR| \ GVIF_FORMAT|GVIF_FONT|GVIF_MARGIN) // Used for Get/SetItem calls. typedef struct _GV_ITEM { int row,col; // Row and Column of item UINT mask; // Mask for use in getting/setting cell data UINT nState; // cell state (focus/hilighted etc) DWORD nFormat; // Format of cell int iImage; // index of the list view itemæ¯ icon COLORREF crBkClr; // Background colour (or CLR_DEFAULT) COLORREF crFgClr; // Forground colour (or CLR_DEFAULT) LPARAM lParam; // 32-bit value to associate with item LOGFONT lfFont; // Cell font UINT nMargin; // Internal cell margin CString strText; // Text in cell } GV_ITEM; // Each cell contains one of these. Fields "row" and "column" are not stored since we // will usually have acces to them in other ways, and they are an extra 8 bytes per // cell that is probably unnecessary. class AFX_EXT_CLASS CGridCellBase : public CObject { friend class CGridCtrl; DECLARE_DYNAMIC(CGridCellBase) // Construction/Destruction public: CGridCellBase(); virtual ~CGridCellBase(); // Attributes public: virtual void SetText(LPCTSTR /* szText */) = 0 ; virtual void SetImage(int /* nImage */) = 0 ; virtual void SetData(LPARAM /* lParam */) = 0 ; virtual void SetState(DWORD nState) { m_nState = nState; } virtual void SetFormat(DWORD /* nFormat */) = 0 ; virtual void SetTextClr(COLORREF /* clr */) = 0 ; virtual void SetBackClr(COLORREF /* clr */) = 0 ; virtual void SetFont(const LOGFONT* /* plf */) = 0 ; virtual void SetMargin( UINT /* nMargin */) = 0 ; virtual void SetGrid(CGridCtrl* /* pGrid */) = 0 ; virtual void SetCoords( int /* nRow */, int /* nCol */) = 0 ; virtual LPCTSTR GetText() const = 0 ; virtual LPCTSTR GetTipText() const { return GetText(); } // may override TitleTip return virtual int GetImage() const = 0 ; virtual LPARAM GetData() const = 0 ; virtual DWORD GetState() const { return m_nState; } virtual DWORD GetFormat() const = 0 ; virtual COLORREF GetTextClr() const = 0 ; virtual COLORREF GetBackClr() const = 0 ; virtual LOGFONT * GetFont() const = 0 ; virtual CFont * GetFontObject() const = 0 ; virtual CGridCtrl* GetGrid() const = 0 ; virtual CWnd * GetEditWnd() const = 0 ; virtual UINT GetMargin() const = 0 ; virtual CGridCellBase* GetDefaultCell() const; virtual BOOL IsDefaultFont() const = 0 ; virtual BOOL IsEditing() const = 0 ; virtual BOOL IsFocused() const { return (m_nState & GVIS_FOCUSED); } virtual BOOL IsFixed() const { return (m_nState & GVIS_FIXED); } virtual BOOL IsFixedCol() const { return (m_nState & GVIS_FIXEDCOL); } virtual BOOL IsFixedRow() const { return (m_nState & GVIS_FIXEDROW); } virtual BOOL IsSelected() const { return (m_nState & GVIS_SELECTED); } virtual BOOL IsReadOnly() const { return (m_nState & GVIS_READONLY); } virtual BOOL IsModified() const { return (m_nState & GVIS_MODIFIED); } virtual BOOL IsDropHighlighted() const { return (m_nState & GVIS_DROPHILITED); } // Operators public: virtual void operator=(const CGridCellBase& cell); // Operations public: virtual void Reset(); virtual BOOL Draw(CDC* pDC, int nRow, int nCol, CRect rect, BOOL bEraseBkgnd = TRUE); virtual BOOL GetTextRect( LPRECT pRect); // i/o: i=dims of cell rect; o=dims of text rect virtual BOOL GetTipTextRect( LPRECT pRect) { return GetTextRect( pRect); } // may override for btns, etc. virtual CSize GetTextExtent(LPCTSTR str, CDC* pDC = NULL); virtual CSize GetCellExtent(CDC* pDC); // Editing virtual BOOL Edit( int /* nRow */, int /* nCol */, CRect /* rect */, CPoint /* point */, UINT /* nID */, UINT /* nChar */) { return FALSE;} virtual BOOL ValidateEdit(LPCTSTR str); virtual void EndEdit() {} // EFW - Added to print cells properly virtual BOOL PrintCell(CDC* pDC, int nRow, int nCol, CRect rect); // add additional protected grid members required of cells LRESULT SendMessageToParent(int nRow, int nCol, int nMessage); protected: virtual void OnEndEdit(); virtual void OnMouseEnter(); virtual void OnMouseOver(); virtual void OnMouseLeave(); virtual void OnClick( CPoint PointCellRelative); virtual void OnClickDown( CPoint PointCellRelative); virtual void OnRClick( CPoint PointCellRelative); virtual void OnDblClick( CPoint PointCellRelative); virtual BOOL OnSetCursor(); protected: DWORD m_nState; // Cell state (selected/focus etc) }; //{{AFX_INSERT_LOCATION}} // Microsoft Developer Studio will insert additional declarations immediately before the previous line. #endif // !defined(AFX_GRIDCELLBASE_H__519FA702_722C_11D1_ABBA_00A0243D1382__INCLUDED_) SourceCode/Bond/BLControlsSDK/GridControl/GridCellButton.h
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,28 @@ #ifndef __GRID_CELL_BUTTON__ #define __GRID_CELL_BUTTON__ #include "GridCell.h" class AFX_EXT_CLASS CGridCellButton : public CGridCell { friend class CGridCtrl; DECLARE_DYNCREATE(CGridCellButton) public: CGridCellButton(void); virtual ~CGridCellButton(void); void SetPushing(BOOL bPush) {m_bPushing = bPush;} public: virtual BOOL Draw(CDC* pDC, int nRow, int nCol, CRect rect, BOOL bEraseBkgnd = TRUE); protected: virtual void OnClick(CPoint PointCellRelative); virtual void OnMouseLeave(); protected: CRect m_rect; BOOL m_bPushing; }; #endif SourceCode/Bond/BLControlsSDK/GridControl/GridCtrl.h
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,1088 @@ ///////////////////////////////////////////////////////////////////////////// // GridCtrl.h : header file // // MFC Grid Control - main header // // Written by Chris Maunder <chris@codeproject.com> // Copyright (c) 1998-2005. All Rights Reserved. // // 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.20+ // ////////////////////////////////////////////////////////////////////// // FEATURES BY Mukit, Ataul (2007-11-17): // 1. Merge Cell // 2. Ability to do XL Style Freeze Pane // 3. The Horizontal Gray Area Removed // FINDINGS: // 1. A cell cannot be edited if a tooltip is shown.. // 2. The InplaceEditCtrl is not multiline even if a cell can contain Multiline Text.. // 3. If a cell is too small, the InplaceEditCtrl is almost invisible.. #if !defined(AFX_GRIDCTRL_H__519FA702_722C_11D1_ABBA_00A0243D1382__INCLUDED_) #define AFX_GRIDCTRL_H__519FA702_722C_11D1_ABBA_00A0243D1382__INCLUDED_ #if _MSC_VER >= 1000 #pragma once #endif // _MSC_VER >= 1000 #include "CellRange.h" #include "GridCell.h" #include <afxtempl.h> #include <vector> using namespace std; struct CELL_ENABLE { CELL_ENABLE() { nEnable = -1; } void SetEnable(BOOL bValue) { nEnable = bValue; } BOOL isEnable() { if (nEnable == 0) { return FALSE; } else if (nEnable > 0) { return TRUE; } } BOOL isActivated() { if (nEnable < 0) { return FALSE; } else return TRUE; } int nEnable; }; /////////////////////////////////////////////////////////////////////////////////// // Defines - these determine the features (and the final size) of the final code /////////////////////////////////////////////////////////////////////////////////// //#define GRIDCONTROL_NO_TITLETIPS // Do not use titletips for cells with large data //#define GRIDCONTROL_NO_DRAGDROP // Do not use OLE drag and drop //#define GRIDCONTROL_NO_CLIPBOARD // Do not use clipboard routines #ifdef _WIN32_WCE # define GRIDCONTROL_NO_TITLETIPS // Do not use titletips for cells with large data # define GRIDCONTROL_NO_DRAGDROP // Do not use OLE drag and drop # define GRIDCONTROL_NO_CLIPBOARD // Do not use clipboard routines # define GRIDCONTROL_NO_PRINTING // Do not use printing routines # ifdef WCE_NO_PRINTING // Older versions of CE had different #def's # define _WIN32_WCE_NO_PRINTING # endif # ifdef WCE_NO_CURSOR # define _WIN32_WCE_NO_CURSOR # endif #endif // _WIN32_WCE // Use this as the classname when inserting this control as a custom control // in the MSVC++ dialog editor #define GRIDCTRL_CLASSNAME _T("MFCGridCtrl") // Window class name #define IDC_INPLACE_CONTROL 8 // ID of inplace edit controls /////////////////////////////////////////////////////////////////////////////////// // Conditional includes /////////////////////////////////////////////////////////////////////////////////// #ifndef GRIDCONTROL_NO_TITLETIPS # include "TitleTip.h" #endif #ifndef GRIDCONTROL_NO_DRAGDROP # include "GridDropTarget.h" # undef GRIDCONTROL_NO_CLIPBOARD // Force clipboard functions on #endif #ifndef GRIDCONTROL_NO_CLIPBOARD # include <afxole.h> #endif /////////////////////////////////////////////////////////////////////////////////// // Helper functions /////////////////////////////////////////////////////////////////////////////////// // Handy functions #define IsSHIFTpressed() ( (GetKeyState(VK_SHIFT) & (1 << (sizeof(SHORT)*8-1))) != 0 ) #define IsCTRLpressed() ( (GetKeyState(VK_CONTROL) & (1 << (sizeof(SHORT)*8-1))) != 0 ) // Backwards compatibility for pre 2.20 grid versions #define DDX_GridControl(pDX, nIDC, rControl) DDX_Control(pDX, nIDC, rControl) /////////////////////////////////////////////////////////////////////////////////// // Structures /////////////////////////////////////////////////////////////////////////////////// // This structure sent to Grid's parent in a WM_NOTIFY message typedef struct tagNM_GRIDVIEW { NMHDR hdr; int iRow; int iColumn; } NM_GRIDVIEW; // This is sent to the Grid from child in-place edit controls typedef struct tagGV_DISPINFO { NMHDR hdr; GV_ITEM item; } GV_DISPINFO; // This is sent to the Grid from child in-place edit controls typedef struct tagGV_CACHEHINT { NMHDR hdr; CCellRange range; } GV_CACHEHINT; // storage typedef for each row in the grid typedef CTypedPtrArray<CObArray, CGridCellBase*> GRID_ROW; // For virtual mode callback typedef BOOL (CALLBACK* GRIDCALLBACK)(GV_DISPINFO *, LPARAM); /////////////////////////////////////////////////////////////////////////////////// // Defines /////////////////////////////////////////////////////////////////////////////////// // Grid line/scrollbar selection #define GVL_NONE 0L // Neither #define GVL_HORZ 1L // Horizontal line or scrollbar #define GVL_VERT 2L // Vertical line or scrollbar #define GVL_BOTH 3L // Both // Autosizing option #define GVS_DEFAULT 0 #define GVS_HEADER 1 // Size using column fixed cells data only #define GVS_DATA 2 // Size using column non-fixed cells data only #define GVS_BOTH 3 // Size using column fixed and non-fixed // Cell Searching options #define GVNI_FOCUSED 0x0001 #define GVNI_SELECTED 0x0002 #define GVNI_DROPHILITED 0x0004 #define GVNI_READONLY 0x0008 #define GVNI_FIXED 0x0010 #define GVNI_MODIFIED 0x0020 // LUC #define GVNI_FREEZED 0x0040 #define GVNI_ABOVE LVNI_ABOVE #define GVNI_BELOW LVNI_BELOW #define GVNI_TOLEFT LVNI_TOLEFT #define GVNI_TORIGHT LVNI_TORIGHT #define GVNI_ALL (LVNI_BELOW|LVNI_TORIGHT|LVNI_TOLEFT) #define GVNI_AREA (LVNI_BELOW|LVNI_TORIGHT) // Hit test values (not yet implemented) #define GVHT_DATA 0x0000 #define GVHT_TOPLEFT 0x0001 #define GVHT_COLHDR 0x0002 #define GVHT_ROWHDR 0x0004 #define GVHT_COLSIZER 0x0008 #define GVHT_ROWSIZER 0x0010 #define GVHT_LEFT 0x0020 #define GVHT_RIGHT 0x0040 #define GVHT_ABOVE 0x0080 #define GVHT_BELOW 0x0100 // Messages sent to the grid's parent (More will be added in future) #define GVN_BEGINDRAG LVN_BEGINDRAG // LVN_FIRST-9 #define GVN_BEGINLABELEDIT LVN_BEGINLABELEDIT // LVN_FIRST-5 #define GVN_BEGINRDRAG LVN_BEGINRDRAG #define GVN_COLUMNCLICK LVN_COLUMNCLICK #define GVN_DELETEITEM LVN_DELETEITEM #define GVN_ENDLABELEDIT LVN_ENDLABELEDIT // LVN_FIRST-6 #define GVN_SELCHANGING LVN_ITEMCHANGING #define GVN_SELCHANGED LVN_ITEMCHANGED #define GVN_GETDISPINFO LVN_GETDISPINFO #define GVN_ODCACHEHINT LVN_ODCACHEHINT #define GVN_COMBOSELCHANGE LVN_FIRST-10 class CGridCtrl; ///////////////////////////////////////////////////////////////////////////// // CGridCtrl window typedef bool (*PVIRTUALCOMPARE)(int, int); class AFX_EXT_CLASS CGridCtrl : public CWnd { DECLARE_DYNCREATE(CGridCtrl) friend class CGridCell; friend class CGridCellBase; // Construction public: CGridCtrl(int nRows = 0, int nCols = 0, int nFixedRows = 0, int nFixedCols = 0); BOOL Create(const RECT& rect, CWnd* parent, UINT nID, DWORD dwStyle = WS_CHILD | WS_BORDER | WS_TABSTOP | WS_VISIBLE); /////////////////////////////////////////////////////////////////////////////////// // Attributes /////////////////////////////////////////////////////////////////////////////////// public: ///// LUC /////////////////////////////////////////////////////////////////////// //// LUC : MergeCell//////// INT_PTR MergeCells(CCellRange& mergedCellRange); void SplitCells(INT_PTR nMergeID); BOOL IsMergedCell(int row, int col, CCellRange& mergedCellRange); BOOL GetMergedCellRect(int row, int col, CRect& rect); BOOL GetMergedCellRect(CCellRange& mergedCell, CRect& rect); BOOL GetTopLeftMergedCell(int& row, int& col, CRect& mergeRect); BOOL GetBottomRightMergedCell(int& row, int& col, CRect& mergeRect); virtual BOOL IsFocused(CGridCellBase& cell, int nRow, int nCol); virtual BOOL IsSelected(CGridCellBase& cell, int nRow, int nCol); BOOL m_bDrawingMergedCell; INT_PTR m_nCurrentMergeID; static CRect rectNull; static CCellID cellNull; // LUC : Freeze Rows BOOL SetFreezedRowCount(int nFreezedRows) { BOOL bRet = FALSE; if( (nFreezedRows >= 0) && ((nFreezedRows + m_nFixedRows) <= m_nRows) ) { m_nFreezedRows = nFreezedRows; ResetScrollBars(); Refresh(); bRet = TRUE; } return bRet; } BOOL SetFreezedColumnCount(int nFreezedCols) { BOOL bRet = FALSE; if( (nFreezedCols >= 0) && ((nFreezedCols + m_nFixedCols) <= m_nCols) ) { m_nFreezedCols = nFreezedCols; ResetScrollBars(); Refresh(); bRet = TRUE; } return bRet; } // To avoid calling ResetScrollBars twice you can use SetFreezedFrame BOOL SetFreezedFrame(int nFreezedRows, int nFreezedCols) { BOOL bRet = FALSE; if( (nFreezedRows >= 0) && ((nFreezedRows + m_nFixedRows) <= m_nRows) ) { m_nFreezedRows = nFreezedRows; bRet = TRUE; } if( (nFreezedCols >= 0) && ((nFreezedCols + m_nFixedCols) <= m_nCols) ) { m_nFreezedCols = nFreezedCols; bRet = TRUE; } else { bRet = FALSE; } ResetScrollBars(); return bRet; } int GetFreezedRowCount() const { return m_nFreezedRows; } int GetFreezedColumnCount() const { return m_nFreezedCols; } void ShowHorzNonGridArea(BOOL bShow) { m_bShowHorzNonGridArea = bShow; } BOOL IsShowingHorzNonGridArea() { return m_bShowHorzNonGridArea; } /////////////////////////////////////////////////////////////////////////////////////// int GetRowCount() const { return m_nRows; } int GetColumnCount() const { return m_nCols; } int GetFixedRowCount(BOOL bIncludeFreezedRows = FALSE) const { return (bIncludeFreezedRows) ? (m_nFixedRows + m_nFreezedRows) : m_nFixedRows; } int GetFixedColumnCount(BOOL bIncludeFreezedCols = FALSE) const { return (bIncludeFreezedCols) ? (m_nFixedCols + m_nFreezedCols) : m_nFixedCols; } BOOL SetRowCount(int nRows = 10); BOOL SetColumnCount(int nCols = 10); BOOL UpdateCellEditableMask(); BOOL SetFixedRowCount(int nFixedRows = 1); BOOL SetFixedColumnCount(int nFixedCols = 1); public: int GetRowHeight(int nRow) const; BOOL SetRowHeight(int row, int height); int GetColumnWidth(int nCol) const; BOOL SetColumnWidth(int col, int width); BOOL GetCellOrigin(int nRow, int nCol, LPPOINT p); BOOL GetCellOrigin(const CCellID& cell, LPPOINT p); BOOL GetCellRect(int nRow, int nCol, LPRECT pRect); BOOL GetCellRect(const CCellID& cell, LPRECT pRect); BOOL GetTextRect(const CCellID& cell, LPRECT pRect); BOOL GetTextRect(int nRow, int nCol, LPRECT pRect); BOOL SetCellMaskEditable(int nRow, int nCol, BOOL bEditable); BOOL isCellMaskEditable(int nRow, int nCol); BOOL isCellMaskActivated(int nRow, int nCol); // LUC // Change for MergeCell CCellID GetCellFromPt(CPoint point, BOOL bAllowFixedCellCheck = TRUE, CCellID& cellOriginal = cellNull); // LUC //int GetFixedRowHeight() const; //int GetFixedColumnWidth() const; int GetFixedRowHeight(BOOL bIncludeFreezedRows = FALSE) const; int GetFixedColumnWidth(BOOL bIncludeFreezedCols = FALSE) const; long GetVirtualWidth() const; long GetVirtualHeight() const; CSize GetTextExtent(int nRow, int nCol, LPCTSTR str); // EFW - Get extent of current text in cell inline CSize GetCellTextExtent(int nRow, int nCol) { return GetTextExtent(nRow, nCol, GetItemText(nRow,nCol)); } void SetGridBkColor(COLORREF clr) { m_crGridBkColour = clr; } COLORREF GetGridBkColor() const { return m_crGridBkColour; } void SetGridLineColor(COLORREF clr) { m_crGridLineColour = clr; } COLORREF GetGridLineColor() const { return m_crGridLineColour; } void SetTitleTipBackClr(COLORREF clr = CLR_DEFAULT) { m_crTTipBackClr = clr; } COLORREF GetTitleTipBackClr() { return m_crTTipBackClr; } void SetTitleTipTextClr(COLORREF clr = CLR_DEFAULT) { m_crTTipTextClr = clr; } COLORREF GetTitleTipTextClr() { return m_crTTipTextClr; } // ***************************************************************************** // // These have been deprecated. Use GetDefaultCell and then set the colors void SetTextColor(COLORREF clr) { m_cellDefault.SetTextClr(clr); } COLORREF GetTextColor() { return m_cellDefault.GetTextClr(); } void SetTextBkColor(COLORREF clr) { m_cellDefault.SetBackClr(clr); } COLORREF GetTextBkColor() { return m_cellDefault.GetBackClr(); } void SetFixedTextColor(COLORREF clr) { m_cellFixedRowDef.SetTextClr(clr); m_cellFixedColDef.SetTextClr(clr); m_cellFixedRowColDef.SetTextClr(clr); } COLORREF GetFixedTextColor() const { return m_cellFixedRowDef.GetTextClr(); } void SetFixedBkColor(COLORREF clr) { m_cellFixedRowDef.SetBackClr(clr); m_cellFixedColDef.SetBackClr(clr); m_cellFixedRowColDef.SetBackClr(clr); } COLORREF GetFixedBkColor() const { return m_cellFixedRowDef.GetBackClr(); } void SetGridColor(COLORREF clr) { SetGridLineColor(clr); } COLORREF GetGridColor() { return GetGridLineColor(); } void SetBkColor(COLORREF clr) { SetGridBkColor(clr); } COLORREF GetBkColor() { return GetGridBkColor(); } void SetDefCellMargin( int nMargin) { m_cellDefault.SetMargin(nMargin); m_cellFixedRowDef.SetMargin(nMargin); m_cellFixedColDef.SetMargin(nMargin); m_cellFixedRowColDef.SetMargin(nMargin); } int GetDefCellMargin() const { return m_cellDefault.GetMargin(); } int GetDefCellHeight() const { return m_cellDefault.GetHeight(); } void SetDefCellHeight(int nHeight) { m_cellDefault.SetHeight(nHeight); m_cellFixedRowDef.SetHeight(nHeight); m_cellFixedColDef.SetHeight(nHeight); m_cellFixedRowColDef.SetHeight(nHeight); } int GetDefCellWidth() const { return m_cellDefault.GetWidth(); } void SetDefCellWidth(int nWidth) { m_cellDefault.SetWidth(nWidth); m_cellFixedRowDef.SetWidth(nWidth); m_cellFixedColDef.SetWidth(nWidth); m_cellFixedRowColDef.SetWidth(nWidth); } // ***************************************************************************** // int GetSelectedCount() const { return (int)m_SelectedCellMap.GetCount(); } CCellID SetFocusCell(CCellID cell); CCellID SetFocusCell(int nRow, int nCol); CCellID GetFocusCell() const { return m_idCurrentCell; } void SetVirtualMode(BOOL bVirtual); BOOL GetVirtualMode() const { return m_bVirtualMode; } void SetCallbackFunc(GRIDCALLBACK pCallback, LPARAM lParam) { m_pfnCallback = pCallback; m_lParam = lParam; } GRIDCALLBACK GetCallbackFunc() { return m_pfnCallback; } void SetImageList(CImageList* pList) { m_pImageList = pList; } CImageList* GetImageList() const { return m_pImageList; } void SetGridLines(int nWhichLines = GVL_BOTH); int GetGridLines() const { return m_nGridLines; } void SetEditable(BOOL bEditable = TRUE) { m_bEditable = bEditable; } BOOL IsEditable() const { return m_bEditable; } void SetListMode(BOOL bEnableListMode = TRUE); BOOL GetListMode() const { return m_bListMode; } void SetSingleRowSelection(BOOL bSing = TRUE) { m_bSingleRowSelection = bSing; } BOOL GetSingleRowSelection() { return m_bSingleRowSelection & m_bListMode; } void SetSingleColSelection(BOOL bSing = TRUE) { m_bSingleColSelection = bSing; } BOOL GetSingleColSelection() { return m_bSingleColSelection; } void EnableSelection(BOOL bEnable = TRUE) { ResetSelectedRange(); m_bEnableSelection = bEnable; ResetSelectedRange(); } BOOL IsSelectable() const { return m_bEnableSelection; } void SetFixedColumnSelection(BOOL bSelect) { m_bFixedColumnSelection = bSelect;} BOOL GetFixedColumnSelection() { return m_bFixedColumnSelection; } void SetFixedRowSelection(BOOL bSelect) { m_bFixedRowSelection = bSelect; } BOOL GetFixedRowSelection() { return m_bFixedRowSelection; } void EnableDragAndDrop(BOOL bAllow = TRUE) { m_bAllowDragAndDrop = bAllow; } BOOL GetDragAndDrop() const { return m_bAllowDragAndDrop; } void SetRowResize(BOOL bResize = TRUE) { m_bAllowRowResize = bResize; } BOOL GetRowResize() const { return m_bAllowRowResize; } void SetColumnResize(BOOL bResize = TRUE) { m_bAllowColumnResize = bResize; } BOOL GetColumnResize() const { return m_bAllowColumnResize; } void SetHeaderSort(BOOL bSortOnClick = TRUE) { m_bSortOnClick = bSortOnClick; } BOOL GetHeaderSort() const { return m_bSortOnClick; } void SetHandleTabKey(BOOL bHandleTab = TRUE) { m_bHandleTabKey = bHandleTab; } BOOL GetHandleTabKey() const { return m_bHandleTabKey; } void SetDoubleBuffering(BOOL bBuffer = TRUE) { m_bDoubleBuffer = bBuffer; } BOOL GetDoubleBuffering() const { return m_bDoubleBuffer; } void EnableTitleTips(BOOL bEnable = TRUE) { m_bTitleTips = bEnable; } BOOL GetTitleTips() { return m_bTitleTips; } void SetSortColumn(int nCol); int GetSortColumn() const { return m_nSortColumn; } void SetSortAscending(BOOL bAscending) { m_bAscending = bAscending; } BOOL GetSortAscending() const { return m_bAscending; } void SetTrackFocusCell(BOOL bTrack) { m_bTrackFocusCell = bTrack; } BOOL GetTrackFocusCell() { return m_bTrackFocusCell; } void SetFrameFocusCell(BOOL bFrame) { m_bFrameFocus = bFrame; } BOOL GetFrameFocusCell() { return m_bFrameFocus; } void SetAutoSizeStyle(int nStyle = GVS_BOTH) { m_nAutoSizeColumnStyle = nStyle; } int GetAutoSizeStyle() { return m_nAutoSizeColumnStyle; } void EnableHiddenColUnhide(BOOL bEnable = TRUE){ m_bHiddenColUnhide = bEnable; } BOOL GetHiddenColUnhide() { return m_bHiddenColUnhide; } void EnableHiddenRowUnhide(BOOL bEnable = TRUE){ m_bHiddenRowUnhide = bEnable; } BOOL GetHiddenRowUnhide() { return m_bHiddenRowUnhide; } void EnableColumnHide(BOOL bEnable = TRUE) { m_bAllowColHide = bEnable; } BOOL GetColumnHide() { return m_bAllowColHide; } void EnableRowHide(BOOL bEnable = TRUE) { m_bAllowRowHide = bEnable; } BOOL GetRowHide() { return m_bAllowRowHide; } /////////////////////////////////////////////////////////////////////////////////// // default Grid cells. Use these for setting default values such as colors and fonts /////////////////////////////////////////////////////////////////////////////////// public: CGridCellBase* GetDefaultCell(BOOL bFixedRow, BOOL bFixedCol) const; /////////////////////////////////////////////////////////////////////////////////// // Grid cell Attributes /////////////////////////////////////////////////////////////////////////////////// public: CGridCellBase* GetCell(int nRow, int nCol) const; // Get the actual cell! void SetModified(BOOL bModified = TRUE, int nRow = -1, int nCol = -1); BOOL GetModified(int nRow = -1, int nCol = -1); BOOL IsCellFixed(int nRow, int nCol); BOOL SetItem(const GV_ITEM* pItem); BOOL GetItem(GV_ITEM* pItem); BOOL SetItemText(int nRow, int nCol, LPCTSTR str); // The following was virtual. If you want to override, use // CGridCellBase-derived class's GetText() to accomplish same thing CString GetItemText(int nRow, int nCol) const; // EFW - 06/13/99 - Added to support printf-style formatting codes. // Also supports use with a string resource ID #if !defined(_WIN32_WCE) || (_WIN32_WCE >= 210) BOOL SetItemTextFmt(int nRow, int nCol, LPCTSTR szFmt, ...); BOOL SetItemTextFmtID(int nRow, int nCol, UINT nID, ...); #endif BOOL SetItemData(int nRow, int nCol, LPARAM lParam); LPARAM GetItemData(int nRow, int nCol) const; BOOL SetItemImage(int nRow, int nCol, int iImage); int GetItemImage(int nRow, int nCol) const; BOOL SetItemState(int nRow, int nCol, UINT state); UINT GetItemState(int nRow, int nCol) const; BOOL SetItemFormat(int nRow, int nCol, UINT nFormat); UINT GetItemFormat(int nRow, int nCol) const; BOOL SetItemBkColour(int nRow, int nCol, COLORREF cr = CLR_DEFAULT); COLORREF GetItemBkColour(int nRow, int nCol) const; BOOL SetItemFgColour(int nRow, int nCol, COLORREF cr = CLR_DEFAULT); COLORREF GetItemFgColour(int nRow, int nCol) const; BOOL SetItemFont(int nRow, int nCol, const LOGFONT* lf); const LOGFONT* GetItemFont(int nRow, int nCol); BOOL IsItemEditing(int nRow, int nCol); BOOL SetCellType(int nRow, int nCol, CRuntimeClass* pRuntimeClass); BOOL SetDefaultCellType( CRuntimeClass* pRuntimeClass); /////////////////////////////////////////////////////////////////////////////////// // Operations /////////////////////////////////////////////////////////////////////////////////// public: int InsertColumn(LPCTSTR strHeading, UINT nFormat = DT_CENTER|DT_VCENTER|DT_SINGLELINE, int nColumn = -1); int InsertRow(LPCTSTR strHeading, int nRow = -1); BOOL DeleteColumn(int nColumn); BOOL DeleteRow(int nRow); BOOL DeleteNonFixedRows(); BOOL DeleteAllItems(); void ClearCells(CCellRange Selection); BOOL AutoSizeRow(int nRow, BOOL bResetScroll = TRUE); BOOL AutoSizeColumn(int nCol, UINT nAutoSizeStyle = GVS_DEFAULT, BOOL bResetScroll = TRUE); void AutoSizeRows(); void AutoSizeColumns(UINT nAutoSizeStyle = GVS_DEFAULT); void AutoSize(UINT nAutoSizeStyle = GVS_DEFAULT); void ExpandColumnsToFit(BOOL bExpandFixed = TRUE); void ExpandLastColumn(); void ExpandRowsToFit(BOOL bExpandFixed = TRUE); void ExpandToFit(BOOL bExpandFixed = TRUE); void Refresh(); void AutoFill(); // Fill grid with blank cells void EnsureVisible(CCellID &cell) { EnsureVisible(cell.row, cell.col); } void EnsureVisible(int nRow, int nCol); BOOL IsCellVisible(int nRow, int nCol); BOOL IsCellVisible(CCellID cell); BOOL IsCellEditable(int nRow, int nCol) const; BOOL IsCellEditable(CCellID &cell) const; BOOL IsCellSelected(int nRow, int nCol) const; BOOL IsCellSelected(CCellID &cell) const; // SetRedraw stops/starts redraws on things like changing the # rows/columns // and autosizing, but not for user-intervention such as resizes void SetRedraw(BOOL bAllowDraw, BOOL bResetScrollBars = FALSE); BOOL RedrawCell(int nRow, int nCol, CDC* pDC = NULL); BOOL RedrawCell(const CCellID& cell, CDC* pDC = NULL); BOOL RedrawRow(int row); BOOL RedrawColumn(int col); #ifndef _WIN32_WCE BOOL Save(LPCTSTR filename, TCHAR chSeparator = _T(',')); BOOL Load(LPCTSTR filename, TCHAR chSeparator = _T(',')); #endif /////////////////////////////////////////////////////////////////////////////////// // Cell Ranges /////////////////////////////////////////////////////////////////////////////////// public: CCellRange GetCellRange() const; CCellRange GetSelectedCellRange() const; void SetSelectedRange(const CCellRange& Range, BOOL bForceRepaint = FALSE, BOOL bSelectCells = TRUE); void SetSelectedRange(int nMinRow, int nMinCol, int nMaxRow, int nMaxCol, BOOL bForceRepaint = FALSE, BOOL bSelectCells = TRUE); BOOL IsValid(int nRow, int nCol) const; BOOL IsValid(const CCellID& cell) const; BOOL IsValid(const CCellRange& range) const; /////////////////////////////////////////////////////////////////////////////////// // Clipboard, drag and drop, and cut n' paste operations /////////////////////////////////////////////////////////////////////////////////// #ifndef GRIDCONTROL_NO_CLIPBOARD virtual void CutSelectedText(); virtual COleDataSource* CopyTextFromGrid(); virtual BOOL PasteTextToGrid(CCellID cell, COleDataObject* pDataObject, BOOL bSelectPastedCells=TRUE); #endif #ifndef GRIDCONTROL_NO_DRAGDROP public: virtual void OnBeginDrag(); virtual DROPEFFECT OnDragEnter(COleDataObject* pDataObject, DWORD dwKeyState, CPoint point); virtual DROPEFFECT OnDragOver(COleDataObject* pDataObject, DWORD dwKeyState, CPoint point); virtual void OnDragLeave(); virtual BOOL OnDrop(COleDataObject* pDataObject, DROPEFFECT dropEffect, CPoint point); #endif #ifndef GRIDCONTROL_NO_CLIPBOARD virtual void OnEditCut(); virtual void OnEditCopy(); virtual void OnEditPaste(); #endif virtual void OnEditSelectAll(); /////////////////////////////////////////////////////////////////////////////////// // Misc. /////////////////////////////////////////////////////////////////////////////////// public: CCellID GetNextItem(CCellID& cell, int nFlags) const; BOOL SortItems(int nCol, BOOL bAscending, LPARAM data = 0); BOOL SortTextItems(int nCol, BOOL bAscending, LPARAM data = 0); BOOL SortItems(PFNLVCOMPARE pfnCompare, int nCol, BOOL bAscending, LPARAM data = 0); void SetCompareFunction(PFNLVCOMPARE pfnCompare); // in-built sort functions static int CALLBACK pfnCellTextCompare(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort); static int CALLBACK pfnCellNumericCompare(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort); /////////////////////////////////////////////////////////////////////////////////// // Printing /////////////////////////////////////////////////////////////////////////////////// #if !defined(_WIN32_WCE_NO_PRINTING) && !defined(GRIDCONTROL_NO_PRINTING) public: void Print(CPrintDialog* pPrntDialog = NULL); // EFW - New printing support functions void EnableWysiwygPrinting(BOOL bEnable = TRUE) { m_bWysiwygPrinting = bEnable; } BOOL GetWysiwygPrinting() { return m_bWysiwygPrinting; } void SetShadedPrintOut(BOOL bEnable = TRUE) { m_bShadedPrintOut = bEnable; } BOOL GetShadedPrintOut(void) { return m_bShadedPrintOut; } // Use -1 to have it keep the existing value void SetPrintMarginInfo(int nHeaderHeight, int nFooterHeight, int nLeftMargin, int nRightMargin, int nTopMargin, int nBottomMargin, int nGap); void GetPrintMarginInfo(int &nHeaderHeight, int &nFooterHeight, int &nLeftMargin, int &nRightMargin, int &nTopMargin, int &nBottomMargin, int &nGap); /////////////////////////////////////////////////////////////////////////////////// // Printing overrides for derived classes /////////////////////////////////////////////////////////////////////////////////// public: virtual void OnBeginPrinting(CDC *pDC, CPrintInfo *pInfo); virtual void OnPrint(CDC *pDC, CPrintInfo *pInfo); virtual void OnEndPrinting(CDC *pDC, CPrintInfo *pInfo); #endif // #if !defined(_WIN32_WCE_NO_PRINTING) && !defined(GRIDCONTROL_NO_PRINTING) // Implementation public: virtual ~CGridCtrl(); protected: BOOL RegisterWindowClass(); BOOL Initialise(); void SetupDefaultCells(); LRESULT SendMessageToParent(int nRow, int nCol, int nMessage) const; LRESULT SendDisplayRequestToParent(GV_DISPINFO* pDisplayInfo) const; LRESULT SendCacheHintToParent(const CCellRange& range) const; BOOL InvalidateCellRect(const int row, const int col); BOOL InvalidateCellRect(const CCellID& cell); BOOL InvalidateCellRect(const CCellRange& cellRange); void EraseBkgnd(CDC* pDC); BOOL GetCellRangeRect(const CCellRange& cellRange, LPRECT lpRect); BOOL SetCell(int nRow, int nCol, CGridCellBase* pCell); int SetMouseMode(int nMode) { int nOldMode = m_MouseMode; m_MouseMode = nMode; return nOldMode; } int GetMouseMode() const { return m_MouseMode; } BOOL MouseOverRowResizeArea(CPoint& point); BOOL MouseOverColumnResizeArea(CPoint& point); CCellID GetTopleftNonFixedCell(BOOL bForceRecalculation = FALSE); CCellRange GetUnobstructedNonFixedCellRange(BOOL bForceRecalculation = FALSE); // LUC CCellRange GetVisibleNonFixedCellRange(LPRECT pRect = NULL, BOOL bForceRecalculation = FALSE); CCellRange GetVisibleFixedCellRange(LPRECT pRect = NULL, BOOL bForceRecalculation = FALSE); BOOL IsVisibleVScroll() { return ( (m_nBarState & GVL_VERT) > 0); } BOOL IsVisibleHScroll() { return ( (m_nBarState & GVL_HORZ) > 0); } void ResetSelectedRange(); void ResetScrollBars(); void EnableScrollBars(int nBar, BOOL bEnable = TRUE); int GetScrollPos32(int nBar, BOOL bGetTrackPos = FALSE); BOOL SetScrollPos32(int nBar, int nPos, BOOL bRedraw = TRUE); BOOL SortTextItems(int nCol, BOOL bAscending, int low, int high); BOOL SortItems(PFNLVCOMPARE pfnCompare, int nCol, BOOL bAscending, LPARAM data, int low, int high); CPoint GetPointClicked(int nRow, int nCol, const CPoint& point); void ValidateAndModifyCellContents(int nRow, int nCol, LPCTSTR strText); // Overrrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CGridCtrl) protected: virtual void PreSubclassWindow(); //}}AFX_VIRTUAL protected: #if !defined(_WIN32_WCE_NO_PRINTING) && !defined(GRIDCONTROL_NO_PRINTING) // Printing virtual void PrintFixedRowCells(int nStartColumn, int nStopColumn, int& row, CRect& rect, CDC *pDC, BOOL& bFirst); virtual void PrintColumnHeadings(CDC *pDC, CPrintInfo *pInfo); virtual void PrintHeader(CDC *pDC, CPrintInfo *pInfo); virtual void PrintFooter(CDC *pDC, CPrintInfo *pInfo); virtual void PrintRowButtons(CDC *pDC, CPrintInfo* /*pInfo*/); #endif #ifndef GRIDCONTROL_NO_DRAGDROP // Drag n' drop virtual CImageList* CreateDragImage(CPoint *pHotSpot); // no longer necessary #endif // Mouse Clicks virtual void OnFixedColumnClick(CCellID& cell); virtual void OnFixedRowClick(CCellID& cell); // Editing virtual void OnEditCell(int nRow, int nCol, CPoint point, UINT nChar); virtual void OnEndEditCell(int nRow, int nCol, CString str); virtual BOOL ValidateEdit(int nRow, int nCol, LPCTSTR str); virtual void EndEditing(); // Drawing virtual void OnDraw(CDC* pDC); // CGridCellBase Creation and Cleanup virtual CGridCellBase* CreateCell(int nRow, int nCol); virtual void DestroyCell(int nRow, int nCol); // Attributes protected: // General attributes COLORREF m_crFixedTextColour, m_crFixedBkColour; COLORREF m_crGridBkColour, m_crGridLineColour; COLORREF m_crWindowText, m_crWindowColour, m_cr3DFace, // System colours m_crShadow; COLORREF m_crTTipBackClr, m_crTTipTextClr; // Titletip colours - FNA BOOL m_bVirtualMode; LPARAM m_lParam; // lParam for callback GRIDCALLBACK m_pfnCallback; // The callback function int m_nGridLines; BOOL m_bEditable; BOOL m_bModified; BOOL m_bAllowDragAndDrop; BOOL m_bListMode; BOOL m_bSingleRowSelection; BOOL m_bSingleColSelection; BOOL m_bAllowDraw; BOOL m_bEnableSelection; BOOL m_bFixedRowSelection, m_bFixedColumnSelection; BOOL m_bSortOnClick; BOOL m_bHandleTabKey; BOOL m_bDoubleBuffer; BOOL m_bTitleTips; int m_nBarState; BOOL m_bWysiwygPrinting; BOOL m_bHiddenColUnhide, m_bHiddenRowUnhide; BOOL m_bAllowColHide, m_bAllowRowHide; BOOL m_bAutoSizeSkipColHdr; BOOL m_bTrackFocusCell; BOOL m_bFrameFocus; UINT m_nAutoSizeColumnStyle; // Cell enable vector<vector<CELL_ENABLE>> m_pCellEnable; // Cell size details int m_nRows, m_nFixedRows, m_nCols, m_nFixedCols; // LUC int m_nFreezedRows, m_nFreezedCols; BOOL m_bExcludeFreezedRowsFromSelection; BOOL m_bExcludeFreezedColsFromSelection; // LUC CArray<CCellRange, CCellRange&> m_arMergedCells; // LUC BOOL m_bShowHorzNonGridArea; CUIntArray m_arRowHeights, m_arColWidths; int m_nVScrollMax, m_nHScrollMax; // Fonts and images CRuntimeClass* m_pRtcDefault; // determines kind of Grid Cell created by default CGridDefaultCell m_cellDefault; // "default" cell. Contains default colours, font etc. CGridDefaultCell m_cellFixedColDef, m_cellFixedRowDef, m_cellFixedRowColDef; CFont m_PrinterFont; // for the printer CImageList* m_pImageList; // Cell data CTypedPtrArray<CObArray, GRID_ROW*> m_RowData; // Mouse operations such as cell selection int m_MouseMode; BOOL m_bLMouseButtonDown, m_bRMouseButtonDown; CPoint m_LeftClickDownPoint, m_LastMousePoint; CCellID m_LeftClickDownCell, m_SelectionStartCell; CCellID m_idCurrentCell, m_idTopLeftCell; INT_PTR m_nTimerID; int m_nTimerInterval; int m_nResizeCaptureRange; BOOL m_bAllowRowResize, m_bAllowColumnResize; int m_nRowsPerWheelNotch; CMap<DWORD,DWORD, CCellID, CCellID&> m_SelectedCellMap, m_PrevSelectedCellMap; #ifndef GRIDCONTROL_NO_TITLETIPS CTitleTip m_TitleTip; // Title tips for cells #endif // Drag and drop CCellID m_LastDragOverCell; #ifndef GRIDCONTROL_NO_DRAGDROP CGridDropTarget m_DropTarget; // OLE Drop target for the grid #endif // Printing information CSize m_CharSize; int m_nPageHeight; CSize m_LogicalPageSize, // Page size in gridctrl units. m_PaperSize; // Page size in device units. // additional properties to support Wysiwyg printing int m_nPageWidth; int m_nPrintColumn; int m_nCurrPrintRow; int m_nNumPages; int m_nPageMultiplier; // sorting int m_bAscending; int m_nSortColumn; PFNLVCOMPARE m_pfnCompare; // EFW - Added to support shaded/unshaded printout. If true, colored // cells will print as-is. If false, all text prints as black on white. BOOL m_bShadedPrintOut; // EFW - Added support for user-definable margins. Top and bottom are in // lines. Left, right, and gap are in characters (avg width is used). int m_nHeaderHeight, m_nFooterHeight, m_nLeftMargin, m_nRightMargin, m_nTopMargin, m_nBottomMargin, m_nGap; protected: void SelectAllCells(); void SelectColumns(CCellID currentCell, BOOL bForceRedraw=FALSE, BOOL bSelectCells=TRUE); void SelectRows(CCellID currentCell, BOOL bForceRedraw=FALSE, BOOL bSelectCells=TRUE); void SelectCells(CCellID currentCell, BOOL bForceRedraw=FALSE, BOOL bSelectCells=TRUE); void OnSelecting(const CCellID& currentCell); // Generated message map functions //{{AFX_MSG(CGridCtrl) afx_msg void OnPaint(); afx_msg void OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar); afx_msg void OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar); afx_msg void OnSize(UINT nType, int cx, int cy); afx_msg void OnLButtonUp(UINT nFlags, CPoint point); afx_msg void OnLButtonDown(UINT nFlags, CPoint point); afx_msg void OnMouseMove(UINT nFlags, CPoint point); afx_msg void OnTimer(UINT_PTR nIDEvent); afx_msg UINT OnGetDlgCode(); afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags); afx_msg void OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags); afx_msg void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags); afx_msg void OnLButtonDblClk(UINT nFlags, CPoint point); afx_msg BOOL OnEraseBkgnd(CDC* pDC); afx_msg void OnSysKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags); afx_msg void OnUpdateEditSelectAll(CCmdUI* pCmdUI); //}}AFX_MSG #ifndef _WIN32_WCE_NO_CURSOR afx_msg BOOL OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message); #endif #ifndef _WIN32_WCE afx_msg void OnRButtonDown(UINT nFlags, CPoint point); afx_msg void OnRButtonUp(UINT nFlags, CPoint point); // EFW - Added afx_msg void OnSysColorChange(); #endif #ifndef _WIN32_WCE_NO_CURSOR afx_msg void OnCaptureChanged(CWnd *pWnd); #endif #ifndef GRIDCONTROL_NO_CLIPBOARD afx_msg void OnUpdateEditCopy(CCmdUI* pCmdUI); afx_msg void OnUpdateEditCut(CCmdUI* pCmdUI); afx_msg void OnUpdateEditPaste(CCmdUI* pCmdUI); #endif #if (_MFC_VER >= 0x0421) || (_WIN32_WCE >= 210) afx_msg void OnSettingChange(UINT uFlags, LPCTSTR lpszSection); #endif #if !defined(_WIN32_WCE) && (_MFC_VER >= 0x0421) afx_msg BOOL OnMouseWheel(UINT nFlags, short zDelta, CPoint pt); #endif afx_msg LRESULT OnSetFont(WPARAM hFont, LPARAM lParam); afx_msg LRESULT OnGetFont(WPARAM hFont, LPARAM lParam); afx_msg LRESULT OnImeChar(WPARAM wCharCode, LPARAM lParam); afx_msg void OnEndInPlaceEdit(NMHDR* pNMHDR, LRESULT* pResult); afx_msg void OnComboSelChange(NMHDR* pNMHDR, LRESULT* pResult); DECLARE_MESSAGE_MAP() enum eMouseModes { MOUSE_NOTHING, MOUSE_SELECT_ALL, MOUSE_SELECT_COL, MOUSE_SELECT_ROW, MOUSE_SELECT_CELLS, MOUSE_SCROLLING_CELLS, MOUSE_OVER_ROW_DIVIDE, MOUSE_SIZING_ROW, MOUSE_OVER_COL_DIVIDE, MOUSE_SIZING_COL, MOUSE_PREPARE_EDIT, #ifndef GRIDCONTROL_NO_DRAGDROP MOUSE_PREPARE_DRAG, MOUSE_DRAGGING #endif }; // for sort in virtual mode, and column order, save and load layer public: typedef std::vector<int> intlist; void Reorder(int From, int To); void SetVirtualCompare(PVIRTUALCOMPARE VirtualCompare) { m_pfnVirtualCompare = VirtualCompare;} int m_CurCol; void AllowReorderColumn(bool b=true) { m_AllowReorderColumn = b;} void EnableDragRowMode(bool b=true) { m_bDragRowMode = b; if(b) EnableDragAndDrop(); } // to change row order int GetLayer(int** pLayer); // gives back the number of ints of the area (do not forget to delete *pLayer) void SetLayer(int* pLayer); // coming from a previous GetLayer (ignored if not same number of column, or the same revision number) void ForceQuitFocusOnTab(bool b=true) { m_QuitFocusOnTab = b;} // use only if GetParent() is a CDialog void AllowSelectRowInFixedCol(bool b=true) { m_AllowSelectRowInFixedCol = b;} // // allow acces? intlist m_arRowOrder, m_arColOrder; static CGridCtrl* m_This; protected: virtual void AddSubVirtualRow(int Num, int Nb); bool m_bDragRowMode; int m_CurRow; private: void ResetVirtualOrder(); PVIRTUALCOMPARE m_pfnVirtualCompare; static bool NotVirtualCompare(int c1, int c2); bool m_InDestructor; bool m_AllowReorderColumn; bool m_QuitFocusOnTab; bool m_AllowSelectRowInFixedCol; }; // Returns the default cell implementation for the given grid region inline CGridCellBase* CGridCtrl::GetDefaultCell(BOOL bFixedRow, BOOL bFixedCol) const { if (bFixedRow && bFixedCol) return (CGridCellBase*) &m_cellFixedRowColDef; if (bFixedRow) return (CGridCellBase*) &m_cellFixedRowDef; if (bFixedCol) return (CGridCellBase*) &m_cellFixedColDef; return (CGridCellBase*) &m_cellDefault; } inline CGridCellBase* CGridCtrl::GetCell(int nRow, int nCol) const { if (nRow < 0 || nRow >= m_nRows || nCol < 0 || nCol >= m_nCols) return NULL; if (GetVirtualMode()) { CGridCellBase* pCell = GetDefaultCell(nRow < m_nFixedRows, nCol < m_nFixedCols); static GV_DISPINFO gvdi; gvdi.item.row = nRow; gvdi.item.col = nCol; gvdi.item.mask = 0xFFFFFFFF; gvdi.item.nState = 0; gvdi.item.nFormat = pCell->GetFormat(); gvdi.item.iImage = pCell->GetImage(); gvdi.item.crBkClr = pCell->GetBackClr(); gvdi.item.crFgClr = pCell->GetTextClr(); gvdi.item.lParam = pCell->GetData(); memcpy(&gvdi.item.lfFont, pCell->GetFont(), sizeof(LOGFONT)); gvdi.item.nMargin = pCell->GetMargin(); gvdi.item.strText.Empty(); // Fix the state bits if (IsCellSelected(nRow, nCol)) gvdi.item.nState |= GVIS_SELECTED; if (nRow < GetFixedRowCount()) gvdi.item.nState |= (GVIS_FIXED | GVIS_FIXEDROW); if (nCol < GetFixedColumnCount()) gvdi.item.nState |= (GVIS_FIXED | GVIS_FIXEDCOL); if (GetFocusCell() == CCellID(nRow, nCol)) gvdi.item.nState |= GVIS_FOCUSED; if(!m_InDestructor) { gvdi.item.row = m_arRowOrder[nRow]; gvdi.item.col = m_arColOrder[nCol]; if (m_pfnCallback) m_pfnCallback(&gvdi, m_lParam); else SendDisplayRequestToParent(&gvdi); gvdi.item.row = nRow; gvdi.item.col = nCol; } static CGridCell cell; cell.SetState(gvdi.item.nState); cell.SetFormat(gvdi.item.nFormat); cell.SetImage(gvdi.item.iImage); cell.SetBackClr(gvdi.item.crBkClr); cell.SetTextClr(gvdi.item.crFgClr); cell.SetData(gvdi.item.lParam); cell.SetFont(&(gvdi.item.lfFont)); cell.SetMargin(gvdi.item.nMargin); cell.SetText(gvdi.item.strText); cell.SetGrid((CGridCtrl*)this); return (CGridCellBase*) &cell; } GRID_ROW* pRow = m_RowData[nRow]; if (!pRow) return NULL; if(pRow->GetData() == NULL) return NULL; return pRow->GetAt(m_arColOrder[nCol]); } inline BOOL CGridCtrl::SetCell(int nRow, int nCol, CGridCellBase* pCell) { if (GetVirtualMode()) return FALSE; if (nRow < 0 || nRow >= m_nRows || nCol < 0 || nCol >= m_nCols) return FALSE; GRID_ROW* pRow = m_RowData[nRow]; if (!pRow) return FALSE; pCell->SetCoords( nRow, nCol); pRow->SetAt(nCol, pCell); return TRUE; } ///////////////////////////////////////////////////////////////////////////// //{{AFX_INSERT_LOCATION}} // Microsoft Developer Studio will insert additional declarations immediately before the previous line. #endif // !defined(AFX_GRIDCTRL_H__519FA702_722C_11D1_ABBA_00A0243D1382__INCLUDED_) SourceCode/Bond/BLControlsSDK/GridControl/GridDropTarget.h
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,82 @@ ////////////////////////////////////////////////////////////////////// // GridDropTarget.h : header file // // MFC Grid Control - Drag/Drop target implementation // // Written by Chris Maunder <chris@codeproject.com> // Copyright (c) 1998-2005. All Rights Reserved. // // 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.10+ // ////////////////////////////////////////////////////////////////////// #if !defined(AFX_GRIDDROPTARGET_H__5C610981_BD36_11D1_97CD_00A0243D1382__INCLUDED_) #define AFX_GRIDDROPTARGET_H__5C610981_BD36_11D1_97CD_00A0243D1382__INCLUDED_ #if _MSC_VER >= 1000 #pragma once #endif // _MSC_VER >= 1000 #include <afxole.h> class CGridCtrl; ///////////////////////////////////////////////////////////////////////////// // CGridDropTarget command target class AFX_EXT_CLASS CGridDropTarget : public COleDropTarget { public: CGridDropTarget(); virtual ~CGridDropTarget(); // Attributes public: CGridCtrl* m_pGridCtrl; BOOL m_bRegistered; // Operations public: BOOL Register(CGridCtrl *pGridCtrl); virtual void Revoke(); BOOL OnDrop(CWnd* pWnd, COleDataObject* pDataObject, DROPEFFECT dropEffect, CPoint point); DROPEFFECT OnDragEnter(CWnd* pWnd, COleDataObject* pDataObject, DWORD dwKeyState, CPoint point); void OnDragLeave(CWnd* pWnd); DROPEFFECT OnDragOver(CWnd* pWnd, COleDataObject* pDataObject, DWORD dwKeyState, CPoint point); DROPEFFECT OnDragScroll(CWnd* pWnd, DWORD dwKeyState, CPoint point); // Overrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CGridDropTarget) //}}AFX_VIRTUAL // Implementation protected: // Generated message map functions //{{AFX_MSG(CGridDropTarget) //}}AFX_MSG DECLARE_MESSAGE_MAP() }; ///////////////////////////////////////////////////////////////////////////// //{{AFX_INSERT_LOCATION}} // Microsoft Developer Studio will insert additional declarations immediately before the previous line. #endif // !defined(AFX_GRIDDROPTARGET_H__5C610981_BD36_11D1_97CD_00A0243D1382__INCLUDED_) SourceCode/Bond/BLControlsSDK/GridControl/GridInPlaceEdit.h
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,83 @@ ////////////////////////////////////////////////////////////////////// // InPlaceEdit.h : header file // // MFC Grid Control - inplace editing class // // Written by Chris Maunder <chris@codeproject.com> // Copyright (c) 1998-2005. All Rights Reserved. // // 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.10+ // ////////////////////////////////////////////////////////////////////// #if !defined(AFX_INPLACEEDIT_H__ECD42821_16DF_11D1_992F_895E185F9C72__INCLUDED_) #define AFX_INPLACEEDIT_H__ECD42821_16DF_11D1_992F_895E185F9C72__INCLUDED_ #if _MSC_VER >= 1000 #pragma once #endif // _MSC_VER >= 1000 class CGridInPlaceEdit : public CEdit { // Construction public: CGridInPlaceEdit(CWnd* pParent, CRect& rect, DWORD dwStyle, UINT nID, int nRow, int nColumn, CString sInitText, UINT nFirstChar); // Attributes public: // Operations public: void EndEdit(); // Overrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CGridInPlaceEdit) public: virtual BOOL PreTranslateMessage(MSG* pMsg); protected: virtual void PostNcDestroy(); //}}AFX_VIRTUAL // Implementation public: virtual ~CGridInPlaceEdit(); // Generated message map functions protected: //{{AFX_MSG(CGridInPlaceEdit) afx_msg void OnKillFocus(CWnd* pNewWnd); afx_msg void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags); afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags); afx_msg UINT OnGetDlgCode(); //}}AFX_MSG DECLARE_MESSAGE_MAP() private: int m_nRow; int m_nColumn; CString m_sInitText; UINT m_nLastChar; BOOL m_bExitOnArrows; CRect m_Rect; }; ///////////////////////////////////////////////////////////////////////////// //{{AFX_INSERT_LOCATION}} // Microsoft Developer Studio will insert additional declarations immediately before the previous line. #endif // !defined(AFX_INPLACEEDIT_H__ECD42821_16DF_11D1_992F_895E185F9C72__INCLUDED_) SourceCode/Bond/BLControlsSDK/GridControl/GridMemDC.h
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,106 @@ #if !defined(AFX_MEMDC_H__CA1D3541_7235_11D1_ABBA_00A0243D1382__INCLUDED_) #define AFX_MEMDC_H__CA1D3541_7235_11D1_ABBA_00A0243D1382__INCLUDED_ #if _MSC_VER >= 1000 #pragma once #endif // _MSC_VER >= 1000 // MemDC.h : header file // ////////////////////////////////////////////////// // CGridMemDC - memory DC // // Author: Keith Rule // Email: keithr@europa.com // Copyright 1996-1997, Keith Rule // // You may freely use or modify this code provided this // Copyright is included in all derived versions. // // History - 10/3/97 Fixed scrolling bug. // Added print support. // 25 feb 98 - fixed minor assertion bug // // This class implements a memory Device Context class CGridMemDC : public CDC { public: // constructor sets up the memory DC CGridMemDC(CDC* pDC) : CDC() { // ASSERT(pDC != NULL); m_pDC = pDC; m_pOldBitmap = NULL; #ifndef _WIN32_WCE_NO_PRINTING m_bMemDC = !pDC->IsPrinting(); #else m_bMemDC = FALSE; #endif if (m_bMemDC) // Create a Memory DC { pDC->GetClipBox(&m_rect); CreateCompatibleDC(pDC); m_bitmap.CreateCompatibleBitmap(pDC, m_rect.Width(), m_rect.Height()); m_pOldBitmap = SelectObject(&m_bitmap); #ifndef _WIN32_WCE SetWindowOrg(m_rect.left, m_rect.top); #endif // EFW - Bug fix - Fill background in case the user has overridden // WM_ERASEBKGND. We end up with garbage otherwise. // CJM - moved to fix a bug in the fix. FillSolidRect(m_rect, pDC->GetBkColor()); } else // Make a copy of the relevent parts of the current DC for printing { #if !defined(_WIN32_WCE) || ((_WIN32_WCE > 201) && !defined(_WIN32_WCE_NO_PRINTING)) m_bPrinting = pDC->m_bPrinting; #endif m_hDC = pDC->m_hDC; m_hAttribDC = pDC->m_hAttribDC; } } // Destructor copies the contents of the mem DC to the original DC ~CGridMemDC() { if (m_bMemDC) { // Copy the offscreen bitmap onto the screen. m_pDC->BitBlt(m_rect.left, m_rect.top, m_rect.Width(), m_rect.Height(), this, m_rect.left, m_rect.top, SRCCOPY); //Swap back the original bitmap. SelectObject(m_pOldBitmap); } else { // All we need to do is replace the DC with an illegal value, // this keeps us from accidently deleting the handles associated with // the CDC that was passed to the constructor. m_hDC = m_hAttribDC = NULL; } } // Allow usage as a pointer CGridMemDC* operator->() {return this;} // Allow usage as a pointer operator CGridMemDC*() {return this;} private: CBitmap m_bitmap; // Offscreen bitmap CBitmap* m_pOldBitmap; // bitmap originally found in CGridMemDC CDC* m_pDC; // Saves CDC passed in constructor CRect m_rect; // Rectangle of drawing area. BOOL m_bMemDC; // TRUE if CDC really is a Memory DC. }; ///////////////////////////////////////////////////////////////////////////// //{{AFX_INSERT_LOCATION}} // Microsoft Developer Studio will insert additional declarations immediately before the previous line. #endif // !defined(AFX_MEMDC_H__CA1D3541_7235_11D1_ABBA_00A0243D1382__INCLUDED_) SourceCode/Bond/BLControlsSDK/GridControl/NewCellTypes/GridCellCheck.h
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,68 @@ #if !defined(AFX_GRIDCELLCHECK_H__ECD42822_16DF_11D1_992F_895E185F9C72__INCLUDED_) #define AFX_GRIDCELLCHECK_H__ECD42822_16DF_11D1_992F_895E185F9C72__INCLUDED_ #if _MSC_VER >= 1000 #pragma once #endif // _MSC_VER >= 1000 ///////////////////////////////////////////////////////////////////////////// // GridCellCheck.h : header file // // MFC Grid Control - Grid combo cell class header file // // Written by Chris Maunder <chris@codeproject.com> // Copyright (c) 1998-2005. All Rights Reserved. // // 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+ // ////////////////////////////////////////////////////////////////////// #include "..\\GridCell.h" class AFX_EXT_CLASS CGridCellCheck : public CGridCell { friend class CGridCtrl; DECLARE_DYNCREATE(CGridCellCheck) public: CGridCellCheck(); public: BOOL SetCheck(BOOL bChecked = TRUE); BOOL GetCheck(); // Operations virtual CSize GetCellExtent(CDC* pDC); virtual void OnClick( CPoint PointCellRelative); virtual BOOL GetTextRect( LPRECT pRect); protected: CRect GetCheckPlacement(); virtual BOOL Draw(CDC* pDC, int nRow, int nCol, CRect rect, BOOL bEraseBkgnd = TRUE); protected: BOOL m_bChecked; CRect m_Rect; }; ///////////////////////////////////////////////////////////////////////////// //{{AFX_INSERT_LOCATION}} // Microsoft Developer Studio will insert additional declarations immediately before the previous line. #endif // !defined(AFX_GRIDCELLCHECK_H__ECD42822_16DF_11D1_992F_895E185F9C72__INCLUDED_) SourceCode/Bond/BLControlsSDK/GridControl/NewCellTypes/GridCellCombo.h
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,178 @@ #if !defined(AFX_GRIDCELLCOMBO_H__ECD42822_16DF_11D1_992F_895E185F9C72__INCLUDED_) #define AFX_GRIDCELLCOMBO_H__ECD42822_16DF_11D1_992F_895E185F9C72__INCLUDED_ #if _MSC_VER >= 1000 #pragma once #endif // _MSC_VER >= 1000 ///////////////////////////////////////////////////////////////////////////// // GridCellCombo.h : header file // // MFC Grid Control - Grid combo cell class header file // // Written by Chris Maunder <chris@codeproject.com> // Copyright (c) 1998-2005. All Rights Reserved. // // 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.10 // ////////////////////////////////////////////////////////////////////// #include "../GridCell.h" class AFX_EXT_CLASS CGridCellCombo : public CGridCell { friend class CGridCtrl; DECLARE_DYNCREATE(CGridCellCombo) public: CGridCellCombo(); // editing cells public: virtual BOOL Edit(int nRow, int nCol, CRect rect, CPoint point, UINT nID, UINT nChar); virtual CWnd* GetEditWnd() const; virtual void EndEdit(); // Operations public: virtual CSize GetCellExtent(CDC* pDC); // CGridCellCombo specific calls public: void SetOptions(const CStringArray& ar); void SetStyle(DWORD dwStyle) { m_dwStyle = dwStyle; } DWORD GetStyle() { return m_dwStyle; } protected: virtual BOOL Draw(CDC* pDC, int nRow, int nCol, CRect rect, BOOL bEraseBkgnd = TRUE); CStringArray m_Strings; DWORD m_dwStyle; }; ///////////////////////////////////////////////////////////////////////////// // CComboEdit window #define IDC_COMBOEDIT 1001 class CComboEdit : public CEdit { // Construction public: CComboEdit(); // Attributes public: // Operations public: // Overrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CComboEdit) virtual BOOL PreTranslateMessage(MSG* pMsg); //}}AFX_VIRTUAL // Implementation public: virtual ~CComboEdit(); // Generated message map functions protected: //{{AFX_MSG(CComboEdit) afx_msg void OnKillFocus(CWnd* pNewWnd); afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags); afx_msg void OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags); //}}AFX_MSG DECLARE_MESSAGE_MAP() }; ///////////////////////////////////////////////////////////////////////////// // CInPlaceList window class CInPlaceList : public CComboBox { friend class CComboEdit; // Construction public: CInPlaceList(CWnd* pParent, // parent CRect& rect, // dimensions & location DWORD dwStyle, // window/combobox style UINT nID, // control ID int nRow, int nColumn, // row and column COLORREF crFore, COLORREF crBack, // Foreground, background colour CStringArray& Items, // Items in list CString sInitText, // initial selection UINT nFirstChar); // first character to pass to control // Attributes public: CComboEdit m_edit; // subclassed edit control // Operations public: // Overrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CInPlaceList) protected: virtual void PostNcDestroy(); //}}AFX_VIRTUAL // Implementation public: virtual ~CInPlaceList(); void EndEdit(); protected: int GetCorrectDropWidth(); // Generated message map functions protected: //{{AFX_MSG(CInPlaceList) afx_msg void OnKillFocus(CWnd* pNewWnd); afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags); afx_msg void OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags); afx_msg void OnDropdown(); afx_msg void OnSelChange(); afx_msg UINT OnGetDlgCode(); afx_msg HBRUSH CtlColor(CDC* pDC, UINT nCtlColor); //}}AFX_MSG //afx_msg void OnSelendOK(); DECLARE_MESSAGE_MAP() private: int m_nNumLines; CString m_sInitText; int m_nRow; int m_nCol; UINT m_nLastChar; BOOL m_bExitOnArrows; COLORREF m_crForeClr, m_crBackClr; }; ///////////////////////////////////////////////////////////////////////////// //{{AFX_INSERT_LOCATION}} // Microsoft Developer Studio will insert additional declarations immediately before the previous line. #endif // !defined(AFX_GRIDCELLCOMBO_H__ECD42822_16DF_11D1_992F_895E185F9C72__INCLUDED_) SourceCode/Bond/BLControlsSDK/GridControl/NewCellTypes/GridCellDateTime.h
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,92 @@ // GridCellDateTime.h: interface for the CGridCellDateTime class. // // Provides the implementation for a datetime picker cell type of the // grid control. // // For use with CGridCtrl v2.22+ // ////////////////////////////////////////////////////////////////////// #if !defined(AFX_DATETIMECELL_H__A0B7DA0A_0AFE_4D28_A00E_846C96D7507A__INCLUDED_) #define AFX_DATETIMECELL_H__A0B7DA0A_0AFE_4D28_A00E_846C96D7507A__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 #include "..\\GridCell.h" #include "afxdtctl.h" // for CDateTimeCtrl class CGridCellDateTime : public CGridCell { friend class CGridCtrl; DECLARE_DYNCREATE(CGridCellDateTime) CTime m_cTime; DWORD m_dwStyle; public: CGridCellDateTime(); CGridCellDateTime(DWORD dwStyle); virtual ~CGridCellDateTime(); virtual CSize GetCellExtent(CDC* pDC); // editing cells public: void Init(DWORD dwStyle); virtual BOOL Edit(int nRow, int nCol, CRect rect, CPoint point, UINT nID, UINT nChar); virtual CWnd* GetEditWnd() const; virtual void EndEdit(); CTime* GetTime() {return &m_cTime;}; void SetTime(CTime time); }; class CInPlaceDateTime : public CDateTimeCtrl { // Construction public: CInPlaceDateTime(CWnd* pParent, // parent CRect& rect, // dimensions & location DWORD dwStyle, // window/combobox style UINT nID, // control ID int nRow, int nColumn, // row and column COLORREF crFore, COLORREF crBack, // Foreground, background colour CTime* pcTime, UINT nFirstChar); // first character to pass to control // Overrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CInPlaceList) protected: virtual void PostNcDestroy(); //}}AFX_VIRTUAL // Implementation public: virtual ~CInPlaceDateTime(); void EndEdit(); // Generated message map functions protected: //{{AFX_MSG(CInPlaceList) afx_msg void OnKillFocus(CWnd* pNewWnd); afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags); afx_msg void OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags); afx_msg UINT OnGetDlgCode(); //}}AFX_MSG //afx_msg void OnSelendOK(); DECLARE_MESSAGE_MAP() private: CTime* m_pcTime; int m_nRow; int m_nCol; UINT m_nLastChar; BOOL m_bExitOnArrows; COLORREF m_crForeClr, m_crBackClr; }; #endif // !defined(AFX_DATETIMECELL_H__A0B7DA0A_0AFE_4D28_A00E_846C96D7507A__INCLUDED_) SourceCode/Bond/BLControlsSDK/GridControl/NewCellTypes/GridCellNumeric.h
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,26 @@ // GridCellNumeric.h: interface for the CGridCellNumeric class. // // Written by Andrew Truckle [ajtruckle@wsatkins.co.uk] // ////////////////////////////////////////////////////////////////////// #if !defined(AFX_GRIDINTEGERCELL_H__3479ED0D_B57D_4940_B83D_9E2296ED75B5__INCLUDED_) #define AFX_GRIDINTEGERCELL_H__3479ED0D_B57D_4940_B83D_9E2296ED75B5__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 #include "..\\GridCell.h" class AFX_EXT_CLASS CGridCellNumeric : public CGridCell { DECLARE_DYNCREATE(CGridCellNumeric) public: virtual BOOL Edit(int nRow, int nCol, CRect rect, CPoint point, UINT nID, UINT nChar); virtual void EndEdit(); }; #endif // !defined(AFX_GRIDINTEGERCELL_H__3479ED0D_B57D_4940_B83D_9E2296ED75B5__INCLUDED_) SourceCode/Bond/BLControlsSDK/GridControl/NewCellTypes/GridURLCell.h
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,55 @@ // GridURLCell.h: interface for the CGridURLCell class. // ////////////////////////////////////////////////////////////////////// #if !defined(AFX_GRIDURLCELL_H__9F4A50B4_D773_11D3_A439_F7E60631F563__INCLUDED_) #define AFX_GRIDURLCELL_H__9F4A50B4_D773_11D3_A439_F7E60631F563__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 #include "..\\GridCell.h" typedef struct { LPCTSTR szURLPrefix; size_t nLength; } URLStruct; class CGridURLCell : public CGridCell { DECLARE_DYNCREATE(CGridURLCell) public: CGridURLCell(); virtual ~CGridURLCell(); virtual BOOL Draw(CDC* pDC, int nRow, int nCol, CRect rect, BOOL bEraseBkgnd = TRUE); virtual BOOL Edit(int nRow, int nCol, CRect rect, CPoint point, UINT nID, UINT nChar); virtual LPCTSTR GetTipText() { return NULL; } void SetAutoLaunchUrl(BOOL bLaunch = TRUE) { m_bLaunchUrl = bLaunch; } BOOL GetAutoLaunchUrl() { return m_bLaunchUrl; } protected: virtual BOOL OnSetCursor(); virtual void OnClick(CPoint PointCellRelative); BOOL HasUrl(CString str); BOOL OverURL(CPoint& pt, CString& strURL); protected: #ifndef _WIN32_WCE static HCURSOR g_hLinkCursor; // Hyperlink mouse cursor HCURSOR GetHandCursor(); #endif static URLStruct g_szURIprefixes[]; protected: COLORREF m_clrUrl; BOOL m_bLaunchUrl; CRect m_Rect; }; #endif // !defined(AFX_GRIDURLCELL_H__9F4A50B4_D773_11D3_A439_F7E60631F563__INCLUDED_) SourceCode/Bond/BLControlsSDK/GridControl/TitleTip.h
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,87 @@ ///////////////////////////////////////////////////////////////////////////// // Titletip.h : header file // // MFC Grid Control - cell titletips // // Written by Chris Maunder <chris@codeproject.com> // Copyright (c) 1998-2005. All Rights Reserved. // // 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.10+ // ////////////////////////////////////////////////////////////////////// #if !defined(AFX_TITLETIP_H__C7165DA1_187F_11D1_992F_895E185F9C72__INCLUDED_) #define AFX_TITLETIP_H__C7165DA1_187F_11D1_992F_895E185F9C72__INCLUDED_ #if _MSC_VER >= 1000 #pragma once #endif // _MSC_VER >= 1000 #define TITLETIP_CLASSNAME _T("ZTitleTip") ///////////////////////////////////////////////////////////////////////////// // CTitleTip window class AFX_EXT_CLASS CTitleTip : public CWnd { // Construction public: CTitleTip(); virtual ~CTitleTip(); virtual BOOL Create( CWnd *pParentWnd); // Attributes public: void SetParentWnd(CWnd* pParentWnd) { m_pParentWnd = pParentWnd; } CWnd* GetParentWnd() { return m_pParentWnd; } // Operations public: void Show(CRect rectTitle, LPCTSTR lpszTitleText, int xoffset = 0, LPRECT lpHoverRect = NULL, const LOGFONT* lpLogFont = NULL, COLORREF crTextClr = CLR_DEFAULT, COLORREF crBackClr = CLR_DEFAULT); void Hide(); // Overrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CTitleTip) public: virtual BOOL PreTranslateMessage(MSG* pMsg); virtual BOOL DestroyWindow(); //}}AFX_VIRTUAL // Implementation protected: CWnd *m_pParentWnd; CRect m_rectTitle; CRect m_rectHover; DWORD m_dwLastLButtonDown; DWORD m_dwDblClickMsecs; BOOL m_bCreated; // Generated message map functions protected: //{{AFX_MSG(CTitleTip) afx_msg void OnMouseMove(UINT nFlags, CPoint point); //}}AFX_MSG DECLARE_MESSAGE_MAP() }; ///////////////////////////////////////////////////////////////////////////// //{{AFX_INSERT_LOCATION}} // Microsoft Developer Studio will insert additional declarations immediately before the previous line. #endif // !defined(AFX_TITLETIP_H__C7165DA1_187F_11D1_992F_895E185F9C72__INCLUDED_) SourceCode/Bond/BLControlsSDK/include/CellCtrl.h
@@ -55,18 +55,18 @@ int nId; //CONTROL ID int nItem; //LIST ITEM int nSubItem; //LIST SUBITEM CELLCOLOR oldClr; //汲沥åç¼ ç¥¸ CELLCOLOR newClr; //æ±²æ²¥é¥¶ç¼ ç¥¸ LPWSTR lpstrOld; //æ¶ä»¿å å·©ç£å¯ LPWSTR lpstrNew; //æ¶ä»¿è å·©ç£å¯ CELLCOLOR oldClr; //汲沥åç¼ ç¥¸ CELLCOLOR newClr; //æ±²æ²¥é¥¶ç¼ ç¥¸ LPWSTR lpstrOld; //æ¶ä»¿å å·©ç£å¯ LPWSTR lpstrNew; //æ¶ä»¿è å·©ç£å¯ }; struct CELLDATA { COLORREF txtclr;//èç£ç¥¸ COLORREF bkgclr;//ç¡ ç祸 bool bUseCtl;//ç§é£è´¹ è¤ä¾© bool bTurn; //é¦å¨é¦å¨ COLORREF txtclr;//èç£ç¥¸ COLORREF bkgclr;//ç¡ ç祸 bool bUseCtl;//ç§é£è´¹ è¤ä¾© bool bTurn; //é¦å¨é¦å¨ DWORD dwData; }; @@ -76,7 +76,7 @@ CCellData() { bTurn =false; bUseCtl=false;//ç§é£è´¹ è¤ä¾© bUseCtl=false;//ç§é£è´¹ è¤ä¾© txtclr=clrTEXT; bkgclr=clrBACK; dwData=0; @@ -86,7 +86,7 @@ bool bTurning, DWORD dwUserData=0) { bTurn =bTurning; bUseCtl=false;//ç§é£è´¹ è¤ä¾© bUseCtl=false;//ç§é£è´¹ è¤ä¾© txtclr=TextColor; bkgclr=BackColor; dwData=dwUserData; @@ -101,50 +101,50 @@ virtual void SerializeAllInfo(CArchive& ar); protected: CBrush m_brush; //ä¿å¼é£å è¶ç¼ ç¡ ç CEdit m_edit; //ä¿å¼é£ å è¶ CBrush m_brush; //ä¿å¼é£å è¶ç¼ ç¡ ç CEdit m_edit; //ä¿å¼é£ å è¶ BOOL m_bCanEdit; CFont* m_pFont; //åºè¶é£ è¿é£ CFont* m_pFont; //åºè¶é£ è¿é£ protected: void Printing(CDC* pDC);//åºè¶é£ç« æ©èµ´é£èº å 仿èä¿. CRect GetLogRect(CDC* pDC, int nItem, int nSubItem);//åºè¶é£ ä¼Recté åå¦ä¿ è¶æ¼ å½å¸èä¿. void SetCrtToPrintRate(CDC* pDC);//æ³æè åéç¼ åå¦é å¤èä¿. int GetCrtWidth();//æ³æ(åºè¶é£)ç¼ æ°è¼é åºçèä¿. void Printing(CDC* pDC);//åºè¶é£ç« æ©èµ´é£èº å 仿èä¿. CRect GetLogRect(CDC* pDC, int nItem, int nSubItem);//åºè¶é£ ä¼Recté åå¦ä¿ è¶æ¼ å½å¸èä¿. void SetCrtToPrintRate(CDC* pDC);//æ³æè åéç¼ åå¦é å¤èä¿. int GetCrtWidth();//æ³æ(åºè¶é£)ç¼ æ°è¼é åºçèä¿. protected: BOOL m_bSort;//Sort Flag BOOL m_bTime;//SetTimer(,,)ç« æ±²æ²¥æ²ç»°ç¤ å¯ä½ BOOL m_bTurnDraw;//åºè¶é£ çèç« ä¼ç¼ 祸彬æ å½ç§¦å ·çªç»°ç¤ å¯ä½ UINT m_nClipOptin;//åªèµçé å¯è®° BOOL m_bTime;//SetTimer(,,)ç« æ±²æ²¥æ²ç»°ç¤ å¯ä½ BOOL m_bTurnDraw;//åºè¶é£ çèç« ä¼ç¼ 祸彬æ å½ç§¦å ·çªç»°ç¤ å¯ä½ UINT m_nClipOptin;//åªèµçé å¯è®° CHeadCtrl m_head;//HeaderCtrl LOCATION m_mcLct;//right mouse click LOCATION m_edLct;//edit location UINT m_nStartColEdit; UINT m_nEndColEdit; CMenu m_menu;//åºè¶é£ çæ¥ CMenu* m_pUmenu;//è¤ä¾©ç£ æ²¥ç¼ çæ¥ CMenu m_menu;//åºè¶é£ çæ¥ CMenu* m_pUmenu;//è¤ä¾©ç£ æ²¥ç¼ çæ¥ CELLINFO* m_pInfo; //汲沥ç Item Dataç« æåèä¿. //汲沥ç Item Dataç« æåèä¿. void DeleteItemData(int nItem); void DeleteAllItemData(); //ä¿å¼é£å è¶ç¼ Dataç« èæ²¥æ²ç»°ç¤ å¯ä½ç« çåçªç» //ä½èæ©æ¡£å¿«èº çç«ç¤ç« çè¾°ä¿. //ä¿å¼é£å è¶ç¼ Dataç« èæ²¥æ²ç»°ç¤ å¯ä½ç« çåçªç» //ä½èæ©æ¡£å¿«èº çç«ç¤ç« çè¾°ä¿. BOOL IsModifyEdit(int nItem, int nSubItem); //é æè¢ç¼ åº·å¼æ 彿²é çå¿«ä¿ ä¿å¼é£å è¶ç¼ åææ¡£ å½ç§¦å · çªéª¨èº //ä¿æ¾çªèç« æä¾©çªå¯ ä¿å¼é£å è¶ç« çèèä¿. //é æè¢ç¼ åº·å¼æ 彿²é çå¿«ä¿ ä¿å¼é£å è¶ç¼ åææ¡£ å½ç§¦å · çªéª¨èº //ä¿æ¾çªèç« æä¾©çªå¯ ä¿å¼é£å è¶ç« çèèä¿. void UpdateEdit(int nItem, int nSubItem); //ä¼ç¼ 康å¼é çèèä¿. //ä¼ç¼ 康å¼é çèèä¿. void UpdateCell(int nItem, int nSubItem); //ä¼ç¼ æ¿ç¾å å½çªæ¡£åº 汲沥ç»ç»¢ ä¹ç»°ç¤ å¯ä½ //ä¼ç¼ æ¿ç¾å å½çªæ¡£åº 汲沥ç»ç»¢ ä¹ç»°ç¤ å¯ä½ bool IsTurning(int nItem, int nSubItem); //åºè¶é£ç¼ 沥纺 left,right,center å±ä¾¥é å¤èä¿. //åºè¶é£ç¼ 沥纺 left,right,center å±ä¾¥é å¤èä¿. int GetColumnFmt(int nSubItem); public: @@ -192,25 +192,25 @@ BOOL UseEdit( int nItem, int nSubItem); void EditCtrl( MSG pMsg ); //Rectæ 彿²ç»°ç¤ éçªèä¿. //Rectæ 彿²ç»°ç¤ éçªèä¿. BOOL IsSubRectChange(); //åºè¶é£ç« æ©èµ´é£èº å 仿èä¿. BOOL ListPrinting(BOOL bDialog, int Orientation=1/*åèº=1, æèº=2*/); //åºè¶é£ç« æ©èµ´é£èº å 仿èä¿. BOOL ListPrinting(BOOL bDialog, int Orientation=1/*åèº=1, æèº=2*/); //keystate function BOOL IsMultiKey();//shiftè, ctrlèæ®¿æ åç¾è¸ç»°ç¤ checkèä¿ BOOL IsMultiKey();//shiftè, ctrlèæ®¿æ åç¾è¸ç»°ç¤ checkèä¿ //font function void SetLogFont(LOGFONT logfont);//åé è¿é£ void SetListFont(LOGFONT* logfont);//åºè¶é£ è¿é£ void SetLogFont(LOGFONT logfont);//åé è¿é£ void SetListFont(LOGFONT* logfont);//åºè¶é£ è¿é£ // int GetSubItemCount(); //æ¿ç¦èç« å¤èä¿. int GetLeftSubItem(); //è° èæ èºä½ç£ åå·±æ³ç æ¿ç¦é è«ç»°ä¿. int GetRightSubItem(); //å¿«èæ èºä½ç£ åå·±æ³ç æ¿ç¦é è«ç»°ä¿. int GetSubItemCount(); //æ¿ç¦èç« å¤èä¿. int GetLeftSubItem(); //è° èæ èºä½ç£ åå·±æ³ç æ¿ç¦é è«ç»°ä¿. int GetRightSubItem(); //å¿«èæ èºä½ç£ åå·±æ³ç æ¿ç¦é è«ç»°ä¿. //è¤ä¾©ç£å é夸è è¼é ååçªç» éç¾æ£µè ä¹ç»° çªèæä¿. //è¤ä¾©ç£å é夸è è¼é ååçªç» éç¾æ£µè ä¹ç»° çªèæä¿. BOOL SetCellData(int nItem, int nSubItem, DWORD dwData); DWORD GetCellData(int nItem, int nSubItem); SourceCode/Bond/BondEq/BondEq.vcxproj
@@ -115,7 +115,7 @@ <Optimization>Disabled</Optimization> <PreprocessorDefinitions>_WINDOWS;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> <SDLCheck>true</SDLCheck> <AdditionalIncludeDirectories>.;.\View;.\DBManager;..\DatabaseSDK\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> <AdditionalIncludeDirectories>.;.\View;.\DBManager;..\DatabaseSDK\include;..\BLControlsSDK\include;..\BLControlsSDK\GridControl;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> </ClCompile> <Link> <SubSystem>Windows</SubSystem> @@ -168,6 +168,7 @@ <IntrinsicFunctions>true</IntrinsicFunctions> <PreprocessorDefinitions>_WINDOWS;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> <SDLCheck>true</SDLCheck> <AdditionalIncludeDirectories>.;.\View;.\DBManager;..\DatabaseSDK\include;..\BLControlsSDK\include;..\BLControlsSDK\GridControl;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> </ClCompile> <Link> <SubSystem>Windows</SubSystem> @@ -245,6 +246,7 @@ <ClInclude Include="targetver.h" /> <ClInclude Include="ToolUnits.h" /> <ClInclude Include="TopToolbar.h" /> <ClInclude Include="UserManagerDlg.h" /> <ClInclude Include="VerticalLine.h" /> <ClInclude Include="View\ChangePasswordDlg.h" /> <ClInclude Include="View\LoginDlg.h" /> @@ -308,6 +310,7 @@ </ClCompile> <ClCompile Include="ToolUnits.cpp" /> <ClCompile Include="TopToolbar.cpp" /> <ClCompile Include="UserManagerDlg.cpp" /> <ClCompile Include="VerticalLine.cpp" /> <ClCompile Include="View\ChangePasswordDlg.cpp" /> <ClCompile Include="View\LoginDlg.cpp" /> SourceCode/Bond/BondEq/BondEqDlg.cpp
@@ -14,6 +14,7 @@ // test #include "AxisSettingsDlg.h" #include "UserManagerDlg.h" #ifdef _DEBUG @@ -452,8 +453,14 @@ void CBondEqDlg::OnMenuFileSettings() { CAxisSettingsDlg axisDlg; axisDlg.SetPLC(theApp.m_model.getBonder().getPLC("PLC(1)")); axisDlg.DoModal(); /* CSettingsDlg dlg; dlg.DoModal(); */ } void CBondEqDlg::OnUpdateMenuFileSettings(CCmdUI* pCmdUI) @@ -537,14 +544,9 @@ ShowLoginDlg(); } else if (2 == menuId) { if (userManager.isLoggedIn()) { userManager.logout(); m_pTopToolbar->SetOperatorBtnText(_T("æªç»å½")); } CAxisSettingsDlg axisDlg; axisDlg.SetPLC(theApp.m_model.getBonder().getPLC("PLC(1)")); axisDlg.DoModal(); // test CUserManagerDlg dlg; dlg.DoModal(); } } SourceCode/Bond/BondEq/CProjectPageComponents.cpp
@@ -13,7 +13,7 @@ IMPLEMENT_DYNAMIC(CProjectPageComponents, CDialogEx) CProjectPageComponents::CProjectPageComponents(CWnd* pParent /*=nullptr*/) : CDialogEx(IDD_PROJECT_PAGE_COMPENTS, pParent) : CDialogEx(IDD_PROJECT_PAGE_COMPONENTS, pParent) { m_crBkgnd = PROPAGE_BACKGROUND_COLOR; m_hbrBkgnd = nullptr; SourceCode/Bond/BondEq/DBManager/UserManager.cpp
@@ -39,7 +39,7 @@ std::string createTableQuery = R"( CREATE TABLE IF NOT EXISTS users ( username VARCHAR(50) PRIMARY KEY, password_hash VARCHAR(255) NOT NULL, password VARCHAR(255) NOT NULL, role INT NOT NULL, session_timeout INT DEFAULT 30, session_expiration INT DEFAULT 72, @@ -52,8 +52,8 @@ auto result = m_pDB->fetchResults(checkAdminQuery); if (result.empty() || result[0][0] == "0") { std::string insertAdminQuery = "INSERT INTO users (username, password_hash, role, session_timeout, session_expiration) VALUES ('" + INITIAL_ADMIN_USERNAME + "', '" + hashPassword(INITIAL_ADMIN_PASSWORD) + "', 0, 30, 72)"; std::string insertAdminQuery = "INSERT INTO users (username, password, role, session_timeout, session_expiration) VALUES ('" + INITIAL_ADMIN_USERNAME + "', '" + simpleEncryptDecrypt(INITIAL_ADMIN_PASSWORD, "BandKey") + "', 0, 30, 72)"; m_pDB->executeQuery(insertAdminQuery); } @@ -178,10 +178,10 @@ // ç»å½æ¹æ³ bool UserManager::login(const std::string& username, const std::string& password, bool rememberMeFlag) { std::string query = "SELECT username, password_hash, role, session_timeout, session_expiration FROM users WHERE username = '" + username + "'"; std::string query = "SELECT username, password, role, session_timeout, session_expiration FROM users WHERE username = '" + username + "'"; auto result = m_pDB->fetchResults(query); if (result.empty() || result[0][1] != hashPassword(password)) { if (result.empty() || result[0][1] != simpleEncryptDecrypt(password, "BandKey")) { std::cerr << "Login failed: Invalid username or password." << std::endl; return false; } @@ -233,8 +233,8 @@ return false; } std::string query = "INSERT INTO users (username, password_hash, role, session_timeout, session_expiration) VALUES ('" + username + "', '" + hashPassword(password) + "', " + std::to_string(static_cast<int>(role)) + ", " + std::string query = "INSERT INTO users (username, password, role, session_timeout, session_expiration) VALUES ('" + username + "', '" + simpleEncryptDecrypt(password, "BandKey") + "', " + std::to_string(static_cast<int>(role)) + ", " + std::to_string(timeout.count()) + ", " + std::to_string(expiration.count()) + ")"; return m_pDB->executeQuery(query); } @@ -262,8 +262,13 @@ } // æ¥è¯¢æ´ä¸ªç¨æ·è¡¨ std::string query = "SELECT username, password_hash, role, session_timeout, session_expiration, last_login FROM users"; return m_pDB->fetchResults(query); std::string query = "SELECT username, password, role, session_timeout, session_expiration, last_login FROM users"; std::vector<std::vector<std::string>> results = m_pDB->fetchResults(query); for (auto& row : results) { row[1] = simpleEncryptDecrypt(row[1], "BandKey"); } return results; } // 设置æ´ä¸ªç¨æ·è¡¨çæ°æ®ï¼ä» è¶ çº§ç®¡çåææé @@ -287,8 +292,8 @@ return false; } std::string insertQuery = "INSERT INTO users (username, password_hash, role, session_timeout, session_expiration, last_login) VALUES ('" + user[0] + "', '" + user[1] + "', " + user[2] + ", " + user[3] + ", " + user[4] + ", '" + user[5] + "')"; std::string insertQuery = "INSERT INTO users (username, password, role, session_timeout, session_expiration, last_login) VALUES ('" + user[0] + "', '" + simpleEncryptDecrypt(user[1], "BandKey") + "', " + user[2] + ", " + user[3] + ", " + user[4] + ", '" + user[5] + "')"; if (!m_pDB->executeQuery(insertQuery)) { std::cerr << "Failed to insert user: " << user[0] << std::endl; @@ -328,7 +333,7 @@ return false; } std::string query = "UPDATE users SET password_hash = '" + hashPassword(newPassword) + std::string query = "UPDATE users SET password = '" + simpleEncryptDecrypt(newPassword, "BandKey") + "' WHERE username = '" + username + "'"; bool success = m_pDB->executeQuery(query); SourceCode/Bond/BondEq/Resource.hBinary files differ
SourceCode/Bond/BondEq/UserManagerDlg.cpp
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,498 @@ // UserManagerDlg.cpp: å®ç°æä»¶ // #include "stdafx.h" #include "BondEq.h" #include "afxdialogex.h" #include "UserManagerDlg.h" #include "UserManager.h" #include "NewCellTypes/GridCellCombo.h" #include "NewCellTypes/GridCellNumeric.h" // CUserManagerDlg å¯¹è¯æ¡ IMPLEMENT_DYNAMIC(CUserManagerDlg, CDialogEx) CUserManagerDlg::CUserManagerDlg(CWnd* pParent /*=nullptr*/) : CDialogEx(IDD_DIALOG_USER_MANAGER, pParent) { } CUserManagerDlg::~CUserManagerDlg() { } void CUserManagerDlg::DoDataExchange(CDataExchange* pDX) { DDX_Control(pDX, IDC_CUSTOM_USER, m_gridUserManager); CDialogEx::DoDataExchange(pDX); } void CUserManagerDlg::InitUserManager() { if (m_gridUserManager.GetSafeHwnd() == NULL) return; int nRows = 1; int nCols = 7; int nFixRows = 1; int nFixCols = 0; int nRowIdx = 0; int nColIdx = 0; m_gridUserManager.DeleteAllItems(); m_gridUserManager.SetVirtualMode(FALSE); m_gridUserManager.GetDefaultCell(TRUE, FALSE)->SetBackClr(g_nGridFixCellColor); m_gridUserManager.GetDefaultCell(FALSE, TRUE)->SetBackClr(g_nGridFixCellColor); m_gridUserManager.GetDefaultCell(FALSE, FALSE)->SetBackClr(g_nGridCellColor); m_gridUserManager.SetFixedTextColor(g_nGridFixFontColor); m_gridUserManager.SetRowCount(nRows); m_gridUserManager.SetColumnCount(nCols); m_gridUserManager.SetFixedRowCount(nFixRows); m_gridUserManager.SetFixedColumnCount(nFixCols); // Col m_gridUserManager.SetColumnWidth(nColIdx, 90); m_gridUserManager.SetItemText(nRowIdx, nColIdx++, _T("No.")); m_gridUserManager.SetColumnWidth(nColIdx, 100); m_gridUserManager.SetItemText(nRowIdx, nColIdx++, _T("ç¨æ·å")); m_gridUserManager.SetColumnWidth(nColIdx, 70); m_gridUserManager.SetItemText(nRowIdx, nColIdx++, _T("å¯ç ")); m_gridUserManager.SetColumnWidth(nColIdx, 70); m_gridUserManager.SetItemText(nRowIdx, nColIdx++, _T("æé")); m_gridUserManager.SetColumnWidth(nColIdx, 70); m_gridUserManager.SetItemText(nRowIdx, nColIdx++, _T("ä¼è¯è¶ æ¶ï¼åéï¼")); m_gridUserManager.SetColumnWidth(nColIdx, 70); m_gridUserManager.SetItemText(nRowIdx, nColIdx++, _T("ä¼è¯è¿æï¼å°æ¶ï¼")); m_gridUserManager.SetColumnWidth(nColIdx, 70); m_gridUserManager.SetItemText(nRowIdx, nColIdx++, _T("æå䏿¬¡ç»å½æ¶é´")); m_gridUserManager.SetFixedRowSelection(FALSE); m_gridUserManager.SetFixedColumnSelection(FALSE); m_gridUserManager.EnableSelection(TRUE); m_gridUserManager.SetEditable(TRUE); m_gridUserManager.SetRowResize(FALSE); m_gridUserManager.SetColumnResize(FALSE); m_gridUserManager.ExpandColumnsToFit(TRUE); FillUserManager(); } void CUserManagerDlg::FillUserManager() { UserManager& userManager = UserManager::getInstance(); if (!userManager.isLoggedIn()) { AfxMessageBox(_T("æªç»å½")); return; } if (userManager.getCurrentUserRole() != UserRole::SuperAdmin) { AfxMessageBox(_T("é管çåç¨æ·")); return; } std::vector<std::vector<std::string>> usersData = userManager.getUsers(); if (!usersData.empty()) { m_gridUserManager.SetRowCount(usersData.size() + 1); for (size_t i = 0; i < usersData.size(); i++) { int nRowIdx = i + 1; int nColIdx = 0; m_gridUserManager.SetItemText(nRowIdx, nColIdx++, std::to_string(i + 1).c_str()); for (size_t j = 0; j < usersData[i].size(); j++) { if (usersData[i][1].empty()) { continue; } m_gridUserManager.SetItemText(nRowIdx, nColIdx++, usersData[i][j].c_str()); } } m_gridUserManager.Invalidate(); m_gridUserManager.UpdateWindow(); } CStringArray permissions; permissions.Add(_T("管çå")); permissions.Add(_T("å·¥ç¨å¸")); permissions.Add(_T("æä½å")); int nCols = m_gridUserManager.GetColumnCount(); for (int i = 1; i < m_gridUserManager.GetRowCount(); ++i) { m_gridUserManager.SetItemState(i, 0, GVIS_READONLY); // 第ä¸ååªè¯» m_gridUserManager.SetItemState(i, nCols - 1, GVIS_READONLY); // æåä¸ååªè¯» // 第åå设置æéåä¸ºä¸ææ¡ if (m_gridUserManager.SetCellType(i, 3, RUNTIME_CLASS(CGridCellCombo))) { CGridCellCombo* pCell = static_cast<CGridCellCombo*>(m_gridUserManager.GetCell(i, 3)); pCell->SetOptions(permissions); pCell->SetStyle(CBS_DROPDOWNLIST); CString cstrRole = m_gridUserManager.GetItemText(i, 3); int nRole = _ttoi(cstrRole); if (nRole < 0 || nRole > 2) { CString cstrMessage; cstrMessage.Format(_T("ç¨æ· [%s]ï¼æéå¼å¸¸ï¼å°è®¾ç½®ææä½åï¼"), m_gridUserManager.GetItemText(i, 1)); AfxMessageBox(cstrMessage); nRole = 2; } m_gridUserManager.SetItemText(i, 3, permissions.GetAt(nRole)); } // 第äºãå åï¼ä¼è¯è¶ æ¶ï¼è®¾ç½®ä¸ºNumeric m_gridUserManager.SetCellType(i, 4, RUNTIME_CLASS(CGridCellNumeric)); m_gridUserManager.SetCellType(i, 5, RUNTIME_CLASS(CGridCellNumeric)); } } void CUserManagerDlg::AddRow(CGridCtrl* pGridCtrl) { if (!pGridCtrl) return; if (pGridCtrl->GetRowCount() <= 0 || pGridCtrl->GetColumnCount() <= 0) { AfxMessageBox(_T("ç½æ ¼æ§ä»¶æªæ£ç¡®åå§åï¼è¯·æ£æ¥åå§åé»è¾ï¼")); return; } int nRowCount = pGridCtrl->GetRowCount(); pGridCtrl->SetRowCount(nRowCount + 1); int newRowIndex = nRowCount; CString strText; strText.Format(_T("%d"), newRowIndex); pGridCtrl->SetItemText(newRowIndex, 0, strText); strText.Format(_T("User%d"), newRowIndex); pGridCtrl->SetItemText(newRowIndex, 1, strText); pGridCtrl->SetItemText(newRowIndex, 2, _T("123456")); pGridCtrl->SetItemText(newRowIndex, 3, _T("æä½å")); pGridCtrl->SetItemText(newRowIndex, 4, _T("30")); pGridCtrl->SetItemText(newRowIndex, 5, _T("72")); pGridCtrl->SetItemText(newRowIndex, 6, _T("2024-01-01 00:00:00")); int nCols = m_gridUserManager.GetColumnCount(); m_gridUserManager.SetItemState(newRowIndex, 0, GVIS_READONLY); // 第ä¸å m_gridUserManager.SetItemState(newRowIndex, nCols - 1, GVIS_READONLY); // æåä¸å // 第ååè®¾ç½®ï¼æéåï¼ä¸ºä¸ææ¡ CStringArray permissions; permissions.Add(_T("管çå")); permissions.Add(_T("å·¥ç¨å¸")); permissions.Add(_T("æä½å")); if (m_gridUserManager.SetCellType(newRowIndex, 3, RUNTIME_CLASS(CGridCellCombo))) { CGridCellCombo* pCell = static_cast<CGridCellCombo*>(m_gridUserManager.GetCell(newRowIndex, 3)); pCell->SetOptions(permissions); pCell->SetStyle(CBS_DROPDOWNLIST); m_gridUserManager.SetItemText(newRowIndex, 3, permissions.GetAt(2)); } // 第äºãå åï¼ä¼è¯è¶ æ¶ï¼è®¾ç½®ä¸ºNumeric m_gridUserManager.SetCellType(newRowIndex, 4, RUNTIME_CLASS(CGridCellNumeric)); m_gridUserManager.SetCellType(newRowIndex, 5, RUNTIME_CLASS(CGridCellNumeric)); pGridCtrl->Invalidate(); pGridCtrl->UpdateWindow(); } void CUserManagerDlg::DeleteSelectedRow(CGridCtrl* pGridCtrl) { if (!pGridCtrl) return; CCellRange selectedRange = pGridCtrl->GetSelectedCellRange(); if (selectedRange.IsValid()) { CString currentUser = UserManager::getInstance().getCurrentUser().c_str(); std::vector<int> rowsToDelete; for (int row = selectedRange.GetMinRow(); row <= selectedRange.GetMaxRow(); ++row) { BOOL isRowSelected = FALSE; for (int col = selectedRange.GetMinCol(); col <= selectedRange.GetMaxCol(); ++col) { if (pGridCtrl->IsCellSelected(row, col)) { isRowSelected = TRUE; break; } } if (!isRowSelected) { continue; } CString selectedUser = pGridCtrl->GetItemText(row, 1); if (selectedUser == currentUser) { CString message; message.Format(_T("ç¨æ· [%s] æ¯å½åç»å½ç¨æ·ï¼ä¸è½å é¤ï¼"), currentUser); AfxMessageBox(message, MB_OK | MB_ICONEXCLAMATION); return; } rowsToDelete.push_back(row); } if (rowsToDelete.empty()) { AfxMessageBox(_T("请å éæ©è¦å é¤çè¡ï¼"), MB_OK | MB_ICONINFORMATION); return; } CString message; if (rowsToDelete.size() == 1) { CString selectedUser = pGridCtrl->GetItemText(rowsToDelete[0], 1); message.Format(_T("ç¡®å®è¦å é¤éä¸ç¨æ· [%s] åï¼"), selectedUser); } else { message.Format(_T("ç¡®å®è¦å é¤éä¸ç %d ä¸ªç¨æ·åï¼"), rowsToDelete.size()); } if (AfxMessageBox(message, MB_YESNO | MB_ICONQUESTION) == IDYES) { for (auto it = rowsToDelete.rbegin(); it != rowsToDelete.rend(); ++it) { pGridCtrl->DeleteRow(*it); } pGridCtrl->Invalidate(); pGridCtrl->UpdateWindow(); } } else { AfxMessageBox(_T("请å éæ©è¦å é¤çç¨æ·ï¼"), MB_OK | MB_ICONINFORMATION); } } bool CUserManagerDlg::IsUsernameDuplicate(const CString& username) { for (int row = 1; row < m_gridUserManager.GetRowCount(); ++row) { if (m_gridUserManager.GetItemText(row, 1) == username) { return true; } } return false; } void CUserManagerDlg::AdjustControls(int nWidth, int nHeight) { CWnd* pWnd = GetWindow(GW_CHILD); while (pWnd) { UINT nCtrlID = pWnd->GetDlgCtrlID(); CRect ctrlRect; pWnd->GetWindowRect(&ctrlRect); ScreenToClient(&ctrlRect); // è®¡ç®æ§ä»¶çæ°ä½ç½®å大å°ï¼ææ¯ä¾è°æ´ int newX = (int)(ctrlRect.left * (nWidth / (float)m_nInitialWidth)); int newY = (int)(ctrlRect.top * (nHeight / (float)m_nInitialHeight)); int newWidth = (int)(ctrlRect.Width() * (nWidth / (float)m_nInitialWidth)); int newHeight = (int)(ctrlRect.Height() * (nHeight / (float)m_nInitialHeight)); TCHAR szClassName[256]; GetClassName(pWnd->m_hWnd, szClassName, sizeof(szClassName)); if (_tcsicmp(szClassName, _T("MFCGridCtrl")) == 0) { CGridCtrl* pGridCtrl = (CGridCtrl*)pWnd; pGridCtrl->SetDefCellHeight(newHeight / 20); pGridCtrl->ExpandColumnsToFit(TRUE); pGridCtrl->Invalidate(); } pWnd->MoveWindow(newX, newY, newWidth, newHeight); AdjustControlFont(pWnd, newWidth, newHeight); // è·åä¸ä¸ä¸ªæ§ä»¶ pWnd = pWnd->GetNextWindow(); } } void CUserManagerDlg::AdjustControlFont(CWnd* pWnd, int nWidth, int nHeight) { TCHAR szClassName[256]; GetClassName(pWnd->m_hWnd, szClassName, sizeof(szClassName)); if (_tcsicmp(szClassName, _T("Static")) == 0) { CStatic* pStatic = (CStatic*)pWnd; pStatic->ModifyStyle(0, SS_CENTER | SS_CENTERIMAGE); return; } if (_tcsicmp(szClassName, _T("MFCGridCtrl")) == 0) { return; } int fontSize = nHeight - 10; CFont* pCurrentFont = pWnd->GetFont(); LOGFONT logFont; pCurrentFont->GetLogFont(&logFont); logFont.lfHeight = -fontSize; CFont newFont; newFont.CreateFontIndirect(&logFont); pWnd->SetFont(&newFont); pWnd->Invalidate(); } BEGIN_MESSAGE_MAP(CUserManagerDlg, CDialogEx) ON_WM_SIZE() ON_BN_CLICKED(IDC_BUTTON_ADD, &CUserManagerDlg::OnBnClickedButtonAdd) ON_BN_CLICKED(IDC_BUTTON_DEL, &CUserManagerDlg::OnBnClickedButtonDel) ON_BN_CLICKED(IDOK, &CUserManagerDlg::OnBnClickedOk) ON_BN_CLICKED(IDC_BUTTON_INSERT, &CUserManagerDlg::OnBnClickedButtonInsert) END_MESSAGE_MAP() // CUserManagerDlg æ¶æ¯å¤çç¨åº BOOL CUserManagerDlg::OnInitDialog() { CDialogEx::OnInitDialog(); // TODO: 卿¤æ·»å é¢å¤çåå§å CRect screenRect, dlgRect, clientRect; SetWindowText(_T("ç¨æ·ç®¡ç")); SystemParametersInfo(SPI_GETWORKAREA, 0, &screenRect, 0); GetClientRect(&clientRect); m_nInitialWidth = clientRect.Width(); m_nInitialHeight = clientRect.Height(); GetWindowRect(&dlgRect); int dlgWidth = dlgRect.Width() * 3; int dlgHeight = dlgRect.Height() * 3; if (dlgWidth > screenRect.Width()) { dlgWidth = screenRect.Width(); } if (dlgHeight > screenRect.Height()) { dlgHeight = screenRect.Height(); } int centerX = screenRect.left + (screenRect.Width() - dlgWidth) / 2; int centerY = screenRect.top + (screenRect.Height() - dlgHeight) / 2; MoveWindow(centerX, centerY, dlgWidth, dlgHeight); // åå§åç¨æ·ç®¡çè¡¨æ ¼ InitUserManager(); return TRUE; // return TRUE unless you set the focus to a control // å¼å¸¸: OCX 屿§é¡µåºè¿å FALSE } void CUserManagerDlg::OnSize(UINT nType, int cx, int cy) { CDialogEx::OnSize(nType, cx, cy); // TODO: 卿¤å¤æ·»å æ¶æ¯å¤çç¨åºä»£ç CRect rect; GetClientRect(&rect); // éåå¯¹è¯æ¡ä¸çæææ§ä»¶ AdjustControls(rect.Width(), rect.Height()); } void CUserManagerDlg::OnBnClickedButtonAdd() { // TODO: 卿¤æ·»å æ§ä»¶éç¥å¤çç¨åºä»£ç AddRow(&m_gridUserManager); } void CUserManagerDlg::OnBnClickedButtonInsert() { // TODO: 卿¤æ·»å æ§ä»¶éç¥å¤çç¨åºä»£ç if (!m_gridUserManager.GetSafeHwnd()) return; CCellRange selectedRange = m_gridUserManager.GetSelectedCellRange(); if (!selectedRange.IsValid()) { AfxMessageBox(_T("请å éæ©è¦æå ¥çä½ç½®ï¼"), MB_OK | MB_ICONINFORMATION); return; } int minRow = selectedRange.GetMinRow(); int maxRow = selectedRange.GetMaxRow(); if (minRow < 1) { AfxMessageBox(_T("è¯·éæ©ææçè¡ï¼"), MB_OK | MB_ICONEXCLAMATION); return; } for (int row = maxRow; row >= minRow; --row) { std::vector<CString> rowData; for (int col = 0; col < m_gridUserManager.GetColumnCount(); ++col) { rowData.push_back(m_gridUserManager.GetItemText(row, col)); } m_gridUserManager.InsertRow(_T("æ°ç¨æ·"), row); CString newUsername = rowData[1]; int suffix = 1; while (IsUsernameDuplicate(newUsername)) { newUsername.Format(_T("%s_%d"), rowData[1], suffix++); } rowData[1] = newUsername; for (int col = 0; col < m_gridUserManager.GetColumnCount(); ++col) { m_gridUserManager.SetItemText(row, col, rowData[col]); } CStringArray permissions; permissions.Add(_T("管çå")); permissions.Add(_T("å·¥ç¨å¸")); permissions.Add(_T("æä½å")); if (m_gridUserManager.SetCellType(row, 3, RUNTIME_CLASS(CGridCellCombo))) { CGridCellCombo* pCell = static_cast<CGridCellCombo*>(m_gridUserManager.GetCell(row, 3)); pCell->SetOptions(permissions); pCell->SetStyle(CBS_DROPDOWNLIST); m_gridUserManager.SetItemText(row, 3, rowData[3]); } m_gridUserManager.SetCellType(row, 4, RUNTIME_CLASS(CGridCellNumeric)); m_gridUserManager.SetCellType(row, 5, RUNTIME_CLASS(CGridCellNumeric)); } for (int row = 1; row < m_gridUserManager.GetRowCount(); ++row) { CString strIndex; strIndex.Format(_T("%d"), row); m_gridUserManager.SetItemText(row, 0, strIndex); } m_gridUserManager.Invalidate(); m_gridUserManager.UpdateWindow(); } void CUserManagerDlg::OnBnClickedButtonDel() { // TODO: 卿¤æ·»å æ§ä»¶éç¥å¤çç¨åºä»£ç DeleteSelectedRow(&m_gridUserManager); } void CUserManagerDlg::OnBnClickedOk() { // TODO: 卿¤æ·»å æ§ä»¶éç¥å¤çç¨åºä»£ç std::vector<std::vector<std::string>> vecData; for (int i = 1; i < m_gridUserManager.GetRowCount(); ++i) { std::vector<std::string> rowData; for (int j = 1; j < m_gridUserManager.GetColumnCount(); ++j) { CString cellText = m_gridUserManager.GetItemText(i, j); std::string cellString = CT2A(cellText.GetString()); if (j == 3) { if (cellText == _T("管çå")) cellString = "0"; else if (cellText == _T("å·¥ç¨å¸")) cellString = "1"; else if (cellText == _T("æä½å")) cellString = "2"; else cellString = "2"; } rowData.push_back(cellString); } vecData.push_back(rowData); } UserManager::getInstance().setUsers(vecData); CDialogEx::OnOK(); } SourceCode/Bond/BondEq/UserManagerDlg.h
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,47 @@ #pragma once #include "afxdialogex.h" #include "GridCtrl.h" // CUserManagerDlg å¯¹è¯æ¡ class CUserManagerDlg : public CDialogEx { DECLARE_DYNAMIC(CUserManagerDlg) public: CUserManagerDlg(CWnd* pParent = nullptr); // æ åæé 彿° virtual ~CUserManagerDlg(); // å¯¹è¯æ¡æ°æ® #ifdef AFX_DESIGN_TIME enum { IDD = IDD_DIALOG_USER_MANAGER }; #endif private: void InitUserManager(); void FillUserManager(); void AddRow(CGridCtrl* pGridCtrl); void DeleteSelectedRow(CGridCtrl* pGridCtrl); bool IsUsernameDuplicate(const CString& username); void AdjustControls(int nWidth, int nHeight); void AdjustControlFont(CWnd* pWnd, int nWidth, int nHeight); private: int m_nInitialWidth; int m_nInitialHeight; private: CGridCtrl m_gridUserManager; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV æ¯æ DECLARE_MESSAGE_MAP() public: virtual BOOL OnInitDialog(); afx_msg void OnSize(UINT nType, int cx, int cy); afx_msg void OnBnClickedButtonAdd(); afx_msg void OnBnClickedButtonInsert(); afx_msg void OnBnClickedButtonDel(); afx_msg void OnBnClickedOk(); }; SourceCode/Bond/BondEq/stdafx.h
@@ -47,8 +47,24 @@ #include "..\DatabaseSDK\include\MySQLDatabase.h" #include "..\DatabaseSDK\include\SQLiteDatabase.h" // æ§ä»¶æ¨¡å #include "..\BLControlsSDK\include\BLControls.h" // æ§ä»¶æ ·å¼ static UINT g_nGridFixCellColor = RGB(144, 200, 246); static UINT g_nGridFixFontColor = RGB(0, 0, 0); static UINT g_nGridCellColor = RGB(255, 255, 255); static UINT g_nGridCellColor_NonSelect = RGB(150, 150, 150); static UINT g_nGridCellReadyColor = RGB(255, 255, 0); static UINT g_nGridCellOnColor = RGB(255, 69, 0); static UINT g_nGridCellOffColor = RGB(128, 191, 255); static UINT g_nPropertyGridFixCellColor = RGB(150, 150, 150); static UINT g_nPropertyGridFixFontColor = RGB(0, 0, 0); static UINT g_nSequenceOffColor = RGB(0, 0, 0); static UINT g_nSequenceOnColor = RGB(0, 180, 0); static UINT g_nSequenceErrorColor = RGB(255, 0, 0); static UINT g_nSequenceWarningColor = RGB(255, 255, 0); static UINT g_nSequenceReadyColor = RGB(0, 0, 255); static UINT g_nSequenceRunningColor = RGB(0, 255, 255); static UINT g_nSequencePauseColor = RGB(255, 0, 255); static UINT g_nSequenceStopColor = RGB(128, 128, 128); #if defined(_WIN64) #if defined(_DEBUG) SourceCode/Bond/x64/Debug/Config/BondEq.dbBinary files differ
SourceCode/Bond/x64/Debug/Config/BondServo.dbBinary files differ