[WTL/Win32]_[初级]_[如何在工作线程计算文本的宽高]

场景

  1. 在开发WTL/Win32程序时,有些界面绘制的元素比较多,内容多的时候还需要使用进行滚动显示; 比如在显示聊天气泡是,需要先计算气泡的个数并算好它的位置; 在使用滚动条时可以在滑条停止位置显示对应的气泡内容; 如果气泡上万个之后,在主线程计算就会卡,怎么解决?

说明

  1. 简单来说计算坐标和区域只要工作线程计算好即可;

  2. 通常情况,使用HDC或者Gdiplus::Graphics时,这些图形元素都需要在界面线程执行,因为他们通常需要传递一个HWND句柄; 而句柄涉及到窗口,窗口的相关操作只能在界面线程执行;

  3. 可是用HDCGdiplus::Graphics计算文本大小时,影响最大的也只是字体,跟界面没关系,因此需要有一种方法不使用HWND创建HDCGdiplus::Graphics

  4. 创建内存HDC,GDI的::CreateCompatibleDC(NULL)就可以创建,因此对应在WTL里可以用以下方法创建HDC:

cpp 复制代码
CDC dc;
dc.CreateCompatibleDC();

Gdiplus::Graphics graphics(dc);

例子

cpp 复制代码
DWORD WINAPI WorkerThread(LPVOID lpParam)
{
    // 创建一个虚拟的内存DC
    CDC dc;
    dc.CreateCompatibleDC();
    
    // 创建 Graphics 对象
    Gdiplus::Graphics graphics(dc);
    
    // 设置文本渲染模式(可选,影响测量结果)
    graphics.SetTextRenderingHint(Gdiplus::TextRenderingHintAntiAlias);
    
    // 创建字体
    Gdiplus::Font font(L"Arial", 12.0f, Gdiplus::FontStyleRegular, Gdiplus::UnitPixel);
    
    // 测量文本
    Gdiplus::RectF layoutRect(0, 0, 10000, 10000);
    Gdiplus::RectF boundingBox;
    
    Gdiplus::Status status = graphics.MeasureString(
        L"Hello World", 
        -1, 
        &font, 
        layoutRect, 
        nullptr, 
        &boundingBox
    );
    
    if (status == Gdiplus::Ok)
    {
        float width = boundingBox.Width;
        float height = boundingBox.Height;
        // 使用计算结果...
    }
    
    return 0;
}

参考

  1. 计算指定界面长度下长字符串能绘制的字符数

  2. 关于使用Graphics::DrawString替换DrawText的说明

  3. 关于混用GDI和GDI+(GDIPlus)导致显示不正常的解决方案

相关推荐
charlie1145141912 天前
通用GUI编程技术——Win32 原生编程实战(十八)——GDI 设备上下文(HDC)完全指南
开发语言·c++·ide·学习·visual studio·win32
charlie1145141913 天前
通用GUI编程技术——Win32 原生编程实战(十六)——Visual Studio 资源编辑器使用指南
开发语言·c++·ide·学习·gui·visual studio·win32
charlie11451419114 天前
通用GUI编程技术——Win32 原生编程实战(五)——ListView 控件详解
windows·学习·gui·win32·编程指南
Peter(阿斯拉)2 个月前
[Gdiplus]_[初级]_[拉伸缩放图片时使用适当的插值模式和像素偏移模式绘制完整图片]
图像处理·gdiplus·图像拉伸·插值模式·像素采样模式·底部模糊
工程师0073 个月前
C# 调用 Win32 API
开发语言·c#·api·win32
CC-NX5 个月前
32位汇编:实验9分支程序结构使用
汇编·算法·win32·分支结构
CC-NX5 个月前
32位汇编:实验5算数运算类指令使用
汇编·win32·算数运算
wangnaisheng7 个月前
【C#】在一个任意旋转的矩形(由四个顶点定义)内绘制一个内切椭圆
c#·gdi
wangnaisheng9 个月前
【C#】GraphicsPath的用法
c#·gdi