没有找到合适的产品?
联系客服协助选型:023-68661681
提供3000多款全球软件/控件产品
针对软件研发的各个阶段提供专业培训与技术咨询
根据客户需求提供定制化的软件开发服务
全球知名设计软件,显著提升设计质量
打造以经营为中心,实现生产过程透明化管理
帮助企业合理产能分配,提高资源利用率
快速打造数字化生产线,实现全流程追溯
生产过程精准追溯,满足企业合规要求
以六西格玛为理论基础,实现产品质量全数字化管理
通过大屏电子看板,实现车间透明化管理
对设备进行全生命周期管理,提高设备综合利用率
实现设备数据的实时采集与监控
利用数字化技术提升油气勘探的效率和成功率
钻井计划优化、实时监控和风险评估
提供业务洞察与决策支持实现数据驱动决策
翻译|其它|编辑:郝浩|2004-03-16 09:17:00.000|阅读 1301 次
概述:
# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>
Win32的标准控件之中,列表控件(ListBox)并没有和列表视图(ListView)一样提供水平滚动条,所以如果列表项的长度超过列表的宽度的话,那么超出的部分将无法显示。在本文中我将以一个简单的例子来说明如何使用SDK来解决这一问题,在这个例子中,我将为一个列表控件添加100行如下格式的文本:
This is a very very very very very long sentence - line
1
This is a very very very very very long sentence - line
2
……
这段添加文本的代码为:
case
WM_INITDIALOG:
{
int i;
TCHAR str[100];
for(i =
0; i < 100; i++)
{
wsprintf(str, "This is a
very very very very very long sentence - line %d", i + 1);
SendDlgItemMessage(hDlg, IDC_LIST, LB_ADDSTRING, 0, (LPARAM)str);
}
}
break;
当然,在添加水平滚动条之前,就是下图这样的效果:
下面我来为这个列表控件来添加水平滚动条,首先需要在资源的设计中为这个列表控件设置水平滚动条,然后就可以通过向列表控件发送一条LB_SETHORIZONTALEXTENT消息来向它添加水平滚动条了。在这条消息的附加参数中,wParam参数就是以像素为单位的水平滚动条长度,lParam不使用。那么,可以为这个滚动条设置一个足够的长度(假设为500),有以下的代码:
case WM_INITDIALOG:
{
HDC hdc;
int
i;
TCHAR str[100];
for(i = 0; i < 100; i++)
{
wsprintf(str, "This is a very very very very very long
sentence - line %d", i + 1);
SendDlgItemMessage(hDlg,
IDC_LIST, LB_ADDSTRING, 0, (LPARAM)str);
}
SendDlgItemMessage(hDlg, IDC_LIST, LB_SETHORIZONTALEXTENT, 500, 0); //
设置长度为500像素的水平滚动条
}
break;
这段代码执行完毕后,效果如下图:
如你所见,我们已经成功地为列表控件添加了水平滚动条。然而美中不足的是,500这一长度似乎太长,很不美观。那么我们所需要的,就是一种方法,我们能通过这种方法来将字符串的长度换算成为一个适当的像素长度,这样就可以使这个界面较为美观了。幸运的是,Win32
API之中的确有这么一个函数:
BOOL GetTextExtentPoint32(
HDC hdc, // 相关设备句柄
LPCTSTR lpString, // 字符串
int cbString, //
字符串的字符数(即长度)
LPSIZE lpSize //
用来接收字符串的尺寸
);
也许你会很纳闷:这个函数为什么要和HDC扯上关系?其实原因很简单:Windows是一个基于图形的操作系统,所以所有的文本也是被Windows系统“画”到界面上去的。那么这样一来,字符串的长度自然和所选用的字体和字体的大小发生关系,字符串的像素宽度也必须这么计算了。我的代码如下:
case WM_INITDIALOG:
{
HDC hdc;
SIZE
s;
int i;
TCHAR str[100];
hdc = GetDC(hDlg); //
获得相关设备句柄
for(i = 0; i < 100; i++)
{
wsprintf(str, "This is a very very very very very long sentence - line %d", i +
1);
GetTextExtentPoint32(hdc, str, lstrlen(str), &s);
// 获取字符串的像素大小
//
如果新的字符串宽度大于先前的水平滚动条宽度,则重新设置滚动条宽度
if (s.cx >
(LONG)SendDlgItemMessage(hDlg, IDC_LIST, LB_GETHORIZONTALEXTENT, 0,
0))
SendDlgItemMessage(hDlg, IDC_LIST,
LB_SETHORIZONTALEXTENT, (WPARAM)s.cx, 0);
SendDlgItemMessage(hDlg, IDC_LIST, LB_ADDSTRING, 0, (LPARAM)str);
}
ReleaseDC(hDlg,
hdc);
}
break;
现在终于可以轻松的呼出一口气了,看看效果吧:
你可能还会问,为什么右边的部分还有一点空白?对于这个问题,GetTextExtentPoint32的备注是这么解释的:“由于有的设备紧缩字符,因此一个字符串里字符的范围之和或许不等于字符串的范围,计算的字符宽度考虑了由SetTextCharacterExtra设备的字符间隔。”
在本文结束的时候,我突然在MSDN中的列表控件消息里发现了LB_GETTEXTLEN这个消息,它可以用来获得列表项的字符长度。这样看来,获得列表项的像素长度也许也能够通过字符长度来换算,不过我没有找到这种方法。
本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com
面对“数字中国”建设和中国制造2025战略实施的机遇期,中车信息公司紧跟时代的步伐,以“集约化、专业化、标准化、精益化、一体化、平台化”为工作目标,大力推进信息服务、工业软件等核心产品及业务的发展。在慧都3D解决方案的实施下,清软英泰建成了多模型来源的综合轻量化显示平台、实现文件不失真的百倍压缩比、针对模型中的大模型文件,在展示平台上进行流畅展示,提升工作效率,优化了使用体验。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
服务电话
重庆/ 023-68661681
华东/ 13452821722
华南/ 18100878085
华北/ 17347785263
客户支持
技术支持咨询服务
服务热线:400-700-1020
邮箱:sales@evget.com
关注我们
地址 : 重庆市九龙坡区火炬大道69号6幢
慧都科技 版权所有 Copyright 2003-
2025 渝ICP备12000582号-13 渝公网安备
50010702500608号