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


       

                                      朱金灿

       

      

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

     

     

       

     

        

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

    比如string6位,就这样做:

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

                              string ="  "+ string;

     

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

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

     

          

    1. CFont *m_pFont; 

        

    OnInitDialog()函数里:

     

    1. CListBox *pListBoxPct = static_cast<CListBox*>(GetDlgItem 
    2. (IDC_LISTPCTLOOKUP));
    3.     if(NULL==pListBoxPct)
    4.         return FALSE;
    5.     m_pFont = new CFont();//
    6.     LOGFONT lf;
    7.     memset(&lf, 0, sizeof(LOGFONT));   // 清空字体结构体
    8.     lf.lfHeight = 15;  // 设置15个像素的高度
    9.   strcpy(lf.lfFaceName, "Courier New");    //   设置等宽字体类型为Courier New
    10.     m_pFont->CreateFontIndirect(&lf);    // 创建字体
    11.     pListBoxPct->SetFont(m_pFont);
    12. for(i=m_GraySelVec.size()-1;i>-1;i--)
    13.          {
    14.               char szSel[256];
    15.               memset(szSel,'/0',256);
    16. // 调用sprintf函数对齐符串进行拼接
    17.               sprintf(szSel,"%5d-%5d:%5d%5d% 
    18. 5d",m_GraySelVec[i].Min,m_GraySelVec[i].Max,GetRValue(m_pPallette 
    19. [m_ColorIndexVec[i]]),GetGValue(m_pPallette[m_ColorIndexVec 
    20. [i]]),GetBValue(m_pPallette[m_ColorIndexVec[i]]));
    21.              pListBoxPct->InsertString(-1,szSel);  // 插入字符串
    22.          }

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

           if (NULL!=m_pFont) 

                          m_pFont->DeleteObject();

        

    对齐效果图如下:

                 

        

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

     

    参考文献:

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

     

     

  • 相关阅读:
    HDU 1258 Sum It Up(Dfs)
    HDU 1501 Zipper(Dfs记忆化搜索)
    HDU 1075 What Are You Talking About (字典树)
    HDU 1251 统计难题(字典树)
    HDU 1518 Square(Dfs)
    %与mod的区别
    有向无向欧拉回路通路的判断
    HDU 1104 Remainder(BFS打印路径+数论)(%与mod的区别)
    写给还在怀念骑士(3.0 2.0 Online 私服)的刀狼
    HUD 1312 Red and Black(用深搜写的)
  • 原文地址:https://www.cnblogs.com/lanzhi/p/6471224.html
Copyright © 2020-2023  润新知