Действительно ли свойства положения окна WPF Left, Top, Height и Width удваиваются? - PullRequest
1 голос
/ 08 февраля 2011

Свойства позиции Слева , Верх , Высота и Ширина окна WPF являются двойными.Однако, когда взаимодействует с сообщениями Windows , такими как WM_MOVING и WM_MOVE , необходимо преобразовать двойное число в целочисленный тип .

Мне показалось, что это нормально, поскольку во всех уведомлениях Windows используются целочисленные типы во всех аргументах позиций, и я полагаю, что эти сообщения тесно связаны со свойствами позиции WPF.

Так что вопросПравильно ли я в этом предположении, или уведомления Windows на самом деле могут быть удвоены, и в конечном итоге будет какой-то странный побочный эффект?

Ответы [ 2 ]

3 голосов
/ 08 февраля 2011

В окнах WPF эти свойства фактически отображаются в положение окна, которое, как вы заметили (в Windows), в конечном итоге будет соответствовать целочисленному значению.

Тем не менее, они определены как double, что хорошо, так как они корректно отображаются (и наследуются) от других свойств FrameworkElement, т. Е. Элементы в окне имеют преимущество двойной точности, поскольку они разработаны, чтобы быть независимыми от разрешения и допускают произвольное масштабирование с помощью преобразования и т. Д.

Чтобы сделать эти целые числа, каркас должен сделать Window не являющимся FrameworkElement или определить для них отдельные свойства, игнорируя свойства FrameworkElement. Любой из вариантов вызовет путаницу и будет хуже, чем оставление этих двойных значений. Кроме того, следует понимать, что для реализации в будущем возможно использование субпиксельного позиционирования - хотя Windows API не поддерживает это сейчас, теоретически возможно (хотя и маловероятно), что это может произойти в будущем.

2 голосов
/ 08 февраля 2011

Когда дело доходит до сообщений и позиций окон, числа должны быть преобразованы в целые числа, без сомнения.

Но перед реальным выводом координаты элемента могут быть сдвинуты на небольшую величину (скажем,менее 0,5 пикселей), или содержащий элемент может быть растянут на некоторый нецелочисленный коэффициент.Другое применение координат с плавающей точкой - это случай, когда некоторое пространство делится на столбцы одинакового размера: вы не можете разделить 100 пикселей на 3, не переходя к плавающей точке (ну, с плавающей точкой все еще есть некоторая ошибка, но это можетпренебрегать).

Итак, все внутренние координаты и операции над ними рассчитываются в двойных единицах, а преобразование в целые происходит только тогда, когда речь идет о реальном экране.

...