以ListBox为例谈谈控件里字符串的对齐办法

原文地址:http://blog.youkuaiyun.com/clever101/article/details/2808790

一般往ListBox等控件里插入字符串后对符串对得都不是很齐,如下图的ListBox控件,第一行和其它行对得明显不齐:

对字符串进行对齐,常规的做法是设定字符串的各部分的所占长度,不足的补空格,其代码大致如下:

比如string6位,就这样做:

for(k=0;k<6-strlen(string);k++)
string =" "+ string;

这样做毫无疑问是使得代码冗长,变得难以维护。最近我想出一个较好的字符串对齐办法,其主要是给控件设置等宽字体,然后调用 sprintf 函数进行对齐。以我的工程为例(对齐一个 ListBox 控件里的字符串)。

在对话框类(控件所在的对话框)定义一个等宽字体变量(这里注意字体变量不能是临时变量):

CFont *m_pFont;

OnInitDialog()函数里

CListBox *pListBoxPct = static_cast<CListBox*>(GetDlgItem  
(IDC_LISTPCTLOOKUP)); 
    if(NULL==pListBoxPct) 
        return FALSE; 

    m_pFont = new CFont();// 
    LOGFONT lf; 
    memset(&lf, 0, sizeof(LOGFONT));   // 清空字体结构体 
    lf.lfHeight = 15;  // 设置15个像素的高度 

  strcpy(lf.lfFaceName, "Courier New");    //   设置等宽字体类型为Courier New 
    m_pFont->CreateFontIndirect(&lf);    // 创建字体 
    pListBoxPct->SetFont(m_pFont); 

for(i=m_GraySelVec.size()-1;i>-1;i--) 
         { 
              char szSel[256]; 
              memset(szSel,'/0',256); 
// 调用sprintf函数对齐符串进行拼接 
              sprintf(szSel,"%5d-%5d:%5d%5d%  
5d",m_GraySelVec[i].Min,m_GraySelVec[i].Max,GetRValue(m_pPallette  
[m_ColorIndexVec[i]]),GetGValue(m_pPallette[m_ColorIndexVec  
[i]]),GetBValue(m_pPallette[m_ColorIndexVec[i]])); 

             pListBoxPct->InsertString(-1,szSel);  // 插入字符串 
         } 

在对话框类的析构函数里删除字体:

if (NULL!=m_pFont) 

                      m_pFont->DeleteObject(); 


对齐效果图如下:

这种方法的一个好处是你可以灵活调用sprintf函数实现多种方式对齐,如右对齐、左对齐等等,再也不用字符串对齐考虑算法了。在此感谢优快云的Mackz大侠和VC知识库的周星星大侠的指点!

参考文献:

INFO:正确使用 MFC SetFont() 函数,来源:http://support.microsoft.com/kb/q85518/


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值