[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)导致显示不正常的解决方案

相关推荐
charlie1145141913 天前
通用GUI编程技术——图形渲染实战(三十三)——Direct2D与Win32/GDI互操作:渐进迁移实战
c++·图形渲染·gui·win32
charlie1145141917 天前
通用GUI编程技术——图形渲染实战(三十一)——Direct2D效果与图层:高斯模糊到毛玻璃
c++·图形渲染·gui·win32
jolimark8 天前
微软不支持C开发Win32原因剖析,及C语言在系统开发中的优势
c语言·微软·mfc·系统开发·win32
charlie1145141918 天前
通用GUI编程技术——图形渲染实战(三十)——Direct2D几何体系统:从路径到命中测试
开发语言·c++·windows·信息可视化·c·图形渲染·win32
charlie11451419111 天前
通用GUI编程技术——图形渲染实战(二十九)——Direct2D架构与资源体系:GPU加速2D渲染入门
开发语言·c++·学习·架构·图形渲染·win32
charlie11451419112 天前
通用GUI编程技术——图形渲染实战(二十八)——图像格式与编解码:PNG/JPEG全掌握
开发语言·c++·windows·学习·图形渲染·win32
charlie11451419113 天前
通用GUI编程技术——图形渲染实战(二十七)——坐标变换与矩阵:三级坐标系
c++·学习·c·图形渲染·win32
charlie11451419113 天前
通用GUI编程技术——图形渲染实战(二十六)——GDI+与GDI架构差异:抗锯齿与渐变
c++·windows·学习·图形渲染·win32
charlie11451419114 天前
通用GUI编程技术——图形渲染实战(二十五)——Alpha混合与透明效果:分层窗口实战
c++·windows·学习·图形渲染·win32
charlie11451419114 天前
通用GUI编程技术——图形渲染实战(二十四)——GDI Region与裁切:不规则窗口与可视化控制
c++·windows·学习·c·图形渲染·win32