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。