正确的方法来获得Windows控件的首选大小
我需要找出
Windows API中控件的首选尺寸(宽度和高度).据我所知,关于这个问题的唯一官方话是
the Layout page of the Windows Desktop Program Guidelines,这是一个看起来像Windows Vista的文档,而
Microsoft Management Console docs equivalent是前者似乎是基于的.
前一页给出了两个对话框单元和像素(不在后面页面中的一些)的示例大小.表面上是在96 dpi的9点Segoe UI.我不知道对话单元的计算是否从未更新过这个新的DPI值,但是不管我尝试了三种不同的方法,没有什么可以加起来. This program基于here和here的信息,以两种方式进行计算.第一种使用TEXTMETRICS结构的tmAveCharWidth字段;第二个在第一个链接中使用GetTextExtentPoint32()函数.然后,重复该过程,考虑古代System字体(参见第一个链接). 在Windows 7上运行此程序 > BUTTON_SIZE_X保持在50(列出的几个东西的宽度) 这样我们根据布局页面的预期尺寸将是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 – 按钮;列为其他类型的按钮无效 现在在Windows中如何与控件进行比较?事实已经在Windows XP上看起来正确,但Winodws 7的对话框和其他控件是非常不一致的(有些仍然使用Tahoma甚至MS Sans Serif作为对话框的fontS!),我无法确定什么按钮的大小是正确的. 所以我想知道的是: >五种计算方法中的哪一种是真正正确的,如果Layouts页面上的示例不是?
只是一些线索:
要获得Windows控件的首选大小: 如果是视觉风格,使用GetThemePartSize,否则你需要开发我们的例程来计算首选尺寸.请参考Firefox的source code. 2.如何布局控件: 或如何确定控件的正确大小和正确的位置.这不是一个简单的问题,您需要像其他UI系统那样开发自己的布局管理系统.以android为例, >它需要根据当前窗口的大小和自己的布局参数(固定大小/填充 – 父/ warp内容)来测量控件的大小.对于文本按钮,它需要测量文本的大小. 一个应用程序有很多不同的布局要求,所以android开发了很多布局管理器,如LinearLayout,GridLayout等.那么它适用于Windows UI布局系统和所有其他UI布局系统. 你需要写很多代码,这样做是正确的.请参考chrome / firefox UI系统的源代码. 解决方案: 我想你最好使用一些现有的UI系统,如QT / Vxwidgets来执行Windows控制布局. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 如何在Windows 7命令行上执行.jar java程序?
- windows-server-2008-r2 – 非域客户端的RemoteApps
- windows – 使用cmd提示符搜索谷歌或其他搜索引擎上的单词
- vue项目创建前准备
- windows-server-2008 – 如何提高Hyper-V性能
- windows-8 – Windows 8 Live Tile多久更新一次?
- 在windows下生成有效的openssh ssh密钥
- 通过WPF样式或触发器设置TaskbarItemInfo
- windows-7 – Pyinstaller,如何在32位linux上制作32位和64位
- windows-phone-8 – 添加辅助Windows Phone 8磁贴