GDI +中的非缩放笔

时间:2009-08-21 06:31:15

标签: c# .net gdi+ pen

无论图形变换矩阵的比例如何,我都需要创建一个宽度为0.5 mm的笔。这就是我在做的事情:

注意: 示例代码是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 dpi)...给我一个像素宽的笔。在PDF打印机(600 dpi)上,它给了我一支比半英寸厚得多的笔。

我做错了什么?在GDI中创建非缩放笔的正确方法是什么?

1 个答案:

答案 0 :(得分:6)

笔本身具有Transform属性。在图形对象上使用与全局比例相反的变换。将笔的宽度设置为您想要的任何值。

gdi +还有一个错误,使得宽度<1.5的笔无法缩放。

良好的链接:http://www.bobpowell.net/scalepens.htm

(此外,图形对象上还有一个PageUnit属性,可以在像素,毫米等之间进行更改。如果可以帮助的话,还可以使用Dunno)