1. 程式人生 > >StringGrid單元格對齊方式及換行

StringGrid單元格對齊方式及換行

 我們使用StringGrid時,經常需要將標題行居中對齊,其它行根據需要,文字左對齊或居中對齊,數字右對齊等。

一、實現方法:使用 DrawCell 事件,

//本函式實現各單元格的對齊,其中標題行居中; grdFileList為TStringGrid控制元件名。
void __fastcall TForm1::grdFileListDrawCell(TObject *Sender, int ACol, int ARow,
          TRect &Rect, TGridDrawState State)
{
AnsiString  strCell = "";
int   intDtFlag = 0;      //對齊方式

 strCell =  grdFileList->Cells[ACol][ARow];
 grdFileList->Canvas->FillRect(Rect);
 if (ARow == 0)
 {
  //標題行居中,假定標題行為第0行,只有一行。
  intDtFlag = DT_CENTER;
 }
 else
 {
  //其它行,根據需要設定
  switch (ACol) {
   case 1:
   case 2:
   case 8:         //比如,第1,2,8列居左
     intDtFlag = DT_LEFT;
     break;
   case 4:        //第4列數字列,居右
     intDtFlag = DT_RIGHT;
     break;
   default:      //其它大多數,居中
     intDtFlag = DT_CENTER;
     break;
  }
 }
 DrawText(grdFileList->Canvas->Handle, strCell.c_str(),strCell.Length(),&Rect, intDtFlag);
}

注意:呼叫DrawText時,要使用strCell.c_str()進行型別轉換;

二、後續研究:

1、在使用 DrawCell 事件時,發現呼叫過於頻繁,因為當單元格得到焦點、被選中時,都會重複呼叫該函式,所有我們只有在重畫時呼叫,才更合理些;所以需要判斷 State  引數。

2、當單列格的高度大一些時,我們就需要將單元格內容上下居中,這就需要增加引數了。

intDtFlag = DT_LEFT; 更改為

   intDtFlag = DT_SINGLELINE + DT_VCENTER + DT_LEFT;  //使用DT_VCENTER時,必須單行顯示,所以要加上DT_SINGLELINE;

3、單元格換行:如果單元格的內容需要換行,則可以增加 DT_WORDBREAK,它可以和DT_CENTER、DT_LEFT、DT_RIGHT一塊使用,不能和上下居中使用。

4、若在單元格內容放不下時,顯示...,使用 DT_END_ELLIPSIS 引數。

三、修訂後的程式:

//本函式實現各單元格的對齊,其中標題行居中; grdFileList為TStringGrid控制元件名。
void __fastcall TForm1::grdFileListDrawCell(TObject *Sender, int ACol, int ARow,
    TRect &Rect, TGridDrawState State)
{
AnsiString  strCell = "";
int   intDtFlag = 0;

 // 得到焦點和選中單元格,不需要處理,只有 (State.Contains(gdFixed)) 才開始進行處理
 if (State.Contains(gdFocused) || State.Contains(gdSelected) )
  return;

 if (ARow == 0)
 {
  //標題行居中,單行,上下居中(只有單行才能上下居中),左右居中。

//http://blog.csdn.net/csdsym/archive/2008/10/10/3047678.aspx本文源地址
  intDtFlag = DT_SINGLELINE + DT_VCENTER + DT_CENTER;
 }
 else
 {
  //其它行,根據需要設定
  switch (ACol) {
   case 1:
   case 2:
   case 8:
     intDtFlag = DT_SINGLELINE + DT_VCENTER + DT_LEFT;
     break;
   case 4:
     intDtFlag = DT_SINGLELINE + DT_VCENTER + DT_RIGHT;
     break;
   default:
     intDtFlag = DT_SINGLELINE + DT_VCENTER + DT_CENTER;
     break;
  }
 }
// intDtFlag =   DT_WORDBREAK;     //換行,可以和 DT_LEFT/DT_RIGHT/DT_CENTER組合使用
// intDtFlag =   DT_END_ELLIPSIS;    //行尾顯示... 

 strCell =  grdFileList->Cells[ACol][ARow];  //讀取當前單元格內容
 grdFileList->Canvas->FillRect(Rect); //沒有這一語句, 內容會重疊
 DrawText(grdFileList->Canvas->Handle, strCell.c_str(),strCell.Length(),&Rect, intDtFlag);
}

四、其它:在C++ Builder6/C++ Builder 2009下除錯。若本文章被引用和推廣,請不要刪除本文源地址http://blog.csdn.net/csdsym/archive/2008/10/10/3047678.aspx。這樣可以保證我們可以看到將來新的研究結果。更多的引數請在幫助中,查詢DrawText。