C++ GetTextExtentPoint32 没有给出正确的大小[重复]

2023-12-11

我正在尝试使用获取文本字符串的大小获取文本范围点32。我多次阅读文档并做了一些研究,据我所知,下面的代码应该给我正确的width and height的文本。

vFontFamily = "Segoe UI"; //font family
vFontSize = 26; //font size

HDC hdc = GetDC(hwnd);
HFONT hFont = CreateFont(
     -MulDiv(vFontSize, GetDeviceCaps(hdc, LOGPIXELSY), 72), //calculate the actual cHeight.
      0, 0, 0, // normal orientation
      FW_NORMAL,   // normal weight--e.g., bold would be FW_BOLD
      false, false, false, // not italic, underlined or strike out
      DEFAULT_CHARSET, OUT_OUTLINE_PRECIS, // select only outline (not bitmap) fonts
      CLIP_DEFAULT_PRECIS, CLEARTYPE_QUALITY, VARIABLE_PITCH | FF_SWISS, vFontFamily);

SIZE size;
HFONT oldfont = (HFONT)SelectObject(hdc, hFont);
GetTextExtentPoint32(hdc, L"This is Text", wcslen(L"This is Text"), &size);

width = size.cx; //get width
height = size.cy; //get height

SelectObject(hdc, oldfont); //don't forget to select the old.
DeleteObject(hFont); //always delete the object after creating it.
ReleaseDC(hwnd, hdc); //alway reelase dc after using.

不幸的是,它没有给我正确的尺寸。宽度过多至少 10%,高度过多至少 5%。准确地说,是文本中宽度的结果This is Text is 228高度是62而更准确的是有点接近190 x 55我认为。

文字是使用绘制的GDI+.

case WM_PAINT: {
    PAINTSTRUCT ps;
    HDC hdc = BeginPaint(hwnd, &ps);
    Graphics g(hdc);
    
    FontFamily  theFontFamily(vFontFamily);
    Font        font(&theFontFamily, vFontSize, FontStyleRegular, UnitPixel);
    SolidBrush  brush(Color(255, R, G, B));
    PointF      pointF(0.0f, 0.0f);

    TextRenderingHint hint = g.GetTextRenderingHint(); // Get the text rendering hint.
    g.SetTextRenderingHint(TextRenderingHintAntiAlias); // Set the text rendering hint to TextRenderingHintAntiAlias. 
    g.DrawString(L"This is Text", strlen("This is Text"), &font, pointF, &brush);

    EndPaint(hwnd, &ps);
    return TRUE;
}

我想这可能与我绘制文本的方式有关,因为在绘画消息中,我使用了Font代替HFONT。但这没有任何意义,对吧?只要我之前设置了正确的字体系列和字体大小GetTextExtentPoint32那么它应该给我文本的确切宽度和高度。你怎么认为?


您正在使用GDI在您使用时测量您的文本GDI+来画它。

GDI+是GDI的改进,当你用它来渲染文本等时,两者之间存在差异。另一件事是DPI 意识,在测量文本时,您还需要确保处理缩放。与使用 GDI+ 绘制时的实际宽度和高度相比,如果您在测量中没有正确处理 DPI,您的方法将得到更大的结果。

尝试使用图形::测量字符串看看你是否得到了预期的宽度和高度。按照与绘制字符串相同的方式进行操作艾伦·博特尔斯评论中说。

例如,

HDC hdc = GetDC(hwnd);                                                      //get dc of your handle.
Graphics graphics(hdc);                                                     //setup graphics.
FontFamily  theFontFamily(vFontFamily);                                     //setup your font family.
Font        font(&theFontFamily, vFontSize, FontStyleRegular, UnitPixel);   //create the font the same way how you do it on your paint message.
PointF      pointF(0.0f, 0.0f);                                             //use PointF instead of RectF since thats how you paint it.

RectF boundRect;                                                            //setup boundRect to get the width and height.
graphics.MeasureString(text, -1, &font, pointF, &boundRect);                //Measure the text of the string
//or
//graphics.MeasureString(L"This is Text", strlen("This is Text"), pointF, &boundRect);

width = boundRect.Width;                                                    //get the width of text from boundRect.
height = boundRect.Height;                                                  //get the height of text from boundRect.

DeleteObject(&font);                                                        //delete the font.
ReleaseDC(LabelHandle, hdc);                                                //always reelase dc after using.

如果您需要更多解释,以下内容可能会对您有所帮助。

如何根据静态控件的内容自动设置宽度和高度?

同机不同进程下GDI+字体大小差异

DPI 意识真的需要吗?

如何绘制独立于 DPI 的 GDI + 文本

.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ GetTextExtentPoint32 没有给出正确的大小[重复] 的相关文章

随机推荐

  • 如何找到hcaptcha回调函数

    所以我需要帮助在网站上查找 hcaptcha 回调函数 网站上没有提交按钮 所以我假设他们使用 hcaptcha 回调函数 该网站是https discord com register任何帮助将不胜感激 这段代码应该可以帮助你 https
  • 如何在 WAMPServer 中从 Windows 命令行运行 PHP

    我是 php 新手 想从命令行运行 php 我已经安装了 WAMP 并将 系统变量 设置为我的 php 文件夹 即C wamp bin php php5 4 3 当我去Run gt CMD gt 类型php a然后按回车键 它说intera
  • 在 EF Core 2.0 中使用 DataTable 作为表值参数

    更新问题描述 我们有一个批量导入流程 我们正在通过该流程IEnumerable
  • 如何使用像素RGB值0到1在java中编写PNG文件?

    我正在用 java 编写光线追踪器 并试图弄清楚如何将生成的图像写入 PNG 文件 到目前为止 我找到的所有示例都演示了如何使用 BufferedImage 创建 PNG 但它们都使用 RGB 值 0 到 255 在我的代码中 我表示 0
  • 使用 libjpeg 在 C++ 中旋转 JPEG 图像

    我正在尝试根据 EXIF 元数据中存在的 方向 参数 使用 libjpeg v9 在 C 中旋转 JPEG 图像 我能够获取 方向 参数 并在此基础上 我还能够将图像旋转到另一个文件中 以便旋转后的图像对应于 方向 值 1 请参阅我从 jp
  • 将 Google 工作表数据直接导入 R [关闭]

    Closed 这个问题需要多问focused 目前不接受答案 是否可以在没有授权密钥的情况下直接从 Google 文档将表导入到 R 中 我有一个可共享的谷歌表格 我尝试连接到闪亮的应用程序 但找不到合适的方法 随包gsheet您可以从可共
  • 使用“pys-onClick=...”从按钮单击调用 py-script 函数不起作用?

    我对 PyScript 比较陌生 希望在单击按钮时运行一个函数 但是 无论我尝试什么代码 它似乎都不起作用 该按钮是可点击的 但似乎没有执行任何操作 当我手动调用该函数 在 py script 标记内 时 它工作正常 我错过了什么吗 这是我
  • 如何在 Automapper 中注册来自不同程序集的配置文件?

    我有一个包含许多程序集的应用程序 NET Core WebAPI 包含视图模型并使用 DTO 服务 包含 DTO 并使用域实体 在 WebAPI 程序集中 我使用以下行自动注册了自动映射器配置文件 services AddAutoMappe
  • 使用 jQuery unique 过滤重复的 img src 或删除

    我尝试了此处讨论的不同解决方法 但它们都不适用于我的情况 这是我的来源 div class colourDots img src out pictures generated product 8 300 450 100 60028 bl j
  • 为什么MySQL允许按未选择的列进行分组

    我正在读一本关于 SQL 的书 Sams Teach Yourself SQL in 10 Minutes 尽管它的标题是这样 但它还是相当不错的 然而关于 group by 的章节让我感到困惑 对数据进行分组是一个简单的过程 选定的列 下
  • Google 地图:放置项目时 IE7 和 IE8 未捕获 mouseup 事件

    我不明白为什么这把小提琴不适用于 IE7 和 IE8 目标是在地图上拖动气球并捕获 mouseup 事件以检索项目已放置的坐标 如果用户没有拖动气球 该事件会在所有浏览器 包括 IE7 和 IE8 上正确触发 但是 如果用户拖动气球 IE7
  • UIActivityController 在设备和模拟器上的行为不同

    我将 ActivityViewController 添加到我的应用程序中 如下所示 传递图像 UIActivityViewController avc UIActivityViewController alloc initWithActiv
  • 编写一个 C# 程序,扫描电子商务网站并从中提取产品图片+价格+描述

    我正在开发一个电子商务搜索引擎 可以让您在很多电子商务网站中搜索产品 我该如何处理这个问题 我需要一个能够扫描网站 解析 HTML 并确定网站中的哪些图像是产品图像 哪些是产品描述 哪些是产品价格的应用程序 很高兴听到任何想法 例如 提前致
  • 使用 Azure AD Graph 客户端 API 更改用户密码的权限问题

    我正在尝试在 ASP Net MVC 中创建一个页面来重置当前用户的密码 我正在使用 Azure Active Directory 进行用户身份验证 为了访问用户的 AD 信息 我使用 C Graph API 客户端 我的代码基于以下位置的
  • 在 eclipse 中创建连接 - ClassNotFoundException: com.mysql.jdbc.Driver

    我没有在代码中执行任何操作 我只是创建了一个 Eclipse 连接 但似乎无法 ping 它 连接属性 该罐子就是我所说的位置 GLASSFISH HOME domains domain1 lib ext 但我得到 java lang Cl
  • “texlive”应该有什么权限?

    多年来我一直使用 MacTeX 它安装在 usr local texlive 并且最近开始使用 Homebrew 来管理一些包 尽管还没有 TeX 由于采用了 Homebrew 我改变了所有的所有者 usr local to Me admi
  • JSF 中有浏览按钮吗?

    我需要这个来实现我创建的基于网络的应用程序的导入功能 我需要获取用户想要导入的文本文件的路径 以便获取文本文件内的数据并将其保存在数据库中 标准 JSF 中没有这样的组件 但是 有几个组件库提供文件选择 PrimeFaces
  • 我在应用德摩根定律时遇到问题...反馈?

    每次我的作业中出现这些问题时 我都会做错 有人能帮助我理解吗 还是老师的钥匙关了 我无法知道 因为我没有得到正确的答案 它只能让我知道我的答案是错误的 Assume x 7 and y 5 应用德摩根定律 选择与以下逻辑表达式等效的逻辑表达
  • 在 pandas 数据帧上使用 cumcount 并有条件增量

    考虑数据框 df pd DataFrame A 1 A 1 B 1 B 0 A 0 A 1 B 1 columns key cond 我想找到每个的累积 运行 计数 从 1 开始 key 只有当组中的前一个值有时我们才会增加cond 1 当
  • C++ GetTextExtentPoint32 没有给出正确的大小[重复]

    这个问题在这里已经有答案了 我正在尝试使用获取文本字符串的大小获取文本范围点32 我多次阅读文档并做了一些研究 据我所知 下面的代码应该给我正确的width and height的文本 vFontFamily Segoe UI font f