解决win10系统中C++程序调用DrawText时传入DT_ENDELLIPSIS仍然不显示省略号的问题

在Win10系统中,使用duilib库和DrawText API进行文字绘制时,遇到设置DT_END_ELLIPSIS后未显示省略号的问题。该问题在Win7系统上不存在。通过参考CodeProject上的文章,修改了duilib源码,实现了手动添加省略号的方法,即当文字过长时,动态去除末尾字符并添加省略号,确保在控件宽度内能显示省略号字符串。

         经测试发现,我们PC程序在win10系统中运行时,个别窗口中显示文字的控件,在文字显示不下时并没有显示“...”省略号,但在win7系统是会显示省略号的。

         我们PC程序的UI界面库使用的是duilib,控件文字的绘制调用的是系统API函数DrawText,已经给出问题的控件设置了DT_END_ELLIPSIS,但在win10系统中文字显示不下时还是没有显示省略号,在win7系统中则会显示省略号,这个有点奇怪,不知道这是不是win10系统的bug?

        后来我们在CodeProject上搜到了一篇可以参考的文章:

在 MiniGUI 中,如果你使用了 `DrawText` 函数并指定了 `DT_CALCRECT` 标志,但**文本仍然被绘制出来**,这通常是由于以下几种原因造成的: --- ### ✅ 正确使用 `DT_CALCRECT` 的前提条件 `DT_CALCRECT` 的作用是:**仅计算文本绘制所需矩形区域,进行实际绘制**。但它**依赖于传入的 HDC(设备上下文)是否允许绘图操作**。 如果你传入的是一个**有效的绘图 HDC**(例如在 `MSG_PAINT` 消息中获得的 `HDC`),即使使用了 `DT_CALCRECT`,某些底层实现可能仍然会执行绘图操作,这取决于 MiniGUI 的版本和平台实现。 --- ### ✅ 解决方案:使用内存 HDC(推荐) 为了确保 `DT_CALCRECT` 真正生效,**建议使用内存设备上下文(Memory HDC)** 来进行尺寸计算。 #### 示例代码: ```c #include <minigui/common.h> #include <minigui/minigui.h> #include <minigui/gdi.h> #include <minigui/window.h> // 获取文本所需高度 int GetTextRequiredHeight(HWND hwnd, const char* text, int max_width) { HDC hdc = GetClientDC(hwnd); // 获取窗口的 HDC HDC memDC = CreateCompatibleDC(hdc); // 创建兼容的内存 HDC BITMAP bmp; bmp.bmType = 0; bmp.bmWidth = max_width; bmp.bmHeight = 1; // 高度设为1即可 bmp.bmBitsPerPixel = 0; SelectMemDCBitmap(memDC, &bmp, 0); // 设置内存位图为DC的绘图区域 RECT rc = {0, 0, max_width, 0}; DrawText(memDC, text, -1, &rc, DT_CALCRECT | DT_WORDBREAK | DT_CENTER); int height = rc.bottom; DeleteMemDC(memDC); ReleaseDC(hdc); return height; } ``` --- ### ✅ 替代方案:使用 `GetTextSize` 或 `GetTextExtent` 如果你只是需要计算文本尺寸,而是绘制文本,也可以考虑使用以下函数: ```c SIZE size; GetTextSize(hdc, text, -1, &size, DT_WORDBREAK); ``` 或者: ```c RECT rc = {0, 0, max_width, 0}; GetTextExtent(hdc, text, -1, &rc); ``` 这些函数专门用于测量文本尺寸,会触发绘制行为。 --- ### ✅ 总结 | 方法 | 是否绘图 | 是否推荐用于尺寸计算 | |------|----------|------------------------| | `DrawText(hdc, ..., DT_CALCRECT)` | 可能会绘图(依赖实现) | ❌ 推荐 | | `DrawText(memDC, ..., DT_CALCRECT)` | 绘图 | ✅ 推荐 | | `GetTextSize` / `GetTextExtent` | 绘图 | ✅ 推荐 | --- ###
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dvlinker

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值