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

时间:2024-03-17 21:20:16

朱金灿

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

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

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

比如string6位,就这样做:

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

string =" "+ string;

<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

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

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

  1. CFont*m_pFont;

OnInitDialog()函数里:

  1. CListBox*pListBoxPct=static_cast<CListBox*>(GetDlgItem
  2. (IDC_LISTPCTLOOKUP));
  3. if(NULL==pListBoxPct)
  4. returnFALSE;
  5. m_pFont=newCFont();//
  6. LOGFONTlf;
  7. memset(&lf,0,sizeof(LOGFONT));//清空字体结构体
  8. lf.lfHeight=15;//设置15个像素的高度
  9. strcpy(lf.lfFaceName,"CourierNew");//设置等宽字体类型为CourierNew
  10. m_pFont->CreateFontIndirect(&lf);//创建字体
  11. pListBoxPct->SetFont(m_pFont);
  12. for(i=m_GraySelVec.size()-1;i>-1;i--)
  13. {
  14. charszSel[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();

对齐效果图如下:

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

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

参考文献:

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