Хотите глупое решение? Здесь вы получите глупое решение. По крайней мере, это всего лишь одна строка кода. И вызывает небольшой, но игнорируемый побочный эффект.
Успение
При рисовании сплошных прямоугольных прямоугольников GDI + стремится ускорить процесс, рисуя их более быстрым способом, чем другие объекты. Эта техника называется битблитингом. Это на самом деле довольно умно, так как это самый быстрый способ рисовать прямоугольники на поверхности. Однако нарисованные прямоугольники должны соответствовать правилу прямоугольности.
Эта умная оптимизация была сделана до того, как появились DWM, Aero, Glass и все новые модные вещи.
Внутренне, битовое копирование просто копирует данные цвета RGBA пикселей из одной области памяти в другую (так сказать, из вашего рисунка в окне). К сожалению, формат RGB, который он пишет, несовместим со стеклянными областями, что приводит к странным эффектам прозрачности, которые вы наблюдали.
Решение
Итак, вот поворот.
GDI + может уважать матрицу преобразования, с которой каждый чертеж может быть масштабирован, перекошен, повернут или как угодно. Если мы применяем такую матрицу, правило, что прямоугольники больше расположены под прямым углом, больше не гарантируется. Таким образом, GDI + прекратит разбивать эти биты и нарисует их подобно эллипсам.
Но мы также не хотим искажать, масштабировать или поворачивать наш рисунок. Мы просто применяем наименьшее возможное преобразование: мы создаем матрицу преобразования, которая перемещает каждый рисунок на один пиксель вниз:
// If you don't get that matrix instance, ignore it, it's just boring math
e.Graphics.Transform = new Matrix(1f, 0.001f, 0f, 1f, 0f, 0f);
Теперь битбитинг отключен, прямоугольники сплошные, фиалки синие. Если бы был простой способ контролировать это, особенно если не перемещать чертежи!
Таким образом, если вы хотите нарисовать в первой строке пикселей, используйте -1 в качестве координаты Y.
Вы можете решить, действительно ли это решение для вас, или просто проигнорировать его.