gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 16:41:56 26 4
gpt4 key购买 nike

我需要弄清楚 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 .第一个使用 tmAveCharWidth领域TEXTMETRICS结构;第二个使用 GetTextExtentPoint32()第一个链接中的功能。然后,它重复该过程,将古老的 System 字体考虑在内(请参阅第一个链接)。

在 Windows 7 上运行这个程序

  • BUTTON_SIZE_X保持在 50(列出的几个东西的宽度)
  • BUTTON_SIZE_Y更改为 25(仅包含一行文本的 Vista 及更高版本命令链接的列出高度)

  • 这样我们基于布局页面的预期尺寸将是 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

    我们已经可以看到从对话单位到像素的四种不同的可能转换。

    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 版通用控件库时,他们决定包含用于确定控件适当大小的消息! ...只有一些控件:
  • BCM_GETIDEALSIZE - 按钮 ;被列为对其他类型的按钮无效
  • DTM_GETIDEALSIZE - 日期/时间选择器
  • LM_GETIDEALSIZE - 超链接; 仅返回给定宽度的高度
  • RBBIM_IDEALSIZE - ReBar 控件;实际上不是消息而是别的东西
  • TB_GETIDEALSIZE - 工具栏

  • 现在如何与 Windows 中的控件进行比较?好吧,在 Windows XP 上看起来已经很正确了,但是 Winodws 7 的对话框和其他控件出奇地不一致(有些仍然使用 Tahoma 甚至 MS Sans Serif 作为对话框字体!)而且我永远无法确定什么按钮大小是正确的。

    所以我想知道的是:
  • 如果布局页面上的示例不正确,那么五种计算方法中的哪一种是真正正确的?
  • 是否有比不完整的布局和 MMC 布局页面更权威的关于控件大小(以及理想情况下的步调)的引用?
  • 是否有这样一个比 Vista 更早的引用文献也可以提供线索?
  • 或者这一切只是没有希望,我必须选择一些htat,无论如何对我来说都是错误的?
  • 最佳答案

    只是一些线索:

    1. 要获得 Windows 控件的首选大小:

    如果视觉样式打开,使用 GetThemePartSize ,否则您需要开发我们的例程来计算首选尺寸。请引用火狐的 source code .

    2. 如何布局控件:

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

  • 它需要根据当前窗口的大小和它自己的布局参数(fixed-size/fill-parent/warp-content)来测量控件的大小。对于文本按钮,它需要测量文本的大小。
  • 如果所有子尺寸的总和超出了窗口的尺寸,则需要进行一些协调。
  • 最后为控件设置正确的大小和位置。

  • 一个应用程序有很多不同的布局要求,所以android开发了很多布局管理器,比如LinearLayout、GridLayout等。Windows UI布局系统和所有其他UI布局系统也是如此。

    你需要写很多代码才能做到这一点。请引用chrome/firefox UI系统源码。

    3. 解决方法:

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

    关于c - 获得 Windows 控件首选大小的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24130548/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com