如何事先测量静态尺寸?WINAPI

如何事先测量静态尺寸?WINAPI,winapi,fonts,static,Winapi,Fonts,Static,我正在创建一个带有静态文本的窗口,由于所有96/120/180 DPI的东西,我需要创建一个布局迷你引擎 对话框是在代码中创建的,静态是在代码中创建的,字体是在代码中创建的,所有这些,主要是因为.rc中的资源也有与DPI相关的问题,我想要一个完全的控制 所有这些的问题是,我不知道如何在静态中找到文本的长度。我需要计算静态控件的初始大小,还需要计算字体单位大小中不同静态之间的填充,但是因为我不知道上一个静态的大小,所以我无法偏移下一个静态 最大的问题是static会自动换行,因此我找不到一个文本度

我正在创建一个带有静态文本的窗口,由于所有96/120/180 DPI的东西,我需要创建一个布局迷你引擎

对话框是在代码中创建的,静态是在代码中创建的,字体是在代码中创建的,所有这些,主要是因为.rc中的资源也有与DPI相关的问题,我想要一个完全的控制

所有这些的问题是,我不知道如何在静态中找到文本的长度。我需要计算静态控件的初始大小,还需要计算字体单位大小中不同静态之间的填充,但是因为我不知道上一个静态的大小,所以我无法偏移下一个静态

最大的问题是static会自动换行,因此我找不到一个文本度量函数来计算这个值,也找不到一个自定义字体(斜体、粗体、超大)的修正值



有人有什么想法吗?

这个(ENDELLIPSIS、PathElipsis和LEFTNOWORDWRAP)似乎映射到了这些标志,所以用
DT|u WORDBREAK | DT|u CALCRECT
调用DrawText可能会尽可能接近……

这个(ENDELLIPSIS、PathElipsis和LEFTNOWORDWRAP)似乎映射到了这些标志,因此,使用
DT|u WORDBREAK | DT|u CALCRECT
调用DrawText可能会非常接近……

我想不出任何令人信服的理由来以与所有其他GUI类库不同的方式执行此操作。只需在“设计”DPI设置和目标机器DPI设置之间缩放窗口大小。在MFC中使用与DPI无关的常数是非常痛苦的,因为一切都是基于像素的。因此,将您的工作站保持在常见的96 DPI设置,然后在目标机器上进行缩放。由于TrueType暗示,您确实需要保持一些松弛。

我想不出任何令人信服的理由来以与所有其他GUI类库不同的方式执行此操作。只需在“设计”DPI设置和目标机器DPI设置之间缩放窗口大小。在MFC中使用与DPI无关的常数是非常痛苦的,因为一切都是基于像素的。因此,将您的工作站保持在常见的96 DPI设置,然后在目标机器上进行缩放。由于TrueType暗示,您必须保持一点松弛。

为什么不使用一个框架来为您完成所有这些工作?你不需要重新发明轮子。我有丰富的MFC经验可以说,我从来都不想看到框架来尝试为我做些什么,并且在尝试时惨遭失败。大多数代码最终都是针对框架的变通方法。而且WINAPI不太了解DPI。当然,也许我遗漏了DoMagic()函数,但到目前为止,大多数框架都增加了太多的麻烦。如果MFC是您对GUI框架的想法,那么您需要做更多!为什么不使用一个框架来为您完成所有这些呢?你不需要重新发明轮子。我有丰富的MFC经验可以说,我从来都不想看到框架来尝试为我做些什么,并且在尝试时惨遭失败。大多数代码最终都是针对框架的变通方法。而且WINAPI不太了解DPI。当然,也许我遗漏了DoMagic()函数,但到目前为止,大多数框架都增加了太多的麻烦。如果MFC是您对GUI框架的想法,那么您需要做更多!到目前为止,它似乎正是我想要的,我会做一些调查。你可能也需要DT_EXPANDTABS,但这取决于你的需要。我猜到目前为止,它似乎正是我想要的,我会做一些调查。你可能也需要DT_EXPANDTABS,但这取决于你的需要,我猜在一些罕见的情况下,缩放文本仍然会被截断。用文本创建一个静态文件,将其调整到最小宽度,编译运行,一切正常。由于对话框单元与默认字体相关,因此应用程序在120/180 DPI上看起来应该很好。但在某些配置文件下,文本会被截断。还有一些本地化的东西,文本会根据语言的不同而增长或收缩,这对那些rc文件来说也是一个麻烦。而且在winapi中,没有办法在DLU/像素之间安全地转换,所以我真的在考虑切换到基于像素的布局引擎。这样我至少不会有那些奇怪的无法解释的DLU边距和调整。如果在整个应用程序中单位不变,WM_大小的东西也会容易得多。静态就是一个简单的例子。您还需要缩放编辑控件、组合框等。我确实提到了TrueType提示问题,原因是文本仍然可以被截断。是的,你留下了大量的空间来本地化为德语。是的,很少有控件是如此糟糕以至于你甚至无法获得它们的SM_uu属性。它是否固定在WPF/Winforms GUI上?正如我所解释的,Winforms实现了扩展。WPF严格使用英寸和点,因此会自动缩放。在某些罕见的情况下,缩放文本仍然会被截断。用文本创建一个静态文件,将其调整到最小宽度,编译运行,一切正常。由于对话框单元与默认字体相关,因此应用程序在120/180 DPI上看起来应该很好。但在某些配置文件下,文本会被截断。还有一些本地化的东西,文本会根据语言的不同而增长或收缩,这对那些rc文件来说也是一个麻烦。而且在winapi中,没有办法在DLU/像素之间安全地转换,所以我真的在考虑切换到基于像素的布局引擎。这样我至少不会有那些奇怪的无法解释的DLU边距和调整。如果在整个应用程序中单位不变,WM_大小的东西也会容易得多。静态就是一个简单的例子。您还需要缩放编辑控件、组合框等。我确实提到了TrueType提示问题,原因是文本仍然可以被截断。是的,你留下了大量的空间来本地化为德语。是的,很少有控件是如此糟糕以至于你甚至无法获得它们的SM_uu属性。它是否固定在WPF/Winforms GUI上?正如我所解释的,Winforms实现了扩展。WPF严格使用inche