Пиксельное поведение FillRectangle и DrawRectangle

почти каждый раз я использую Graphics.DrawRectangle или Graphics.FillRectangle ( int версии) я, кажется, пропускаю пиксели справа и нижнюю границу прямоугольника, который я хочу потянуть.

Каково точное определение, которого пиксели заполняются

Graphics.FillRectangle(brush,x,y,width,height)

и

Graphics.DrawRectangle(pen,x,y,width,height) // pen is one pixel width, i.e. width=0f

и есть ли логическое объяснение его? (таким образом, я могу наконец помнить поведение :)...),

Править:

Используя чудесную Попытку Oleg Zhuk GDI + приложение, я смог найти любопытное различие между FillRectangle и DrawRectangle:

FillRectangle(brush,0,0,1,1) тянет единственную точку в (0,0), который так или иначе понятен (это - прямоугольник с шириной и высотой один, в конце концов).

DrawRectangle(pen,0,0,1,1) с другой стороны, тянет маленький прямоугольник 2 на 2 пикселя.

То же поведение показывают для других комбинаций ширины/высоты, DrawRectangle всегда расширяется на на один пиксель больше налево и нижняя часть (который является небольшим раздражением, например, при использовании ClientRectangle свойство для рисования кадра вокруг управления)

Мой первый решенный вопрос (как они ведут себя...) там все еще остается вторым: Почему они ведут себя этот путь?

14
задан MartinStettner 4 July 2010 в 17:20
поделиться

1 ответ

Прямоугольник в обоих методах Graphics в вашем вопросе ограничен (x, y) в вверху слева и (x + ширина - 1, y + высота - 1) в правом нижнем углу. Это следствие указания ширины и высоты, а не правой нижней точки.

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

Например, вы хотите заполнить прямоугольник от точки (5, 5) до точки (10, 20). Ширина прямоугольника равна 6, а не 5. Высота прямоугольника равна 16, а не 15.

1
ответ дан 1 December 2019 в 16:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: