2009-08-21 13 views
3

グラフィックス変換マトリックスのスケールに関係なく0.5mmの幅で描くペンを作成する必要があります。GDI +の非スケーリングペン

参考:サンプルコードは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で非スケーリングペンを作成する正しい方法は何ですか?

+0

右isn'tタグのC# 。それはC++のように見えます – Jehof

+0

これはC++/CLIですが、C#の回答は大歓迎です。 –

+0

バンプ!凹凸の凹凸バンプ! –

答えて

6

Pen自体にTransform属性があります。グローバルスケールの逆を使って、グラフィックスオブジェクトのTransformを使用してください。ペンの幅を任意の定数に設定します。

また、gdi +の幅が<のペンを作成する際に、スケーリングできないバグがあります。

グッドリンク:http://www.bobpowell.net/scalepens.htm

(また、グラフィックスのPageUnit属性があることが役立つことができれば知らんなどピクセル、ミリメートル、間を変更する機能を持つオブジェクト)

+0

リンクが死んでいます! –

関連する問題