正确的方法来获得Windows控件的首选大小

前端之家收集整理的这篇文章主要介绍了正确的方法来获得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基于herehere的信息,以两种方式进行计算.第一种使用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控制布局.

原文链接:https://www.f2er.com/windows/371133.html

猜你在找的Windows相关文章