VC++6.0下CGridCtrl类的建立与应用.doc_第1页
VC++6.0下CGridCtrl类的建立与应用.doc_第2页
VC++6.0下CGridCtrl类的建立与应用.doc_第3页
VC++6.0下CGridCtrl类的建立与应用.doc_第4页
VC++6.0下CGridCtrl类的建立与应用.doc_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

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

文档简介

VC+6.0下CGridCtrl类的建立与应用 一、前言 在数据库的操作系统中,经常要遇到对数据库的内容进行显示、修改、添加和删除等功能,而一般情况下数据库的容量都是很大的,为此我们通常选用以电子表格的形式来显示数据库的内容,并在其上完成对数据库的修改、添加和删除,使对数据库的操作既直观又方便;如用VB5.0下DB Grid Control来实现以上功能是较为方便的,但由于VB的通信速度和数据的处理速度较慢,特别对于要处理和显示的数据量较大时,其速度较慢表现得尤为明显,为此我们选用在VC+5.0下用CGridCtrl1类来实现。 二、CGridCtrl类的建立 CGridCtrl1类派生于CWnd类,该类主要包含以下八个方面的函数,其函数形式如下:class CGridCtrl : public CWnd/ 1. CGridCtrl类的构造函数CGridCtrl(int nRows = 0, int nCols = 0, int nFixedRows = 0, int nFixedCols = 0); BOOL Create(const RECT& rect, CWnd* parent, UINT nID, DWORD dwStyle = WS_CHILD | WS_BORDER | WS_TABSTOP | WS_VISIBLE); / 2. 表格行、列数方面的函数BOOL SetRowCount(int nRows); /设置表的行数BOOL SetColumnCount(int nCols); /设置表的列数BOOL SetFixedRowCount(int nFixedRows = 1); /设置表的固定行数BOOL SetFixedColumnCount(int nFixedCols = 1); /设置表的固定列数int GetFixedRowCount() const; / 取表的固定行数int GetFixedColumnCount() const; /取表的固定列数/ 3. 表格尺寸大小方面的函数BOOL SetRowHeight(int row, int height); /设置表格单元的高度BOOL SetColumnWidth(int col, int height); /设置表格单元的宽度int GetRowHeight(int nRow) const; /获取表格单元的高度int GetColumnWidth(int nCol) const; /获取表格单元的宽度void AutoSize(); /对表格单元的高度与宽度进行自动设置/ 4. 表格显示与特征方面的函数void SetImageList(CImageList* pList); /设置列表图标void SetEditable(BOOL bEditable = TRUE); /设置表格的编辑状态BOOL SetColumnType(int nCol, int nType); /设置表格的列状态/ 5. 颜色方面的函数void SetTextColor(COLORREF clr); /设置输入表格的文本颜色void SetTextBkColor(COLORREF clr); /设置可供输入文本的表格颜色void SetFixedTextColor(COLORREF clr); /设置输入固定表格的文本颜色void SetFixedBkColor(COLORREF clr); /设置固定表格颜色/ 6. 表格信息函数BOOL SetItem(const GV_ITEM* pItem); / 向表格中输入信息BOOL SetItemText(int nRow, int nCol, LPCTSTR str); /向某一单元表格中输入文本BOOL SetItemImage(int nRow, int nCol, int iImage); /在某一单元表格中设置图标/ 7. 编辑方面的函数virtual void OnEditCell(int nRow, int nCol, UINT nChar) /开始对表格进行编辑virtual void OnEndEditCell(int nRow, int nCol, CString str) /结束对表格编辑 / 8. 表格打印函数void Print(); /打印表格CGridCtrl1类的构造函数形式如下:CGridCtrl:CGridCtrl(int nRows, int nCols, int nFixedRows, int nFixedCols) m_crWindowText = :GetSysColor(COLOR_WINDOWTEXT); m_crWindowColour = :GetSysColor(COLOR_WINDOW); m_cr3DFace = :GetSysColor(COLOR_3DFACE); m_nRows = 0; /初始电子表格的行数 m_nCols = 0; /初始电子表格的列数 m_nFixedRows = 0; /初始化固定表格的行数 m_nFixedCols = 0; /初始化固定表格的列数 m_bEditable = TRUE; /初始化表格为可编辑状态 /初始化设置表格的行列数 SetRowCount(nRows); SetColumnCount(nCols); SetFixedRowCount(nFixedRows); SetFixedColumnCount(nFixedCols); / 初始化表格的背景颜色及输入表格的文本颜色 SetTextColor(m_crWindowText); SetTextBkColor(m_crWindowColour); SetFixedTextColor(m_crWindowText); SetFixedBkColor(m_cr3DFace); 对表格中所输入信息属性的描述,是通过定义一结构体函数来实现,该结构体函数形式如下:typedef struct _GV_ITEM int row,col; / 输入信息的位置 UINT mask; /输入信息的灰度值 UINT state; / 表格单元的状态 UINT nFormat; / 信息的输入形式 CString szText; / 输入表格单元的文本 GV_ITEM; 将CGridCtrl类与以下类结合起来,即可构造成在其上可进行编辑和修改的电子表格,这些类分别为:1用于单元表格范围的两个类:CCellRange2类和CCellID3类;2单元表格状态属性的类:CGridCell4类;3对表格进行编辑的两个类:CInplaceEdit5类和CInplaceList6类; 三、CGridCtrl类的应用 1.CGridCtrl类实现对数据库内容的显示 在我们建立的一单文档界面应用程序(MyGridCtrlTest)之上,加上CGridCtrl1类,再结合CCellRange2类、CCellID3类、CGridCell4类、CInplaceEdit5类、CInplaceList6类以及用于数据库读写的文件,即可在CMyGridCtrlTestView类的OnDraw()函数将Main.mdb数据库中的工资表以电子表格的形式显示出来,如图1, 图1 在单文档的界面上以电子表格形式对一工资表的显示 在MyGridCtrlTestView.h中,我们将CGridCtrlEx类(该类为CGriCtrl类的派生)嵌入到CMyGridCtrlTestView类中,其形式如下: class CMyGridCtrlTestView : public CView class CGridEx : public CGridCtrl / Override this function to fill InPlaceListBoxes void FillListItems(int nCol, LPARAM cltList); ;public: CDemo_ui_devstudioDoc* GetDocument(); CGridEx m_Grid; CSize m_OldSize; int *Iarray; CString *Csarray; CImageList m_ImageList; public: virtual void OnDraw(CDC* pDC); / overridden to draw this view protected: afx_msg void OnGridCtrlDelete(); /对表格进行删除的函数 afx_msg void OnGridCtrlPrint(); /对表格进行打印的函数 ; 在CMyGridCtrlTestView类的OnDraw()函数中,我们实现对工资表的电子表格显示,该函数的形式如下: void CMyGridCtrlTestView :OnDraw(CDC* pDC) CMyGridCtrlTestDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); / TODO: add draw code for native data here int s,r; / 建立一显示CGridCtrl类的矩形 RECT rect; GetClientRect(&rect); m_OldSize = CSize(rect.right-rect.left, rect.bottom-rect.top); m_Grid.Create(rect, (CWnd*)this, 111); / 打开工资表并将工资表的内容读入数组中 s:为工资表的行数; r:为工资表的列数; 申请两个数组空间,用于存放工资表的内容,分别为: Csarray=new CString(s+2)*1; /用于存放姓名 Iarray=new int(s+2)*9; /用于存放工资表中的其他项目 所申请两个数组空间比实际所需的空间要多两行,对于多出的最末两行中,如为字符串型变量,将以“0”代替,如为整型变量将以0代替,以供操作员在最末的两行实现对工资表的添加,如图1所示,/创造列表图标 m_ImageList.Create(MAKEINTRESOURCE(IDB_IMAGES), 16, 1, RGB(255,255,255); m_Grid.SetImageList(&m_ImageList);/设置表格的属性特征 m_Grid.SetEditable(TRUE); /设置表格为可编辑状态 m_Grid.SetTextBkColor(RGB(0xFF, 0xFF, 0xE0); /设置表格的背景颜色 /设置表格的行列数 try m_Grid.SetRowCount(s+3); m_Grid.SetColumnCount(r+1); m_Grid.SetFixedRowCount(1); m_Grid.SetFixedColumnCount(1); catch (CMemoryException* e) e-ReportError(); e-Delete(); / 将工资表的内容填入表格中 for (int row = 0; row (s+3); row+) for (int col = 0; col (r+1); col+) GV_ITEM Item; /输入信息结构体变量的声明 Item.mask = GVIF_TEXT|GVIF_FORMAT; /所输入信息的灰度 Item.row = row; /输入信息的行位置 Item.col = col; /输入信息的列位置 if (row 1) Item.nFormat = DT_LEFT|DT_WORDBREAK; /输入信息的格式 if (col = 0 ) m_Grid.SetColumnType(col, GVET_NOEDIT); /设置表格列为可编辑状态 Item.szText.Format(_T(不能编辑); /设置表格的文本形式 else if (col = 1 ) m_Grid.SetColumnType(col, GVET_EDITBOX); Item.szText.Format(_T(姓名); else if (col = 2 ) m_Grid.SetColumnType(col, GVET_EDITBOX); Item.szText.Format(_T(固定工资); else if (col = 3 ) m_Grid.SetColumnType(col, GVET_LISTBOX); /设置表格列为下拉可选状态 Item.szText.Format(_T(住房补贴); /以下均为对表格第一行标题的设定, 情况与以上相类似,在此将col=4,5,6,7,8,9时略去。 else if(col=10) m_Grid.SetColumnType(col, GVET_EDITBOX); Item.szText.Format(_T(公积金); else else if (col = m_Grid.GetFixedRowCount() m_Grid.SetItemImage(row, col, row%2); /将图标填入表格的第一列中 m_Grid.AutoSize(); /对单元表格的高度与宽度进行自动设置 m_Grid.SetRowHeight(0, 3*m_Grid.GetRowHeight(0)/2); /设置第一行表格的高度 delete Csarray; delete Iarray; 2.表格的编辑、添加与删除我们可以对表格的内容直接进行编辑,对于表格中的某一项值是固定的几个取值时,我们以一下拉的方式让操作员选择某一值进行编辑,这样更有利于操作员的操作,如图1的第四列,该功能的实现是通过CGridCtrlEx类中的 FillListItems()函数来实现,该函数的形式如下:void CMyGridCtrlTestView :CGridEx:FillListItems(int nCol, LPARAM cltList) CListBox* pList = (CListBox*)cltList; if (nCol = 3) pList-AddString(0); pList-AddString(20); pList-AddString(30); pList-AddString(40); pList-AddString(50); pList-AddString(60); 我们可以在表格的最末两行对工资表的内容进行添加,如图1所示,对表格中的内容进行修改和添加的结果都将自动地保存在工资表中,这是通过调用CGridCtrl1类的OnEndEditCell()函数来实现,该函数的形式如下:void CGridCtrl:OnEndEditCell(int nRow, int nCol, CString str) SetItemText(nRow, nCol, str);/打开工资表,读取工资表的总行数为 T if(nRow=(T+1) /所操作表格的行位置数大于工资表的总行数,是对表进行添加操作 /对工资表进行添加操作 else if(nRow=T) /所操作表格的行位置数不大于工资表的总行数,是对表进行编辑操作/对工资表进行编辑操作elseMessageBox(“nRow error!”); 我们在编辑菜单(Edit)下设置一对表格进行删除的子菜单 “删除(工资表)”,单击该子菜单,即可弹出一对话框以供操作员输入要删除人的姓名,在确认无误以后,即可在工资表中将该人的工资信息自动删除,最后将删除后的工资表以电子表格的形式重新显示出来,该功能的实现是在CMyGridCtrlTestView类中OnGridCtrlDelete()函数来完成的。3. 表格的打印 在文件菜单(File)下设置一对表格进行打印的子菜单 “打印(工资表)”,单击该子菜单,将调用CMyGridCtrlTestView类中OnPrintGridCell()

温馨提示

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

评论

0/150

提交评论