GridCtrl控件学习_第1页
GridCtrl控件学习_第2页
GridCtrl控件学习_第3页
GridCtrl控件学习_第4页
GridCtrl控件学习_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、GridCtrlEx控件FAQ目录GridCtrlEx控件FAQ11. 一个固定用法12. 可以控制单元格是否可以编辑33. 在选定一个单元格时,选择整行34. 说明添加固定列头和固定行头的方法35. 说明填写表格内容的方法56. 在选定一行时有响应函数67. 由双击的响应函数68. 由响应右键点击的函数69. 可以方便的删除和添加固定列头710.可以设置、删除、添加固定行头711.可以在第一个单元格中加入Check控件812.可设表格的背景和字体,可设单元格的颜色和字体813.可以方便的添加或者删除一行914.可以由程序选定某一行915.可以由程序自动滚动到某一行,显示在用户面前1016.说

2、明添加排序功能的方法1017.说明在单元格中添加或者改变图形的方法1118.遍历所有的选中行的方法1119.设置控件允许单选或者多选的方法1320.设置不要焦点和焦点外框的方法1321.CGridCtrl的扩展131. 一个固定用法一个常用的用法是将CridCtrl当做ListCtrl那样的用,同时又增加了即时编辑的功能:以下假设在一个Dlg增加一个GridCtrl的控件:我们可以按以下步骤进行:第一步:表格控件加到工程中去可以有两种方法:(1)可以使用controls panel中的custom control添加,添加后如下设置:(2)也可以用菜单ViewResource Symbol添加

3、一个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);/设置控件的初始行数和列

4、数m_Grid.SetRowCount(1);m_Grid.SetColumnCount(4);/设置控件背景颜色,这里GetDefaultCell的两个参数分别表示是否是固定行或者是固定列。如果不设定,缺省的颜色为白色。 m_Grid.GetDefaultCell(FALSE, FALSE)->SetBackClr(Color);/设置控件的固定行为一行,一般是必须的m_Grid.SetFixedRowCount(1);/设置控件的固定列为一列,m_Grid.SetFixedColumnCount(1); /第一列为固定列一列/设置控件的固定行或者固定列不能被选中(默认就是固定的不能被

5、选)m_Grid.SetFixedColumnSelection(FALSE);m_Grid.SetFixedRowSelection(FALSE);/设置控件是否允许隐藏行或者列m_Grid.EnableColumnHide(FALSE);m_Grid.EnableRowHide(FALSE);/设置控件是否允许编辑m_Grid.SetEditable(FALSE);/设置控件是否允许选择m_Grid.EnableSelection(TRUE);/设置控件是否允许点击表头排序m_Grid.SetHeaderSort(TRUE);/设置控件是否允许多选或者单选m_Grid.SetSingleR

6、owSelection(TRUE);m_Grid.SetSingleColSelection(TRUE);/设置控件是否允许自动调整行列大小m_Grid.SetRowResize(FALSE);m_Grid.SetColumnResize(FALSE);/设置控件不要焦点和焦点外框m_Grid.SetTrackFocusCell(FALSE);m_Grid.SetFrameFocusCell(FALSE);第五步:设置控件的内容 强烈建议添加以下Dlg的两个成员函数:void FillColumn();/具体内容见4void FillItem();/具体内容见5第六步:设置控件的响应具体可见6

7、、7、8其它在使用过程中经常需要由程式设定选中行,请始终连续使用以下两个语句:m_Grid.SetSelectedRange(nRow,0, nRow,m_Grid.GetColumnCount()-1)m_Grid.EnsureVisible(nRow, 0);其中nRow为要选中的那一行,强烈建议不要将这两句语句放在FillItem()中,这样会导致不灵活。2. 可以控制单元格是否可以编辑l 可以设定整张表格为只读void CGridCtrl:SetEditable(BOOL bEditable = TRUE)参数设为FALSE,则整张表格为只读。l 也可以设定某个单元格为只读BOOL C

8、GridCtrl: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) | GVIS_READONLY);将单元格(1,1)设为正常CGridCtrlObject.SetItemState(1,1, m_Grid.GetItemState(1,1) & GVIS_READONLY);单元格

9、可用的状态常量GVIS_FOCUSED / Cell has focusGVIS_SELECTED / Cell is selectedGVIS_DROPHILITED / Cell is drop highlightedGVIS_READONLY / Cell is read-only and cannot be editedGVIS_FIXED / Cell is fixedGVIS_FIXEDROW / Cell is part of a fixed rowGVIS_FIXEDCOL / Cell is part of a fixed columnGVIS_MODIFIED / Cell

10、 has been modified3. 在选定一个单元格时,选择整行void CGridCtrl:SetListMode(BOOL bEnableListMode = TRUE)先设定表格为ListMode 4. 说明添加固定列头和固定行头的方法CGridCtrlObject.SetFixedColumnCount(NumberFixCol);CGridCtrlObject.SetFixedRowCount(NumberFixRow);CGridCtrlObject.SetFixedColumnSelection(FALSE);CGridCtrlObject.SetFixedRowSelec

11、tion(FALSE);添加固定表头的方法如下:m_Grid.SetFixedRowCount(1);/设定固定行数为1行const int nColumnNum=3;m_Grid.SetColumnCount(nColumnNum);int nWidthnColumnNum;nWidth0=60;nWidth1=120;nWidth2=120;for(int i=0; i<m_ nColumnNum; i+)m_Grid.SetColumnWidth(i, nWidthi);i=0;m_Grid.SetItemText(0,i+,"第一列");m_Grid.SetI

12、temText(0,i+,"第二列");m_Grid.SetItemText(0,i+,"第三列");5. 说明填写表格内容的方法l 简单的方法是调用BOOL CGridCtrl:SetItemText(int nRow, int nCol, LPCTSTR str)例如CGridCtrlObject.SetItemText(1,1, _T("12345");l 复杂但更灵活的方法是采用如下的方法:GV_ITEM Item;/一个结构设定这个结构的成员参数,然后将这个结构传递给表格,CGridCtrlObject.SetItem(&a

13、mp;Item);注: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;

14、/ index of the list view items 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;例如以下代码可以设置表格内容:m_GridCtrl.SetRowCount(3);m_GridCtrl.SetItemText(1,

15、 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.

16、由双击的响应函数8. 由响应右键点击的函数A:当进行单击,双击或右击单元格等操作时,表格会发送响应的消息,可以在父窗口添加处理消息的函数,做法如下:GVN_BEGINDRAG / Sent when dragging startsGVN_BEGINLABELEDIT / Sent when inplace editing startsGVN_ENDLABELEDIT / Sent when inplace editing stopsGVN_SELCHANGING / Sent just before cell selection changesGVN_SELCHANGED / Sent aft

17、er cell selection changesGVN_GETDISPINFO / A request for cell information when the grid is / in virtual modeGVN_ODCACHEHINT / Cache hint when in virtual mode右键点击,按键盘响应消息在扩展中实现了,可参见条款21以下需要手工添加H文件中:/ Generated message map functions/AFX_MSG(CDlgSectionLib)/AFX_MSGafx_msg void OnGridDblClick(NMHDR *pNo

18、tifyStruct, 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)/AFX_MSG_MAP(CDlgSectionLib)/AFX_MSG_MAPON_NOTIFY(NM_DBLCLK, I

19、DC_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->iCo

20、lumn;/得到当前行、列/ This structure sent to Grid's parent in a WM_NOTIFY messagetypedef struct tagNM_GRIDVIEW NMHDR hdr; int iRow; int iColumn; NM_GRIDVIEW;typedef struct tagNMHDR HWND hwndFrom; / handle of control sending messageUINT idFrom;/ identifier of control sending messageUINT code; / notifica

21、tion code; see below NMHDR;NM_CLICK   The user has clicked the left mouse button within the control. NM_DBLCLK   The user has double-clicked the left mouse button within the control. NM_KILLFOCUS   The control has lost the input focus. NM_OUTOFMEMORY 

22、;  The control could not complete an operation because there is not enough memory available. NM_RCLICK   The user has clicked the right mouse button within the control. NM_RDBLCLK   The user has double-clicked the right mouse button within the control. NM_RETU

23、RN   The control has the input focus, and the user has pressed the ENTER key. NM_SETFOCUS   The control has received the input focus. 9. 可以方便的删除和添加固定列头10.可以设置、删除、添加固定行头A:参考(4)&(5)删除可以用以下一些函数 BOOL DeleteColumn(int nColumn); BOOL DeleteRow(int nRow); BOOL DeleteNonFix

24、edRows(); 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.可设表格的背景和字体,可设单元格的颜色和字体设置表格的颜色CGridCtrlObjec

25、t.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 =

26、CLR_DEFAULT)BOOL CGridCtrl:SetItemFgColour(int nRow, int nCol, COLORREF cr = CLR_DEFAULT)BOOL CGridCtrl:SetItemFont(int nRow, int nCol, LOGFONT*lf)颜色:COLORREF clr = RGB(xxx,xxx,xxx);字体:CFont* pFont = m_Grid.GetFont();LOGFONT lf;pFont->GetLogFont(&lf);memcpy(lf.lfFaceName, _T("Arial"

27、), 6);lf.lfEscapement = 900;lf.lfOrientation = 900;关于单元格的格式都可以通过下述方法设定,同前面关于设置单元格内容(4)的方法GV_ITEM Item设置单元格格式Item.crBkClr = ?;Item.crFgClr = ?; Item.mask |= (GVIF_BKCLR|GVIF_FGCLR);Item.lfFont=?;SetItem(&Item);13.可以方便的添加或者删除一行int CGridCtrl:InsertColumn(LPCTSTR strHeading,UINT nFormat, int nColumn

28、 = -1)int CGridCtrl:InsertRow(LPCTSTR strHeading, int nRow = -1)BOOL DeleteColumn(int nColumn)BOOL DeleteRow(int nRow)例如:CGridCtrlObject.InsertRow(_T("Newest Row"), nRow);CGridCtrlObject.DeleteRow(nRow);CGridCtrlObject.Invalidate();/这句是必需的。14.可以由程序选定某一行可以调用以下函数:void SelectRow (int row)/该函数

29、在扩展中实现了,具体可参见条款21也可以调用以下函数:void SetSelectedRange(const CCellRange& Range, BOOL bForceRepaint = FALSE);void SetSelectedRange(int nMinRow, int nMinCol, int nMaxRow, int nMaxCol, BOOL bForceRepaint = FALSE);CCellID SetFocusCell(CCellID cell);CCellID SetFocusCell(int nRow, int nCol);class CCellID pu

30、blic: int row, col; / The zero based row and column of the cell. CCellID(int nRow = -1, int nCol = -1) int IsValid(); int operator=(const CCellID& rhs); int operator!=(const CCellID& rhs);也可以调用BOOL CGridCtrl:SetRowFocusAndSelection(int nRow,int nCol=0)这个函数选中第nRow行,同时将焦点置于第nRow行0,第nCol列。成功则返回

31、TRUE,失败则返回FALSE.15.可以由程序自动滚动到某一行,显示在用户面前调用void CGridCtrl:AutoScrollToRow(int nRow)也可以使用void EnsureVisible(CCellID &cell) void EnsureVisible(int nRow, int nCol);16.说明添加排序功能的方法调用如下函数:void CGridCtrl:SetListMode(BOOL bEnableListMode = TRUE)void CGridCtrl:SetHeaderSort(BOOL bSortOnClick = TRUE)void C

32、GridCtrl:SetCompareFunction(PFNLVCOMPARE pfnCompare)如果想实现排序,必须先调用CGridCtrlObject.SetListMode(TRUE);CGridCtrlObject.SetHeaderSort(TRUE);然后设置比较函数:CGridCtrlObject.SetCompareFunction(CGridCtrl:pfnCellNumericCompare);/数值排序CGridCtrlObject.SetCompareFunction(CGridCtrl: pfnCellTextCompare);/字符排序CGridCtrlObj

33、ect.SetCompareFunction(NULL);/调用缺省的排序模式,即字符排序字符排序和数值排序是控件已提供的排序模式,也可以自定义排序函数,例子如下:int CALLBACK pfnCellCompare(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)比较函数必须是全局的或是静态的。int CALLBACK MyClass:pfnCellNumericCompare(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)CGridCellBase* pCell1 = (CGridC

34、ellBase*) lParam1;CGridCellBase* pCell2 = (CGridCellBase*) lParam2;if (!pCell1 | !pCell2) return 0;int nValue1 = _ttol(pCell1->GetText();int nValue2 = _ttol(pCell2->GetText();if (nValue1 < nValue2)return -1;else if (nValue1 = nValue2)return 0;elsereturn 1;17.说明在单元格中添加或者改变图形的方法也可以这样实现头文件CIma

35、geList m_ImageList;实现文件中m_ImageList.Create(MAKEINTRESOURCE(BitMap的ID如:IDB_IMAGES), 16, 1, RGB(255,255,255);CGridCtrlObject.SetImageList(&m_ImageList);然后调用BOOL CGridCtrl:SetItemImage(int nRow, int nCol, int iImage)也可以采用(4)中设置单元格的文字内容的方法:GV_ITEM Item;Item.iImage =index;Item.mask |= (GVIF_IMAGE);CG

36、ridCtrlObject.SetItem(&Item);18.遍历所有的选中行的方法GVNI_FOCUSED / Search for focus cellGVNI_SELECTED / Search for selected cellsGVNI_DROPHILITED / Search for drop highlighted cellsGVNI_READONLY / Search for read-only cellsGVNI_FIXED / Search for fixed cells GVNI_MODIFIED / Search for modified cellsGVNI_

37、ABOVE / Search above initial cellGVNI_BELOW / Search below initial cellGVNI_TOLEFT / Search to the left of the initial cellGVNI_TORIGHT / Search to the right of the initial cellGVNI_ALL / Search all cells in the grid starting from / the given cellGVNI_AREA / Search all cells below and to the right of / th

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论