C 获取Windows控件首选大小的正确方法

C 获取Windows控件首选大小的正确方法,c,winapi,user-interface,C,Winapi,User Interface,我需要找出Windows API中控件的首选大小(宽度和高度)。据我所知,关于这件事的唯一官方说法是,一份似乎与Windows Vista一起引入的文档,以及一份似乎基于Windows Vista的文档 前一页给出了96 dpi的9点Segoe UI的对话框单位和像素大小示例(后一页中没有)。我不知道对话框单位计算是否从未针对这个新的DPI值进行过更新,但不管怎样,我尝试了三种不同的方法,但没有任何结果 以两种方式计算,均基于信息和。第一个使用TEXTMETRICS结构的tmAveCharWid

我需要找出Windows API中控件的首选大小(宽度和高度)。据我所知,关于这件事的唯一官方说法是,一份似乎与Windows Vista一起引入的文档,以及一份似乎基于Windows Vista的文档

前一页给出了96 dpi的9点Segoe UI的对话框单位和像素大小示例(后一页中没有)。我不知道对话框单位计算是否从未针对这个新的DPI值进行过更新,但不管怎样,我尝试了三种不同的方法,但没有任何结果

以两种方式计算,均基于信息和。第一个使用
TEXTMETRICS
结构的
tmAveCharWidth
字段;第二个使用第一个链接中的
GetTextExtentPoint32()
函数。然后,它重复这个过程,将古代系统字体考虑在内(参见第一个链接)

使用在Windows 7上运行此程序

  • 按钮大小保持在50(列出的几个东西的宽度)
  • 按钮\u SIZE\u Y
    更改为25(列出的视景高度和仅向上一行文本的命令链接)
这样,基于布局页面的预期大小将为75x41

GetTextExtentPoint32: Segoe UI 9 | baseX 7 baseY 15 | button 50 x 25 -> 88 x 47
tm.tmAveCharWidth:    Segoe UI 9 | baseX 6 baseY 15 | button 50 x 25 -> 75 x 47
with system font: System 9
GetTextExtentPoint32: Segoe UI 9 | cX 7 cY 15 sysX 8 sysY 16 | button 50 x 25 -> 87 x 46
tm.tmAveCharWidth:    Segoe UI 9 | cX 6 cY 15 sysX 7 sysY 16 | button 50 x 25 -> 85 x 46
我们已经可以看到从对话框单位到像素的四种不同的可能转换

只需创建一个虚拟对话框并调用
MapDialogRect()。这就产生了

Segoe UI 9 weight:400 italic:0 charset:1
[0 0 8 16]
如果我们手动进行计算,第一个程序会:

width  - (50*8)/4 = 100
height - (25*16)/8 = 50
我想知道是否所有的计算(包括命令链接的计算)都使用Tahoma或MS Sans Serif,Vista之前使用的字体。。。但是我不知道正确的尺寸是多少

这样,复选框和静态文本控件(以及命令链接!)等控件仍然没有列出宽度或宽度公式。当然,对于静态文本控件,我可以只得到文本的宽度,并说这是首选宽度,但这没有考虑控件提供的任何可能的水平填充。这不适用于复选框,复选框部分有额外的宽度。(我确实找到了一些方法来找到这些坐标,特别是在堆栈溢出上,但它们都有缺点)。甚至我在这个问题顶部提到的MMC文档也没有说太多(或者更糟的是,使事情尽可能宽;如果这是为了适应对话框,那么当我试图首先确定对话框的宽度时,这完全起作用!)

更重要的是,当微软创建版本6通用控件库时,他们决定包含用于确定控件正确大小的消息。。。只有一些控件:

  • BCM_GETIDEALSIZE
    -按钮;列为对其他类型的按钮无效
  • DTM\u GETIDEALSIZE
    -日期/时间选择器
  • LM_GETIDEALSIZE
    -超链接仅返回给定宽度的高度
  • RBBIM\u理想尺寸
    -钢筋控制;实际上不是一条信息,而是别的东西
  • TB\u GETIDEALSIZE
    -工具栏
现在,与Windows中的控件进行比较怎么样?在Windows XP上,一切看起来都是正确的,但Winodws 7的对话框和其他控件却惊人地不一致(有些仍然使用Tahoma甚至MS Sans Serif作为对话框字体!),我永远无法确定按钮的大小是否正确

所以我想知道的是:

  • 如果布局页面上的示例不正确,那么五种计算方法中哪一种是真正正确的
  • 是否有比不完整布局和MMC布局页面更权威的关于控件大小(以及理想的步调)的参考
  • 是否有这样一个早于Vista的参考文献也能提供线索
  • 还是说这一切都是毫无希望的,我不得不选择一些我觉得不对劲的东西
    • 只是一些线索:

      1。要获取windows控件的首选大小:

      如果“视觉样式”处于启用状态,请使用,否则您需要开发我们的例程来计算首选尺寸。请参考Firefox的

      2.如何布局控件:

      或者如何确定控件的正确大小和位置。这不是一个简单的问题,您需要像其他UI系统一样开发自己的布局管理系统。以安卓为例,

    • 它需要根据当前窗口的大小及其自身的布局参数(固定大小/填充父对象/扭曲内容)测量控件的大小。对于文本按钮,它需要测量文本的大小
    • 如果所有子项大小的总和超出了窗口的大小,则需要进行一些协调
    • 最后为控件设置正确的大小和位置
    • 应用程序有许多不同的布局要求,因此android开发了许多布局管理器,如LinearLayout、GridLayout等。Windows UI布局系统和所有其他UI布局系统也是如此

      您需要编写大量代码来正确地执行此操作。请参考chrome/firefox UI系统的源代码

      3.解决方案:


      我认为您最好使用一些现有的UI系统,如QT/Vxwidgets来进行Windows控件布局。

      请给问题一个对其他人有意义的标题。您能给出需要知道的原因吗?您是否试图复制当前控件并稍微更改某些内容?否;这是专门用于手动控件创建和布局的。正如您所注意到的,windows ui乱七八糟。所以根据《微软Windows用户体验:用户界面开发者和设计者的官方指南》(1999),对话框单位数没有改变;这本书没有提供样本像素计数,但我开始倾向于“它仍然是b”