Не масштабируемое перо в GDI + - PullRequest
3 голосов
/ 21 августа 2009

Мне нужно создать ручку, которая рисует шириной 0,5 мм независимо от масштаба матрицы преобразования графики. Вот что я делаю:

Примечание: Пример кода - C ++ / CLI, но ответы с использованием C # приветствуются.

// assume that g is a Graphics object
int dpi = g->DpiX;
float dotsPerHalfInch = dpi * 0.5;

// to extract scale factor from the transformation matrix...
// create two points distant one unit apart...
array<PointF> ^points = gcnew array<PointF>{
    PointF(0.0f, 0.0f), PointF(1.0f, 0.0f)
};

// transform them...
g->Transform->TransformPoints(points);

// get distance after transformation...
float dX = points[1].X - points[0].X;
float dY = points[1].Y - points[0].Y;
float distance = Math::Sqrt(dX * dX + dY * dY);

// reverse the effects of any scale factor in graphics transform
float penWidth = dotsPerHalfInch / distance;

Pen ^halfInchPen = gcnew Pen(Color::Black, penWidth);

Кажется, не работает на экране (96 точек на дюйм) ... дает мне перо шириной в пиксель. На PDF-принтере (600 точек на дюйм) перо намного толще, чем полдюйма.

Что я делаю не так? Как правильно создать немасштабирующее перо в GDI?

1 Ответ

6 голосов
/ 23 июня 2011

Само перо имеет атрибут Transform. Используйте это с инверсией вашего глобального масштабного преобразования для графического объекта. Установите ширину пера на постоянную величину, какую хотите.

Также в gdi + есть ошибка, из-за которой ручки шириной <1,5 не могли масштабироваться. </p>

Хорошая ссылка: http://www.bobpowell.net/scalepens.htm

(также имеется атрибут PageUnit на графическом объекте с возможностью переключения между пикселями, миллиметрами и т. Д. Не знаю, если это может помочь)

...