VC++5.0下CGridCtrl類的建立與應用
發信站: 哈工大紫丁香 (2000年07月31日18:27:21 星期一), 站內信件
VC++5.0下CGridCtrl類的建立與應用
徐繼友 江泓
摘要 本文較爲詳細地介紹了CGridCtrl類的建立,並利用該類實現了在一單文檔界面
上
對一數據庫內容的顯示、修改、添加、刪除及打印等功能。
關鍵詞 CGridCtrl類,電子表格,數據庫
一、前言
在數據庫的操作系統中,經常要遇到對數據庫的內容進行顯示、修改、添加和刪
除等功能,而一般情況下數據庫的容量都是很大的,爲此我們通常選用以電子表格的形
式來顯示數據庫的內容,並在其上完成對數據庫的修改、添加和刪除,使對數據庫的操
作既直觀又方便;如用VB5.0下DB Grid Control來實現以上功能是較爲方便的,但由於
VB的通信速度和數據的處理速度較慢,特別對於要處理和顯示的數據量較大時,其速度
較慢表現得尤爲明顯,爲此我們選用在VC++5.0下用CGridCtrl[1]類來實現。
二、CGridCtrl類的建立
CGridCtrl[1]類派生於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(); //打印表格
……
}
CGridCtrl[1]類的構造函數形式如下:
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.用於單元表格範圍的兩個類:CCellRange[2]類和CCellID[3]類;
2.單元表格狀態屬性的類:CGridCell[4]類;
3.對錶格進行編輯的兩個類:CInplaceEdit[5]類和CInplaceList[6]類;
三、CGridCtrl類的應用
1.CGridCtrl類實現對數據庫內容的顯示
在我們建立的一單文檔界面應用程序(MyGridCtrlTest)之上,加上CGridCtrl[1]類
,再結合CCellRange[2]類、CCellID[3]類、CGridCell[4]類、CInplaceEdit[5]類、CI
nplaceList[6]類以及用於數據庫讀寫的文件,即可在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,25
5));
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 < 1) {
Item.nFormat = DT_RIGHT|DT_VCENTER|DT_SINGLELINE|DT_END_ELLIPS
IS;
Item.szText.Format(_T("行 %d"),row);
} else {
Item.nFormat = DT_CENTER|DT_VCENTER|DT_SINGLELINE|DT_END_ELLIPSIS;
if(col==1)
Item.szText.Format(_T("%s"),Csarray[(row-
1)]);
else if(col==2)
{
Item.szText.Format(_T("%d"),*(Iarray+(row
-1)*9));
}
else if(col==3)
{
Item.szText.Format(_T("%d"),*(Iarray+1+(r
ow-1)*9));
}
//以下爲col==4,5,6,7,8,9時的填寫,情況與以上相類似,在此省略。
else if(col==10)
{
Item.szText.Format(_T("%d"),*(Iarray+8+(r
ow-1)*9));
}
else
{
}
}
m_Grid.SetItem(&Item); //將輸
入信息填入表格
if (col == (m_Grid.GetFixedColumnCount()-1) && row >= m_Grid.GetFixed
RowCount())
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所示,對錶格中的內容進行
修改和添加的結果都將自動地保存在工資表中,這是通過調用CGridCtrl[1]類的OnEndE
ditCell()函數來實現,該函數的形式如下:
void CGridCtrl::OnEndEditCell(int nRow, int nCol, CString str)
{
SetItemText(nRow, nCol, str);
//打開工資表,讀取工資表的總行數爲 T
……
if(nRow==(T+1)) //所操作表格的行位置數大於工資表的總行數,是對錶進行添加
操作
{
//對工資表進行添加操作
}
else if(nRow<=T) //所操作表格的行位置數不大於工資表的總行數,是對錶進行編
輯操作
{
//對工資表進行編輯操作
}
else
{
MessageBox(“nRow error!”);
}
}
我們在編輯菜單(Edit)下設置一對錶格進行刪除的子菜單 “刪除(工資表)”,單擊
該子菜單,即可彈出一對話框以供操作員輸入要刪除人的姓名,在確認無誤以後,即可
在工資表中將該人的工資信息自動刪除,最後將刪除後的工資表以電子表格的形式重新
顯示出來,該功能的實現是在CMyGridCtrlTestView類中OnGridCtrlDelete()函數來完成
的。
3. 表格的打印
在文件菜單(File)下設置一對錶格進行打印的子菜單 “打印(工資表)”,單
擊該子菜單,將調用CMyGridCtrlTestView類中OnPrintGridCell()函數,實現對錶格的
打印,該函數的形式如下:
void CMyGridCtrlTestView :: OnGridCtrlPrint ()
{
// TODO: Add your command handler code here
m_Grid.Print();
}
四、小結
本篇是對VC++5.0下CGridCtrl[1]類建立與應用的一個初步探討,CGridCtrl[1]類
本身是很複雜,其所能實現的功能也是很強大的,除了我們給大家介紹CGridCtrl[1]類
幾個基本而又常用的函數之外,CGridCtrl[1]類還有很多用於其他方面的功能函數,在
此我們不可能給大家一一介紹,我們利用CGridCtrl[1]類這些基本而又常用的函數,實
現了對數據庫內容的顯示、修改、添加、刪除及打印等功能,基本上滿足了數據庫操作
人員的需求。
VC++5.0下CGridCtrl類的建立與應用
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.