【问题标题】:Are the WPF Window position properties Left, Top, Height and Width ever actually Doubles?WPF Window 位置属性 Left、Top、Height 和 Width 实际上是否双倍?
【发布时间】:2011-02-08 18:47:02
【问题描述】:

WPF 窗口的位置属性LeftTopHeightWidth 是双精度型。然而,当interacting with windows messagesWM_MOVINGWM_MOVE 时,必须将双精度转换为integral type

这对我来说似乎没问题,因为所有 Windows 通知似乎都在其所有位置参数中使用整数类型,我想这些消息与 WPF 位置属性密切相关。

所以问题是,我的这个假设是正确的,还是 Windows 通知实际上是双倍的,最终会有一些奇怪的副作用?

【问题讨论】:

    标签: .net wpf windows


    【解决方案1】:

    在 WPF 窗口中,这些属性实际上映射到窗口的位置,正如您所说(在 Windows 中)最终将映射到一个整数值。

    但是,它们被定义为双精度,这很好,因为它们干净地映射到(并继承自)其他 FrameworkElement 属性,即:FrameworkElement.Width。窗口中的元素确实利用了双精度,因为它们被设计为独立于分辨率并允许通过变换等进行任意缩放。

    要生成这些整数,框架必须使 Window 不是 FrameworkElement,或者为它们定义单独的属性,忽略 FrameworkElement 的属性。任何一种选择都会引起混淆,并且比保留这些双精度值更糟糕。此外,请意识到未来的实现可能会使用亚像素定位 - 尽管 Windows API 现在不支持此功能,但理论上可能(尽管不太可能)将来可能。

    【讨论】:

    • 您知道这样做是否可以像地图一样将图像精确地覆盖在另一个图像上?
    • @Alex:使用浮点值是 WPF 分辨率独立性的一部分。 Window 使用它我认为只是为了保持一致性——而不是因为它添加了任何东西(在 Window 中)。但是,是的,图像叠加是好处之一 - 以及能够进行非常精确的缩放等。
    【解决方案2】:

    当涉及到窗口消息和窗口位置时,毫无疑问,数字必须转换为整数。

    但在实际输出之前,项目坐标可以移动一些小量(例如,小于 0.5 像素),或者可以通过一些非整数系数拉伸包含项目。浮点坐标的另一个应用是一些空间被划分为大小相等的列的情况:你不能在不去浮点的情况下将 100 像素除以 3(好吧,使用浮点仍然会有一些错误,但它可以被忽略)。

    因此,所有内部坐标和对它们的操作都是以双精度计算的,并且只有在实际屏幕上才会转换为整数。

    【讨论】:

      猜你喜欢
      • 2014-11-13
      • 1970-01-01
      • 2023-03-20
      • 1970-01-01
      • 1970-01-01
      • 2011-04-03
      • 2021-04-22
      • 2011-05-25
      • 2012-10-28
      相关资源
      最近更新 更多