StringGrid单元格对齐方式及换行

本文介绍了如何在C++ Builder的TStringGrid中实现单元格内容的对齐,包括标题行居中、数据行左对齐、右对齐以及上下居中。通过DrawCell事件和DrawText函数,调整DT_CENTER、DT_LEFT、DT_RIGHT等参数,同时探讨了单元格换行和内容超出显示省略号的实现方法。
部署运行你感兴趣的模型镜像

 我们使用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。

 

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值