Impression avec gdi+

Résolu
vivelesquads Messages postés 23 Date d'inscription samedi 1 janvier 2005 Statut Membre Dernière intervention 11 juillet 2008 - 7 juil. 2008 à 10:45
vivelesquads Messages postés 23 Date d'inscription samedi 1 janvier 2005 Statut Membre Dernière intervention 11 juillet 2008 - 11 juil. 2008 à 09:38
Salut à tous,
Je réalise actuellement une application qui permet entre autre de dessiner des graphiques et surtout de les imprimer. Pour cela je vais devoir utiliser le gdi+. Donc je commence par des petits programmes de tests et là les problèmes surviennent tout de suite : l'affichage à l'écran (sur un TImage.canvas) est correct mais sur le Printer.Canvas le texte écrit avec le gdi+ n'est pas au bon endroit(les coordonnées x et y sont beaucoup trop grande !!
Pourquoi? Et comment faire faire pour écrire au bon endroit ?
Merci d'avance !


procedure TForm1.TestImprimeTexte(cv : TCanvas; chaine: string; x, y: integer);
var
  rectf : TGPRectF;
  graphics : TGPGraphics;
  solidBrush : TGPSolidBrush;
  fontFamily: TGPFontFamily;
  gpfont: TGPFont;
  origine : TpointD;
  stringFormat : TGPstringFormat;
  gpFontStyle : TFontStyle;
  gpUnit : TUnit;
  cvTest : TCanvas;


begin
  cvTest := cv;
  cv.font.color := clRed;
  cv.font.size := 12;
  cv.brush.style := bsClear;
  origine := PointD(0,0);


  graphics := TGPGraphics.Create(cv.Handle);


  solidBrush:= TGPSolidBrush.Create(ColorToARGB(cv.font.color));


  fontFamily:= TGPFontFamily.Create('Arial');


  //Style de la font
  gpFontStyle := FontStyleRegular;
  gpUnit := UnitPixel;


  gpfont:= TGPFont.Create(fontFamily, cv.font.size, gpFontStyle , gpUnit);
  stringFormat := TGPstringFormat.create;


  rectf.x := x;
  rectf.y := y;


 graphics.DrawString(chaine, -1, gpFont, MakePoint(rectf.X, rectf.y), stringFormat,  solidBrush);
  cv.textOut(Round(rectf.X), Round(rectf.Y), chaine);


  graphics.Free;
  solidBrush.Free;
  fontFamily.Free;
  gpfont.Free;
end;


 

4 réponses

vivelesquads Messages postés 23 Date d'inscription samedi 1 janvier 2005 Statut Membre Dernière intervention 11 juillet 2008
11 juil. 2008 à 09:38
Salut fOxi, c'est bien ce que tu disais.
En fait il faut faire

graphics := TGPGraphics.Create(cv.Handle);
graphics.setPageUnit(UnitPixel);

Cela permet d'imprimer dans les même condition que le GDI. Car le GDI+ est de base indépendant de la résolution alors que le GDI ne l'est pas
3
Oniria Messages postés 292 Date d'inscription dimanche 14 mars 2004 Statut Membre Dernière intervention 18 décembre 2014 3
7 juil. 2008 à 18:54
Bonjour,

Je pense que tu as oublié que l'imprimante n'a pas la même résolution que ton TImage. Je pense qu'il faut que tu fasses des formules de mise à l'échelle pour adapter le CANVAS de l'image et celui de TPrinter.

Oniria
0
vivelesquads Messages postés 23 Date d'inscription samedi 1 janvier 2005 Statut Membre Dernière intervention 11 juillet 2008
8 juil. 2008 à 09:07
Salut et merci d'avoir pris le temps de me répondre,
Effectivement il doit y avoir un problème de résolution. Mais pourquoi l'impression par le le gdi (cv.textOut) est OK alors que celle par le gdi+ (graphics.DrawString) est totalement décalée?
JB
0
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
8 juil. 2008 à 12:42
tu doit definir les parametres du contexte de dessin via le GPGraphics il me semble, dpi, echelle, mesure, unité etc...

<hr size="2" width="100%" />
0
Rejoignez-nous