StringGrid文字居中对齐

本文介绍如何在BCB6开发平台中使用StringGrid控件实现文本居中显示的方法。通过添加OnDrawCell事件处理方法并利用DrawText函数,结合StrGridXY->Canvas->FillRect(Rect)确保单个单元格中只显示一次内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近都在维护一个老项目,使用的开发平台是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 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/LukeChen/archive/2011/10/25/2224150.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值