我们使用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.youkuaiyun.com/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.youkuaiyun.com/csdsym/archive/2008/10/10/3047678.aspx。这样可以保证我们可以看到将来新的研究结果。更多的参数请在帮助中,查找DrawText。
本文介绍了如何在C++ Builder的TStringGrid中实现单元格内容的对齐,包括标题行居中、数据行左对齐、右对齐以及上下居中。通过DrawCell事件和DrawText函数,调整DT_CENTER、DT_LEFT、DT_RIGHT等参数,同时探讨了单元格换行和内容超出显示省略号的实现方法。
2295

被折叠的 条评论
为什么被折叠?



