2009-08-21 5 views
3

J'ai besoin de créer un stylo qui dessine avec une largeur de 0,5 mm quelle que soit l'échelle de la matrice de transformation graphique. Voici ce que je suis en train de faire:Stylo sans échelle dans GDI +

Remarque: L'exemple de code est C++/CLI mais les réponses utilisant C# sont les bienvenues.

// 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); 

ne semble pas fonctionner à l'écran (96 dpi) ... me donne un pixel de large stylo. Sur l'imprimante PDF (600 dpi), il me donne un stylo bien plus épais qu'un demi-pouce.

Qu'est-ce que je fais mal? Quelle est la bonne façon de créer un stylo sans mise à l'échelle dans GDI?

+0

Le Tag C# droit isnt . Il ressemble à C++ – Jehof

+0

C'est C++/CLI ... mais les réponses C# sont les bienvenues. –

+0

Bump! Bumpity bumpity bump! –

Répondre

6

Le Pen lui-même possède un attribut Transform. Utilisez celui-ci avec l'inverse de votre échelle globale - Transformer sur l'objet graphique. Réglez la largeur du stylo à une constante de tout ce que vous voulez.

Il y a aussi un bug dans gdi + rendant les stylos de largeur < 1.5 ne pouvant pas être mis à l'échelle.

Bon lien: http://www.bobpowell.net/scalepens.htm

(Il y a également un attribut PageUnit sur l'objet graphique avec la capacité de changer entre les pixels, millimètres, etc. J'sais si cela pouvait aider)

+0

le lien est mort! –