Image.Picture.Assign(Meta) / MetaCanvas.Draw(x, y, Meta)

Please discuss general Delphi programming topics here.

Image.Picture.Assign(Meta) / MetaCanvas.Draw(x, y, Meta)

Postby norbert » May 19th, 2006, 10:40 pm

I'm once again struggeling with Delphi VCL:

When I load an EMF file with "Image.Picture.Assign(Metafile)" then everything is OK. Looking at the preview window, all Elements are properly scaled, text bewares it's scale - as wanted - independently from the meta scale, and text has the correct rotation.

When I "load" the same EMF with MetaCanvas.Draw(x, y, Meta) then texts are rotated by 180 deg and don't beware their scale independently from meta scale. I only remember a single japanese site where they handle this problem with a simple correction code I don't remember anymore.

The sample code below shows the syntax without text correction.
Sorry for not translating the comments to English.
The code preparates a print preview for metafiles (EMF). Paper dimensions and printable area are zoomable and at the same time the emf graphic is scalable inside the printable area. Moving and rotating of the emf graphic is left out here.


Code: Select all
procedure TImageForm.PreviewMetaFile(EMF: TMetaFile; Ratio: double; ScOfs: integer);
//Mit [pagX, pagY] wird die Größe des Blatts dargestellt.
//Mit [pixX, pixY] wird die Größe der druckbaren Fläche gestrichelt gezeichnet.
//Mit [ofsX, ofsY] gibt der Drucker den Abstand zum Blattrand links oben vor.
//Mit [ScOfs] wird der Abstand des Blatts von Image1 links und oben bestimmt.
//Mit [Ratio] erfolgt die Skalierung der Zeichnung in der druckbaren Fläche.
  ScaleX, ScaleY, Scale, TrackScale : single;
  Meta : tMetafile;
  MetaCanvas : TMetafileCanvas;
  //Blattrand und druckbare Fläche erzeugen
  Meta := TMetafile.Create;
      //Metafile erzeugen
      if Ratio = 0.0 then Ratio := 1.0;
      Meta.Width := pagX + ScOfs;
      Meta.Height := pagY + ScOfs;
      MetaCanvas := TMetafileCanvas.Create(Meta, Printer.Handle);
        //Fläche des Blatts
        MetaCanvas.Brush.Color := clWindow; //Hintergrundfarbe
        MetaCanvas.Rectangle(ScOfs, ScOfs, pagX + ScOfs, pagY + ScOfs);
        //Druckbare Fläche
        MetaCanvas.Pen.Style := psDot;
        MetaCanvas.Rectangle(ofsX + ScOfs, ofsY + ScOfs, ofsX + pixX + ScOfs, ofsY + pixY + ScOfs);
        MetaCanvas.Pen.Style := psSolid;
        //Die Metafile Zeichnung einfügen
        MetaCanvas.Draw(ofsX + ScOfs, ofsY + ScOfs, Meta); <----- FAIL
      //Blattgröße in [Zoll]
      Meta.Inch := 1;
      //Blattfläche in Image1 zoomen
      Meta.Width := Round(Meta.Width * Ratio);
      Meta.Height := Round(Meta.Height * Ratio);
      //Blattfläche als Hintergrund zu Image1 übertragen
      Image1.Picture.Assign(Meta); //  <------  OK

Folks, I forgot to tell You that the strange behavior of both functions are depending on changed current system font configuration. As soon as a new EMF was generated all fonts are shown and functionable as designed.
The behavior of fonts only changes after source code was edited, compiled and invoked.

Please replace:
"MetaCanvas.Draw(ofsX + ScOfs, ofsY + ScOfs, Meta);"
"MetaCanvas.Draw(ofsX + ScOfs, ofsY + ScOfs, EMF);"
as shown in the procedure declaration.


//invisible ninja mod@work
Active Member
Active Member
Posts: 17
Joined: May 13th, 2006, 8:49 am
Location: Germany

Return to Delphi Programming

Who is online

Users browsing this forum: No registered users and 2 guests