GridCtrlEx 控件 FAQ
目录
GridCtrlEx 控件 FAQ....................................................................................................1
1. 一个固定用法.......................................................................................................... 1
2. 可以控制单元格是否可以编辑.............................................................................. 3
3. 在选定一个单元格时,选择整行.......................................................................... 4
4. 说明添加固定列头和固定行头的方法.................................................................. 4
5. 说明填写表格内容的方法...................................................................................... 5
6. 在选定一行时有响应函数...................................................................................... 6
7. 由双击的响应函数.................................................................................................. 6
8. 由响应右键点击的函数.......................................................................................... 6
9. 可以方便的删除和添加固定列头.......................................................................... 8
10.可以设置、删除、添加固定行头.......................................................................... 8
11.可以在第一个单元格中加入 Check 控件.............................................................. 8
12.可设表格的背景和字体,可设单元格的颜色和字体.......................................... 8
13.可以方便的添加或者删除一行.............................................................................. 9
14.可以由程序选定某一行.......................................................................................... 9
15.可以由程序自动滚动到某一行,显示在用户面前............................................ 10
16.说明添加排序功能的方法.................................................................................... 10
17.说明在单元格中添加或者改变图形的方法........................................................ 11
18.遍历所有的选中行的方法.................................................................................... 12
19.设置控件允许单选或者多选的方法.................................................................... 13
20.设置不要焦点和焦点外框的方法........................................................................ 13
21.CGridCtrl 的扩展................................................................................................... 13
1. 一个固定用法
一个常用的用法是将 CridCtrl 当做 ListCtrl 那样的用,同时又增加了即时编
辑的功能:
以下假设在一个 Dlg 增加一个 GridCtrl 的控件:
我们可以按以下步骤进行:
第一步:表格控件加到工程中去
可以有两种方法:
可以使用 controls panel 中的 custom control 添加,添加后如下设置:
—1—
也可以用菜单 View-Resource Symbol 添加一个 ID 号(适用于 Create 出来的
GridCtrl)
第二步:在 Dlg 的头文件中加入
CGridCtrl m_Grid;
第三步:Create 控件(如果是用 controls panel 中的 custom control 添加的可以
跳过)
在 Dlg 的 OnCreate 函数中添加
m_Grid.Create(……)代码
第四步:创始化控件
在 DoDataExchange 中添加
DDX_GridControl(pDX, IDC_GRID, m_Grid);
在 Dlg 的 OnInitialDialog 中添加如下代码:
//设置控件类似于 ListCtrl 的表现
m_Grid.SetListMode(TRUE);
//设置控件颜色,这里 GetDefaultCell 的两个参数分别表示是否是固定
行或者是固定列。如果不设定,缺省的颜色为白色。
m_Grid.GetDefaultCell(FALSE, FALSE)->SetBackClr(Color);
//设置控件的固定行为一行,一般是必须的
m_Grid.SetFixedRowCount(1);
//设置控件的固定行或者固定列不能被选中
m_Grid.SetFixedColumnSelection(FALSE);
m_Grid.SetFixedRowSelection(FALSE);
//设置控件是否允许隐藏行或者列
m_Grid.EnableColumnHide(FALSE);
m_Grid.EnableRowHide(FALSE);
//设置控件是否允许编辑
m_Grid.SetEditable(FALSE);
//设置控件是否允许选择
m_Grid.EnableSelection(TRUE);
—2—
//设置控件是否允许点击表头排序
m_Grid.SetHeaderSort(TRUE);
//设置控件是否允许多选或者单选
m_Grid.SetSingleRowSelection(TRUE);
m_Grid.SetSingleColSelection(TRUE);
//设置控件的初始行数和列数
m_Grid.SetRowCount(1);
m_Grid.SetColumnCount(4);
//设置控件是否允许自动调整行列大小
m_Grid.SetRowResize(FALSE);
m_Grid.SetColumnResize(FALSE);
//设置控件不要焦点和焦点外框
m_Grid.SetTrackFocusCell(FALSE);
m_Grid.SetFrameFocusCell(FALSE);
第五步:设置控件的内容
强烈建议添加以下 Dlg 的两个成员函数:
void FillColumn();
//具体内容见 4
void FillItem();
第六步:设置控件的响应
具体可见 6、7、8
其它
//具体内容见 5
在使用过程中经常需要由程式设定选中行,请始终连续使用以下两个语句:
m_Grid.SetSelectedRange(nRow,0,
nRow,m_Grid.GetColumnCount()-1)
m_Grid.EnsureVisible(nRow, 0);
其中 nRow 为要选中的那一行,强烈建议不要将这两句语句放在 FillItem()
中,这样会导致不灵活
2. 可以控制单元格是否可以编辑
可以设定整张表格为只读
void CGridCtrl::SetEditable(BOOL bEditable = TRUE)
参数设为 FALSE,则整张表格为只读。
—3—
也可以设定某个单元格为只读
BOOL CGridCtrl::SetItemState(int nRow, int nCol, UINT state)
一般需配合使用 UINT CGridCtrl::GetItemState(int nRow, int nCol)
const
比如将单元格(1,1)设为只读
CGridCtrlObject.SetItemState(1,1,
m_Grid.GetItemState(1,1)
|
CGridCtrlObject.SetItemState(1,1,
m_Grid.GetItemState(1,1)
&
GVIS_READONLY);
将单元格(1,1)设为正常
~GVIS_READONLY);
单元格可用的状态常量
// Cell has focus
// Cell is selected
GVIS_FOCUSED
GVIS_SELECTED
GVIS_DROPHILITED // Cell is drop highlighted
GVIS_READONLY
GVIS_FIXED
GVIS_FIXEDROW
GVIS_FIXEDCOL
GVIS_MODIFIED
// Cell is read-only and cannot be edited
// Cell is fixed
// Cell is part of a fixed row
// Cell is part of a fixed column
// Cell has been modified
3. 在选定一个单元格时,选择整行
void CGridCtrl::SetListMode(BOOL bEnableListMode = TRUE)
先设定表格为 ListMode
4. 说明添加固定列头和固定行头的方法
CGridCtrlObject.SetFixedColumnCount(NumberFixCol);
CGridCtrlObject.SetFixedRowCount(NumberFixRow);
CGridCtrlObject.SetFixedColumnSelection(FALSE);
CGridCtrlObject.SetFixedRowSelection(FALSE);
添加固定表头的方法如下:
m_Grid.SetFixedRowCount(1);
const int nColumnNum=3;
—4—
//设定固定行数为 1 行
m_Grid.SetColumnCount(nColumnNum);
int nWidth[nColumnNum];
nWidth[0]=60;
nWidth[1]=120;
nWidth[2]=120;
for(int i=0; i
m_GridCtrl.SetRowCount(3);
m_GridCtrl.SetItemText(1, 0, "第一格");
m_GridCtrl.SetItemText(1, 1, "第二格");
m_GridCtrl.SetItemText(1, 2, "第三格");
m_GridCtrl.SetItemText(2, 0, "第四格");
m_GridCtrl.SetItemText(2, 1, "第五格");
m_GridCtrl.SetItemText(2, 2, "第六格");
m_GridCtrl.ExpandColumnsToFit();
6. 在选定一行时有响应函数
7. 由双击的响应函数
8. 由响应右键点击的函数
// Sent when dragging starts
A:
当进行单击,双击或右击单元格等操作时,表格会发送响应的消息,可以在父窗
口添加处理消息的函数,做法如下:
GVN_BEGINDRAG
GVN_BEGINLABELEDIT // Sent when inplace editing starts
GVN_ENDLABELEDIT
GVN_SELCHANGING
GVN_SELCHANGED
GVN_GETDISPINFO
grid is
// Sent when inplace editing stops
// Sent just before cell selection changes
// Sent after cell selection changes
// A request for cell information when the
// in virtual mode
// Cache hint when in virtual mode
GVN_ODCACHEHINT
右键点击,按键盘响应消息在扩展中实现了,可参见条款 21
以下需要手工添加
H 文件中:
// Generated message map functions
//{{AFX_MSG(CDlgSectionLib)
//}}AFX_MSG
afx_msg void OnGridDblClick(NMHDR *pNotifyStruct, LRESULT* pResult);
afx_msg void OnGridClick(NMHDR *pNotifyStruct, LRESULT* pResult);
afx_msg void OnGridEndSelChange(NMHDR *pNotifyStruct, LRESULT*
pResult);
DECLARE_MESSAGE_MAP()
CPP 文件中:
BEGIN_MESSAGE_MAP(CDlgSectionLib, CDialog)
—6—
//{{AFX_MSG_MAP(CDlgSectionLib)
//}}AFX_MSG_MAP
ON_NOTIFY(NM_DBLCLK, IDC_GRID, OnGridDblClick)
ON_NOTIFY(NM_CLICK, IDC_GRID, OnGridClick)
ON_NOTIFY(GVN_SELCHANGED, IDC_GRID, OnGridEndSelChange)
END_MESSAGE_MAP()
然后自定义响应函数
void CDlgSectionLib::OnGridDblClick(NMHDR *pNotifyStruct, LRESULT*
pResult)
{
NM_GRIDVIEW* pItem = (NM_GRIDVIEW*) pNotifyStruct;
pItem->iRow, pItem->iColumn;//得到当前行、列
}
// This structure sent to Grid's parent in a WM_NOTIFY message
typedef struct tagNM_GRIDVIEW {
NMHDR hdr;
int
iRow;
iColumn;
int
} NM_GRIDVIEW;
typedef struct tagNMHDR {
HWND hwndFrom; // handle of control sending message
UINT idFrom;// identifier of control sending message
UINT code; // notification code; see below
} NMHDR;
The control has lost the input focus.
The control could not complete an operation
The user has clicked the left mouse button within
The user has double-clicked the left mouse button
NM_CLICK
the control.
NM_DBLCLK
within the control.
NM_KILLFOCUS
NM_OUTOFMEMORY
because there is not enough memory available.
NM_RCLICK
the control.
NM_RDBLCLK
button within the control.
NM_RETURN
pressed the ENTER key.
NM_SETFOCUS
The user has clicked the right mouse button within
The user has double-clicked the right mouse
The control has the input focus, and the user has
The control has received the input focus.
—7—
9. 可以方便的删除和添加固定列头
10.可以设置、删除、添加固定行头
A:
参考(4)&(5)
删除可以用以下一些函数
BOOL DeleteColumn(int nColumn);
BOOL DeleteRow(int nRow);
BOOL DeleteNonFixedRows();
BOOL DeleteAllItems();
11.可以在第一个单元格中加入 Check 控件
A:
#include "NewCellTypes/GridCellCheck.h"//包含头文件
BOOL CGridCtrl::SetCellType(int nRow, int nCol,
CRuntimeClass* pRuntimeClass);
比如:CGridCtrlObject.SetCellType(1,1, RUNTIME_CLASS(CGridCellCheck));
12.可设表格的背景和字体,可设单元格的颜色和字体
设置表格的颜色CGridCtrlObject.GetDefaultCell(FALSE,
ALSE)->SetBackClr(RGB(xxx,xxx,xxx));
下面的函数均可以调用:
virtual void CGridCtrl::SetTextClr(COLORREF clr);
virtual void CGridCtrl::SetBackClr(COLORREF clr);
virtual void CGridCtrl::SetFont(const LOGFONT* plf);
设置单元格的背景颜色和前景颜色
BOOL CGridCtrl::SetItemBkColour(int nRow, int nCol, COLORREF cr
= CLR_DEFAULT)
BOOL CGridCtrl::SetItemFgColour(int nRow, int nCol, COLORREF cr
= CLR_DEFAULT)
—8—