1、新建一个对话框形式的MFC程序,将百度网盘保存的“GridCtrl”文件保存到源代码目录下。
网址https://www.codeproject.com/Articles/8/MFC-Grid-control
2、将整个文件夹放到工程目录所在的文件夹下,所有内容添加到资源管理器。在对话框XXX.h文件中添加头文件
3、从工具箱拉一个Custom Control控件,确定位置。
4、属性CLASS设置为MFCGridCtrl。
5、添加变量,变量类型为CGridCtrl。
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检查关闭
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) | 设置显示哪些(如果有)网格线。 |
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* 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。 |
BOOL SetItemState(int nRow, int nCol, UINT state) | 设置给定单元格的状态 ps:m_Grid.SetItemState(row,col, m_Grid.GetItemState(row,col) | GVIS_READONLY); |
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()自动填充,可以先设置长度有要求的单元格,其他的默认填充宽度。
Q2,列表里面加combo,check等。
在.cpp加前缀,如果没有这个会报错“error C2653: “CGridCellCombo”: 不是类或命名空间名称”
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的单元格