思享者

知其然亦知其所以然,以至不惑也

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

最近都在维护一个老项目,使用的开发平台是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)。不过这样还是绘制了两次文本,只是第一次的效果被覆盖掉了,完全没必要~~所以还是采取第一种方法吧!

posted on 2011-10-25 17:01  LuckyLuke  阅读(1742)  评论(2编辑  收藏  举报