前一页给出了两个对话框单元和像素(不在后面页面中的一些)的示例大小.表面上是在96 dpi的9点Segoe UI.我不知道对话单元的计算是否从未更新过这个新的DPI值,但是不管我尝试了三种不同的方法,没有什么可以加起来.
This program基于here和here的信息,以两种方式进行计算.第一种使用TEXTMETRICS结构的tmAveCharWidth字段;第二个在第一个链接中使用GetTextExtentPoint32()函数.然后,重复该过程,考虑古代System字体(参见第一个链接).
在Windows 7上运行此程序
> BUTTON_SIZE_X保持在50(列出的几个东西的宽度)
> BUTTON_SIZE_Y更改为25(列出的Vista-and-up-only命令链接的高度,一行文本)
这样我们根据布局页面的预期尺寸将是75×41的产量
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
我们可以看到从对话单位到像素的四种不同的可能转换.
The second program只是做一个虚拟对话框,并调用MapDialogRect()来获得the baseX and baseY coordinates in the above.这样可以产生
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之前使用的字体…但是我不知道正确的大小是多少!
而且仍然保留控件,例如没有列出宽度或宽度公式的复选框和静态文本控件(和命令链接!).当然,对于静态文本控件,我可以得到文本的宽度,并说这是首选的宽度,但这并不考虑到控件提供的任何可能的水平填充.对于复选框而言,复选框部分的宽度不大. (我确实找到了一些方法来找到这些坐标,特别是在Stack Overflow上,但都有自己的缺点).甚至没有我在这个问题的顶部提到的MMC文档说得太多(或者更糟的是,尽可能地使事情变得更广;如果这是适合对话框,那么当我想弄清楚这个对话框有多宽首先让对话框!).
此外,当Microsoft创建版本6 Common Controls库时,他们决定添加消息以确定正确的控件大小!只有一些控件:
> BCM_GETIDEALSIZE – 按钮;列为其他类型的按钮无效
> DTM_GETIDEALSIZE – 日期/时间选择器
> LM_GETIDEALSIZE – 超链接仅返回给定宽度的高度
> RBBIM_IDEALSIZE – ReBar控件;实际上不是一个消息,而是其他的东西
> TB_GETIDEALSIZE – 工具栏
现在在Windows中如何与控件进行比较?事实已经在Windows XP上看起来正确,但Winodws 7的对话框和其他控件是非常不一致的(有些仍然使用Tahoma甚至MS Sans Serif作为对话框的fontS!),我无法确定什么按钮的大小是正确的.
所以我想知道的是:
>五种计算方法中的哪一种是真正正确的,如果Layouts页面上的示例不是?
有没有比不完整的布局和MMC布局页面更有权威的参考控制大小(和理想的起搏)?
>有没有这样的参考,早于Vista,也可以提供线索?
>或者这一切都是无望的,我不得不选择一些htat只是看起来错了我,不管是什么?
要获得Windows控件的首选大小:
如果是视觉风格,使用GetThemePartSize,否则你需要开发我们的例程来计算首选尺寸.请参考Firefox的source code.
2.如何布局控件:
或如何确定控件的正确大小和正确的位置.这不是一个简单的问题,您需要像其他UI系统那样开发自己的布局管理系统.以android为例,
>它需要根据当前窗口的大小和自己的布局参数(固定大小/填充 – 父/ warp内容)来测量控件的大小.对于文本按钮,它需要测量文本的大小.
>如果所有儿童大小的总和超出了窗口的大小,则需要进行一些协调.
>最后为控件设置正确的大小和位置.
一个应用程序有很多不同的布局要求,所以android开发了很多布局管理器,如LinearLayout,GridLayout等.那么它适用于Windows UI布局系统和所有其他UI布局系统.
你需要写很多代码,这样做是正确的.请参考chrome / firefox UI系统的源代码.
解决方案:
我想你最好使用一些现有的UI系统,如QT / Vxwidgets来执行Windows控制布局.