Эти методы работают правильно, вы просто должны учитывать эффекты сглаживания и округления .
Сначала включите сглаживание, чтобы увидеть все (не только округленный результат):
graphics.SmoothingMode = SmoothingMode.AntiAlias;
Теперь FillRectangle (10,10,10,10) даст размытый результат, а DrawRectangle (10,10,10,10) будет резким.
Результат размытия означает, что у вас есть координаты пикселей вне сетки . Если вам нужно позвонить:
graphics.FillRectangle(9.5f, 9.5f, 10, 10);
для выравнивания верхнего левого угла прямоугольника на сетке.
DrawRectangle острый, потому что он использует перо шириной 1,0. Таким образом, линия начинается в центре пикселя и идет на 0,5 пикселя в обоих направлениях, заполняя ровно 1 пиксель.
Обратите внимание, что ширина и высота вычисляются следующим образом:
width = (right - left) = 19.5 - 9.5 = 10
height = (bottom - top) = ...
Обратите внимание, что 19.5 - это правильная / нижняя координата прямоугольника, также выровненного по сетке, и результатом является целое число.
Вы можете использовать другую формулу:
width2 = (right - left + 1)
Но это относится только к округленным координатам , так как наименьшая единица равна 1 пикселю. При работе с GDI +, использующим сглаживание, следует учитывать тот факт, что точка имеет нулевой размер и находится в центре пикселя (это не весь пиксель).