最近都在维护一个老项目,使用的开发平台是BCB6,经常用到StringGrid。这个控件默认显示格式都是左对齐,可是这样很不美观,至少我的项目中需要它居中显示文本~~~所以将居中显示的方法记录在此,以便日后自己和他人复用
该控件没有显示格式相关的属性,因此无法直接设置居中,只能通过间接的方法。
幸好,BCB提供了一个相关的接口来自定义文本输出,就是StringGrid控件的OnDrawCell事件,添加对应的事件处理方法可以达到自定义输出文本格式的目的。
假设我们在form中添加了一个StringGrid的实例用来显示XY坐标,它的Name属性为:StrGridXY,添加OnDrawCell事件处理方法如下
1 // 使文字居中显示
2 void __fastcall TMyForm::StrGridXYDrawCell(TObject *Sender, int ACol,
3 int ARow, TRect &Rect, TGridDrawState State)
4 {
5 StrGridXY->Canvas->FillRect(Rect); // 使用当前的brush填充矩形,覆盖目前cell中的内容显示
6 DrawText(((TStringGrid*)Sender)->Canvas->Handle
7 , ((TStringGrid*)Sender)->Cells[ACol][ARow].c_str()
8 , -1
9 , (RECT*)&Rect
10 , DT_SINGLELINE | DT_VCENTER | DT_CENTER);
11 }
最终效果
注意:
Line 5
StrGridXY->Canvas->FillRect(Rect);
很多人将这一句遗漏掉,导致单个Cell中出现两个同样的内容。
你可以将此句注释掉或者将此句移到该方法的最后一行,看看有什么效果。
前者导致我们上述提及的单个Cell中有两个复本的值比如显示了两个“p1”;
后者将导致cell的内容为空。
避免方法
如果要避免上述的情况,有以下两种途径
1. 可以将StringGrid的DefaultDrawing设为false,这样每次要绘制cell内容的时候,只调用你的DrawCell方法,而不会出现两次绘制的情况。
2. 不改动上述属性,记得将Line 5那句代码添加至事件处理方法中,使用当前brush填充该cell,达到覆盖原先cell的文本显示效果。然后,再进行居中显示文本的操作(DrawText)。不过这样还是绘制了两次文本,只是第一次的效果被覆盖掉了,完全没必要~~所以还是采取第一种方法吧!