如何预先测量静态尺寸? WINAPI
Posted
技术标签:
【中文标题】如何预先测量静态尺寸? WINAPI【英文标题】:How to measure static size beforehand? WINAPI 【发布时间】:2011-01-21 17:05:06 【问题描述】:我正在创建一个带有静态文本的寡妇,并且由于所有 96/120/180 DPI 的东西,我需要创建一个布局迷你引擎。
对话框是在代码中创建的,静态是在代码中创建的,字体是在代码中创建的,一切,主要是因为 .rc 中的资源也存在与 DPI 相关的问题,我想要完全控制。
这一切的问题是我不知道如何在静态中找到文本的长度。我需要计算静态控件的初始大小,而且,我需要计算字体单元大小中不同静态之间的填充,但由于我不知道前一个静态的大小,我无法偏移下一个一个。
最大的问题是 static 会自动换行,因此我找不到可以计算该值的文本测量函数以及对自定义字体、斜体、粗体、超大号的校正...
有人有什么想法吗?
【问题讨论】:
为什么不使用可以为您完成所有这些工作的框架?您无需重新发明***。 我在 MFC 方面有丰富的经验,可以说我从来不想看到框架为我尝试做某事,但在使用时却惨遭失败。大多数代码最终都是针对框架的解决方法。并且 WINAPI 不是很清楚 DPI。当然,也许我错过了 DoMagic() 函数,但到目前为止,大多数框架都带来了更多的麻烦。 如果 MFC 是您对 GUI 框架的想法,那么您需要更多! 【参考方案1】:static control styles(ENDELLIPSIS、PATHELLIPSIS 和 LEFTNOWORDWRAP)似乎映射到 DrawText 标志,因此使用 DT_WORDBREAK|DT_CALCRECT
调用 DrawText 可能会尽可能接近...
【讨论】:
到目前为止,这似乎正是我想要的,我会做一些调查。 你可能也想要 DT_EXPANDTABS,但这取决于你的需要我猜【参考方案2】:我想不出任何令人信服的理由来这样做,与所有其他 GUI 类库的做法不同。只需在“设计”DPI 设置和目标机器 DPI 设置之间缩放窗口大小。在 MFC 中使用与 DPI 无关的常量非常痛苦,因为一切都是基于像素的。因此,请将您的工作站保持在常用的 96 DPI 设置,然后在目标机器上进行缩放。由于 TrueType 提示,您必须保持一点松懈。
【讨论】:
在极少数情况下,缩放文本仍会被截断。用文本创建一个静态,将其调整为最小宽度,编译运行,一切正常。由于对话框单元与默认字体相关,因此应用程序在 120/180 DPI 上应该看起来不错。但是在某些配置文件下,文本会被截断。然后是本地化的东西,其中文本往往会根据语言而增长或缩小,这也是那些 rc 文件的混乱。 然后没有办法在winapi中安全地在DLU/像素之间进行转换,所以我真的在考虑切换到基于像素的布局引擎。这样我至少不会有那些奇怪的无法解释的 DLU 边距和调整。如果单位在整个应用程序中保持不变,WM_SIZE 的东西也会容易得多。 好吧,STATIC 是一个简单的例子。您还需要缩放编辑控件、组合框等。我确实提到了 TrueType 提示问题,原因是文本仍然会被截断。是的,你留下了大量的空间来本地化德语。 是的,很少有控件如此糟糕,您甚至无法获得它们的 SM_ 属性。它是否固定在 WPF/Winforms GUI 上? Winforms 按照我的解释实现了缩放。 WPF 严格使用英寸和点,因此会自动缩放。以上是关于如何预先测量静态尺寸? WINAPI的主要内容,如果未能解决你的问题,请参考以下文章