VC++5.0下CGridCtrl類的建立與應用

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]類這些基本而又常用的函數,實
現了對數據庫內容的顯示、修改、添加、刪除及打印等功能,基本上滿足了數據庫操作
人員的需求。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章