【MFC笔记】GridCtrl表格控件的使用

1、新建一个对话框形式的MFC程序,将百度网盘保存的“GridCtrl”文件保存到源代码目录下。

网址https://www.codeproject.com/Articles/8/MFC-Grid-control

2、将整个文件夹放到工程目录所在的文件夹下,所有内容添加到资源管理器。在对话框XXX.h文件中添加头文件

【MFC笔记】GridCtrl表格控件的使用_第1张图片【MFC笔记】GridCtrl表格控件的使用_第2张图片

3、从工具箱拉一个Custom Control控件,确定位置。

【MFC笔记】GridCtrl表格控件的使用_第3张图片

4、属性CLASS设置为MFCGridCtrl。

【MFC笔记】GridCtrl表格控件的使用_第4张图片

5、添加变量,变量类型为CGridCtrl。

【MFC笔记】GridCtrl表格控件的使用_第5张图片

6、在对话框初始化程序中添加代码测试

// TODO: 在此添加额外的初始化代码
	CRect cr;
	//m_Grid.GetWindowRect(&cr);//获得画图区域
	m_Grid.GetClientRect(&cr);
	int nRowNum = 6;
	m_Grid.SetColumnCount(6);//设置6列
	m_Grid.SetRowCount(nRowNum);//设置3行
	m_Grid.SetFixedRowCount(1);
	m_Grid.SetFixedColumnCount(1);//表头一行一列

	CString rowName, colName;
	for (int i = 0; i<6; i++)
	{
		m_Grid.SetColumnWidth(i, cr.Width() / 5);//设置列宽
		rowName.Format(_T("第%d行"), i);
		colName.Format(_T("第%d列"), i);
		m_Grid.SetItemText(0, i, colName);//设置内容
		if (i < nRowNum) {
			m_Grid.SetRowHeight(i, cr.Height() / nRowNum);//设置行高
			m_Grid.SetItemText(i, 0, rowName);
		}
	}
	COLORREF clr = RGB(255, 255, 0);
	m_Grid.SetFixedTextColor(clr);//设置固定行的颜色
	m_Grid.SetFixedBkColor(RGB(0, 255, 255));//设置固定行的背景颜色
	m_Grid.SetTextBkColor(clr);//设置可编辑区域背景颜色
	m_Grid.SetTextColor(RGB(0, 255, 255));//设置可编辑区域文字颜色
	m_Grid.SetEditable(false);//表格内容不可编辑设置

运行出现错误,将SDL检查关闭

【MFC笔记】GridCtrl表格控件的使用_第6张图片

【MFC笔记】GridCtrl表格控件的使用_第7张图片

7、其他常见操作

很多很多,有时间再整理了

int GetRowCount() const 返回行数(包括固定行)
int GetColumnCount() const 返回列数(包括固定列)
int GetFixedRowCount() const 返回固定行数
int GetFixedColumnCount() const 返回固定列的数量
BOOL SetRowCount(int nRows) 设置行数(包括固定行),成功时返回TRUE。
BOOL SetColumnCount(int nCols) 设置列数(包括固定列),成功时返回TRUE。
BOOL SetFixedRowCount(int nFixedRows = 1) 设置固定行数,成功时返回TRUE。
BOOL SetFixedColumnCount(int nFixedCols = 1) 设置固定列数,成功时返回TRUE。
   
int GetRowHight(int nRow) const 获得nRow行的高度
BOOL SetRowHight(int nRow,int hight) 设置nRow行的高度
int GetColumnWidth(int nCol) const 获得nCol列的宽度
BOOL SetColumnWidth(int nCol,int width)  
int GetFixedRowHeight() const 获取固定行的组合高度
int GetFixedColumnWidth() const 获取固定列的组合宽度
long GetVirtualHeight() const 获取所有行的组合高度
long GetVirtualWidth() const 获取所有列的组合宽度
BOOL GetCellOrigin(int nRow, int nCol,LPPOINT p) 获取单元格(nRow,nCol)的topleft点,存在CPoint指针内
BOOL GetCellOrigin(const CCellID& cell,LPPOINT p) 获取给定单元格的topleft点
BOOL GetCellRect(int nRow, int nCol,LPRECT pRect) 获取给定单元格的边界矩形
BOOL GetCellRect(const CCellID& cell, LPRECT pRect) 获取给定单元格的边界矩形
BOOL GetTextRect(int nRow, int nCol,LPRECT pRect) 获取给定单元格中文本的边界矩形
BOOL GetTextRect(const CCellID& cell, LPRECT pRect) 获取给定单元格中文本的边界矩形
BOOL GetTextExtent(int nRow, int nCol,LPCTSTR str) 获取给定单元格的给定文本的边界矩形???
BOOL GetCellTextExtent(int nRow, int nCol) 获取给定单元格中文本的边界矩形???
   
void Reorder(int From, int To); 排序,从from到to行
void AllowReorderColumn(bool b=true) 是否允许重新排序
   
void SetGridLines(int nWhichLines = GVL_BOTH)

设置显示哪些(如果有)网格线。

GVL_NONE      // No grid lines
GVL_HORZ      // Horizontal lines only
GVL_VERT      // Vertical lines only
GVL_BOTH      // Both vertical and horizontal lines
int GetGridLines()  
void SetEditable(BOOL bEditable = TRUE) 设置网格是否可编辑
BOOL IsEditable()  
void SetListMode(BOOL bEnableListMode = TRUE)

将网格设置为列表模式(或从列表模式中删除)。

当网格处于列表模式时,将启用完整行选择,

单击列标题将按行对网格进行排序。

BOOL GetListMode()  
void SetRowResize(BOOL bResize = TRUE) 设置是否可以调整行的大小BOOL GetRowResize()
void SetColumnResize(BOOL bResize = TRUE) 设置是否可以调整列的大小BOOL GetColumnResize()
void SetTrackFocusCell(BOOL bTrack)

设置与当前焦点单元格在同一行/列上的固定单元格

是否使用凹陷边框突出显示

BOOL GetTrackFocusCell()

void SetFrameFocusCell(BOOL bFrame)

设置具有焦点的单元格是否以框架边框突出显示

BOOL GetFrameFocusCell()

void EnableTitleTips(BOOL bEnable = TRUE) 设置是否使用标题提示
   
void SetGridBkColor(COLORREF clr)

设置控件的背景颜色(固定和非固定单元格外的区域)

COLORREF GetGridBkColor()

void SetGridLineColor(COLORREF clr)

设置网格线的颜色。

COLORREF GetGridLineColor()

void SetTitleTipBackClr(COLORREF clr = CLR_DEFAULT)

设置标题提示的背景颜色

COLORREF GetTitleTipBackClr()

void SetTitleTipTextClr(COLORREF clr = CLR_DEFAULT)

设置标题提示的文本颜色

COLORREF GetTitleTipTextClr()

   

CGridCellBase* GetDefaultCell(BOOL bFixedRow, BOOL bFixedCol) const

 
CGridCellBase* GetCell(int nRow, int nCol) const 获取给定行/列的实际单元格
BOOL SetCellType(int nRow, int nCol,CRuntimeClass* pRuntimeClass);

设置单元格类类型

CGridCellCheck、CGridCellCombo、CGridCellNumeric

CGridDefaultCell

void SetModified(BOOL bModified = TRUE, int nRow = -1, int nCol = -1); 设置单元格的修改标志。如果未指定行或列,则更改会影响整个网格。
BOOL IsItemEditing(int nRow, int nCol) 如果当前正在编辑单元格,则返回TRUE
BOOL SetItem(const GV_ITEM* pItem)

使用GV_ITEM结构中的值设置单元格的内容。

请注意,mask字段的值将确定实际更改了哪些值

(参见CListCtrl :: SetItem)。

BOOL SetItemText(int nRow, int nCol, LPCTSTR str) 设置给定单元格的文本。成功时返回TRUE
virtual CString GetItemText(int nRow, int nCol) 获取给定单元格的文本。此功能是虚拟的,以帮助扩展。
BOOL SetItemData(int nRow, int nCol, LPARAM lParam)

设置给定单元格的lParam(用户定义数据)字段。成功时返回TRUE。

typedef struct _GV_ITEM {
        int      row,col;   // Row and Column of item
        UINT     mask;      // Mask for use in getting/setting cell data
        UINT     state;     // cell state (focus/hilighted etc)
        UINT     nFormat;   // Format of cell. Default imaplentation 
                            // used CDC::DrawText formats
        CString  szText;    // Text in cell
        int      iImage;    // index of the list view item’s 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
} GV_ITEM;
BOOL SetItemState(int nRow, int nCol,  UINT state)

设置给定单元格的状态

ps:m_Grid.SetItemState(row,col, m_Grid.GetItemState(row,col) | GVIS_READONLY);

GVIS_FOCUSED     // Cell has focus
GVIS_SELECTED    // Cell is selected
GVIS_DROPHILITED // Cell is drop highlighted
GVIS_READONLY    // Cell is read-only and cannot be edited
GVIS_FIXED       // Cell is fixed
GVIS_FIXEDROW    // Cell is part of a fixed row
GVIS_FIXEDCOL    // Cell is part of a fixed column
GVIS_MODIFIED    // Cell has been modified
int InsertColumn(LPCTSTR strHeading,  UINT nFormat, int nColumn = -1)

如果nCol <0,则在nCol给定的位置插入一列,

或者在所有列的末尾插入一列.strHeading是列标题,nFormat是格式。

int InsertRow(LPCTSTR strHeading,  int nRow = -1) 行中每个单元格的格式将是同一列的第一行中单元格的格式。
BOOL DeleteColumn(int nColumn) BOOL DeleteRow(int nRow)
BOOL DeleteAllItems() BOOL DeleteNonFixedRows()
void ExpandLastColumn() 扩展最后一列宽度以填充任何剩余的网格区域
void ExpandRowsToFit(BOOL bExpandFixed=TRUE) 扩展行高以适合网格区域。如果bExpandFixed为TRUE,则修改的行将被修改,否则它们不会受到影响
void ExpandToFit(BOOL bExpandFixed = TRUE) 扩展行和列以适合网格区域。如果bExpandFixed为TRUE,则修改单元格将被修改,否则它们不会受到影
   
   
   
   
   

 

 

Q1,列表和自定义区域之间有空隙,比如,每列选择宽带是自定义区域的1/6,但是6列不能填满区域,右边有灰色地方,如下图。

解决办法:调用m_Grid.ExpandToFit()自动填充,可以先设置长度有要求的单元格,其他的默认填充宽度。

【MFC笔记】GridCtrl表格控件的使用_第8张图片【MFC笔记】GridCtrl表格控件的使用_第9张图片

 

Q2,列表里面加combo,check等。

在.cpp加前缀,如果没有这个会报错“error C2653: “CGridCellCombo”: 不是类或命名空间名称”

【MFC笔记】GridCtrl表格控件的使用_第10张图片

check:

m_Grid.SetCellType(2, 1, RUNTIME_CLASS(CGridCellCheck));

 ((CGridCellCheck*)m_Grid.GetCell(2, 1))->SetCheck(true);

 

combo:

CStringArray option;
    option.Add("选项1");
    option.Add("选项2");
    m_Grid.SetCellType(3, 1, RUNTIME_CLASS(CGridCellCombo));
    ((CGridCellCombo*)m_Grid.GetCell(3, 1))->SetOptions(option);
    option.RemoveAll();
    ((CGridCellCombo*)m_Grid.GetCell(3, 1))->SetText("选项1");//默认显示内容

 

Q3、某空格可编辑

m_Grid.SetEditable(TRUE);//所有课编辑
    m_Grid.SetItemState(1, 1, GVIS_READONLY);//只读

m_Grid.GetCell(1, 1)->SetState(GVIS_READONLY);

 

Q4、合并两个单元格

m_Grid.MergeCells(0, 0, 1, 1);//合并从00到11的单元格

你可能感兴趣的:(MFC)