Наконец, есть приборные координаты (координаты устройства). Приборные координаты представляют результат применения страничных координат к оригинальным мировым координатам. Эта координатная система используется для определения того, где именно будет показан соответствующий тип GDI+. При программировании с помощью средств GDI+ программист обычно мыслит в терминах мировых координат, которые являются базой для определения размеров и места размещения типа GDI+. Для визуализации в мировых координатах не требуется никаких специальных программных ухищрений – нужно просто передать значения измерений текущей операции визуализации,
void MainForm_Paint(object sender, PaintEventArgs s) {
// Визуализация прямоугольника в мировых координатах.
i.Graphics g = е.Graphics;
g.DrawRectangle(Pens.Black, 10, 10, 100, 100);
}
"За кулисами" ваши мировые координаты автоматически отображаются в координаты страницы, которые затем отображаются в приборные координаты. Во многих случаях вы вообще не будете использовать координаты страницы и приборные координаты непосредственно, если только не захотите применить определенные графические трансформации. Поскольку в предыдущем программном коде не используется никакой программной логики трансформаций, мировые, страничные и приборные координаты оказываются идентичными.
Если перед визуализацией своей программной логики GDI+ вы хотите применить какие-то преобразования, вы должны использовать подходящие члены типа Graphics (например, метод TranslateTransform()), чтобы перед тем, как выполнить визуализацию, указать "страничные координаты" в существующей системе мировых координат. В результате устанавливаются приборные координаты, которые будут использоваться при выводе типа GDI+ на соответствующее устройство.
private void MainForm_Paint(object sender, PaintEventArgs e) {
// Указание смещения (10 * 10) для страничных координат.
Graphics g = е.Graphics;
g.TranslateTransform(10, 10);
g.DrawRectangle(10, 10, 100, 100);
}
В данном случае при отображении прямоугольника его левый верхний угол фактически будет помещен в точку (20, 20), поскольку к мировой системе координат будет добавлено смещение в результате вызова TranslateTransform().
Единица измерения, предлагаемая по умолчанию
В GDI+ единицей измерения по умолчанию является пиксель. Начало координат размещается в левом верхнем углу с увеличением оси абсцисс вправо, а оси ординат – вниз (рис. 20.2).
Рис. 20.2. Система координат GDI+, предлагаемая по умолчанию
Поэтому, если вы отобразите Rectangle с использованием пера толщиной в 5 пикселей и красного цвета, как показано ниже.
void MainForm_Paint (object sender, PaintEventArgs e) {
// Установка мировых координат с использованием единиц измерения,
// предлагаемых по умолчанию.
Graphics g = е.Graphics;
g.DrawRectangle(newPen(Color.Red, 5), 10, 10, 100, 100);
}
вы должны увидеть квадрат, смещенный на 10 пикселей вниз и вправо относительно верхнего и левого края клиентской области формы, как показано на рис. 20.3.
Рис. 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;
Читать дальше