почти каждый раз я использую 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
свойство для рисования кадра вокруг управления)
Мой первый решенный вопрос (как они ведут себя...) там все еще остается вторым: Почему они ведут себя этот путь?
Прямоугольник в обоих методах Graphics в вашем вопросе ограничен (x, y)
в вверху слева и (x + ширина - 1, y + высота - 1)
в правом нижнем углу. Это следствие указания ширины и высоты, а не правой нижней точки.
Когда вы вычисляете ширину и высоту по двум точкам, вы должны не забыть включить исходный пиксель, добавив 1 к разнице.
Например, вы хотите заполнить прямоугольник от точки (5, 5) до точки (10, 20). Ширина прямоугольника равна 6, а не 5. Высота прямоугольника равна 16, а не 15.