logo资料库

GridCtrl控件FAQ.doc

第1页 / 共41页
第2页 / 共41页
第3页 / 共41页
第4页 / 共41页
第5页 / 共41页
第6页 / 共41页
第7页 / 共41页
第8页 / 共41页
资料共41页,剩余部分请下载后查看
GridCtrlEx控件FAQ
1. 一个固定用法
2. 可以控制单元格是否可以编辑
3. 在选定一个单元格时,选择整行
4. 说明添加固定列头和固定行头的方法
5. 说明填写表格内容的方法
6. 在选定一行时有响应函数
7. 由双击的响应函数
8. 由响应右键点击的函数
9. 可以方便的删除和添加固定列头
10.可以设置、删除、添加固定行头
11.可以在第一个单元格中加入Check控件
12.可设表格的背景和字体,可设单元格的颜色和字体
13.可以方便的添加或者删除一行
14.可以由程序选定某一行
15.可以由程序自动滚动到某一行,显示在用户面前
16.说明添加排序功能的方法
17.说明在单元格中添加或者改变图形的方法
18.遍历所有的选中行的方法
19.设置控件允许单选或者多选的方法
20.设置不要焦点和焦点外框的方法
21.CGridCtrl的扩展
GridCtrl函数详解
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—
分享到:
收藏