出处:http://blog.csdn.net/clever101/archive/2008/08/21/2808790.aspx 一般往ListBox等控件里插入字符串后对符串对得都不是很齐,如下图的ListBox控件,第一行和其它行对得明显不齐:
对字符串进行对齐,常规的做法是设定字符串的各部分的所占长度,不足的补空格,其代码大致如下:
比如string占6位,就这样做:
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函数实现多种方式对齐,如右对齐、左对齐等等,再也不用字符串对齐考虑算法了。在此感谢CSDN的Mackz大侠和VC知识库的周星星大侠的指点!参考文献:
INFO: 正确使用 MFC 中 SetFont() 函数,来源:http://support.microsoft.com/kb/q85518/
对字符串进行对齐,常规的做法是设定字符串的各部分的所占长度,不足的补空格,其代码大致如下:
比如string占6位,就这样做:
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函数实现多种方式对齐,如右对齐、左对齐等等,再也不用字符串对齐考虑算法了。在此感谢CSDN的Mackz大侠和VC知识库的周星星大侠的指点!参考文献:
INFO: 正确使用 MFC 中 SetFont() 函数,来源:http://support.microsoft.com/kb/q85518/
解决方案 »
- Error executing cl.exe.
- vc6下怎么使用IsUserAnAdmin(VOID)?
- vs2003 纯资源下,控件事件没了怎么办?
- 无法获取IConnectionPointContainer指针?
- 如何用发消息的方式往一个CComboBox中输入字符?
- 为何修改了一点代码,VC的编译器对所有文件重新编译?
- Windows程序设计学习问题:对第3章的例子进行修改所得结果的疑问
- DAO连了一个数据库
- 请教大家如何实现程序最小化时在任务栏出现它的系统托盘图标?
- 用MFC APPWIZARD(dll)编写的com的问题
- CString 转 为 double 问题
- 一个套接字,消息映射问题,麻烦大侠能指点一下
请教一下大侠,ListCtrl不用进行字符串对齐吗?