加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

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

发布时间:2020-12-13 20:11:20 所属栏目:Windows 来源:网络整理
导读:我需要找出 Windows API中控件的首选尺寸(宽度和高度).据我所知,关于这个问题的唯一官方话是 the Layout page of the Windows Desktop Program Guidelines,这是一个看起来像Windows Vista的文档,而 Microsoft Management Console docs equivalent是前者似乎
我需要找出 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(列出的几个东西的宽度)
> 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控制布局.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读