Рис. 20.3. Визуализация в пиксельных единицах
Выбор альтернативной единицы измерения
Если вы не хотите выполнять визуализацию изображений с использованием пиксельных единиц измерения, вы имеете возможность изменить эту принятую по умолчанию установку с помощью свойства PageUnit объекта Graphics. Свойству PageUnit можно присвоить любое значение из перечня GraphicsUnit.
public enum GraphicsUnit {
// Мировые координаты.
World,
// Пиксель для видеодисплея и 1/100 дюйма для принтера.
Display,
// Пиксель.
Pixel,
// Стандартная точка принтера (1/72 дюйма).
Point,
// Дюйм.
Inch,
// Стандартная единица документа (1/300 дюйма).
Document,
// Миллиметр.
Millimeter
}
Чтобы проверить, как изменяется базовая единица измерения, модифицируйте имеющийся программный код так, как предлагается ниже.
private void MainForm_Paint(object sender, PaintEventArgs e) {
// Отображение прямоугольника а дюймах, а не в пикселях…
Graphics g = e.Graphics;
g.PageUnit = GraphicsUnit.Inch;
g.DrawRectangle(new Pen(Color.Red, 5), 0, 0, 100, 100);
}
Вы должны увидеть совершенно другой прямоугольник, как показано на рис. 20.4.
Рис. 20.4. Визуализация в дюймах
Причина того, что здесь более 90% области клиента формы занято темным (красным) цветом, заключается в указании пера "шириной" в 5 дюймов! Сам прямоугольник теперь имеет размеры 100x100 дюймов, и тот маленький светлый прямоугольник, который вы видите на рисунке в правом нижнем углу, является левым верхним углом большого внутреннего прямоугольника.
Изменение начала координат
Напомним, что при использовании координат и единиц измерения, предлагаемых по умолчанию, точка (0, 0) находится в левом верхнем углу соответствующей области. Часто это и является именно тем, что требуется, но что делать, если вам нужно поменять точку, относительно которой выполняется визуализация? Предположим, например, что ваше приложение всегда должно (по какой-то причине) оставлять пустой полосу шириной в 100 пикселей вдоль границы области клиента формы. Тогда вы должны гарантировать, чтобы все операции GDI+ выполнялись в соответствующих пределах внутренней области,
Один из подходов, который можно при этом использовать, заключается в добавлении смещения вручную. Конечно, утомительно добавлять значения смещениях каждой операции визуализации. Значительно удобнее (и проще) было бы использовать свойство, которое, по сути, говорило бы следующее: "Хотя я даю указание отобразить прямоугольник с началом координат в точке (0, 0), вы должны использовать для начала координат точку (100, 100)". Это должно сильно "упростить вам жизнь", поскольку вы сможете указать параметры размещения без модификаций,
В рамках GDI+ вы можете указать точку начала координат, установив значение трансформации с помощью метода TranslateTransform (класса Graphics), позволяющего указать страничные координаты, которые будут применяться к вашим оригинальным мировым координатам, например:
void MainForm_Paint(object sender, PaintEventArgs e) {
Graphics g = e.Graphics;
// Установка смещения (100, 100) для страничных координат.
g.TranslateTransform(100, 100);
// Значениями мировых координат остаются (0, 0, 100, 100),
// но приборные координаты теперь равны (100, 100, 200, 200).
g.DrawRectangle(new Pen(Color.Red, 5), 0, 0, 100, 100);
}
Здесь вы устанавливаете для мировых координат значения (0, 0, 100, 100). Однако для страничных координат вы указали смещение (100, 100). Поэтому для приборных координат будут использоваться значений (100, 100, 200, 200). Таким образам, хотя вызов DrawRectangle выглядит так, как будто вы размещаете прямоугольник в левом верхнем углу формы, результат будет выглядеть так, как показано на рис. 20.5.
Рис. 20.5. Результат применения смещения страницы
Чтобы вы имели возможность поэкспериментировать с некоторыми способами изменения координатной системы GDI+, в файле с исходным текстом примеров этой книги (для его загрузки посетите раздел загрузки Web-узла Apress, размещенного по адресу www.aprеss.com) есть пример приложения с именем CoorSystem. В этом приложении с помощью двух меню вы можете менять начало координат и единицу намерения (рис. 20.6).