Jak przekazać dane do drukarki

0

Mam taką procedurkę:

procedure TForm1.PaintScene(aCanvas: TCanvas; SceneRect: TRect);
  procedure PaintText(X, Y: Integer; color: TColor; tekst: String; textcolor: TColor);
  begin
    with aCanvas do
    begin
      Font.Name := 'Arial';
      Font.Size := Round(10 / FZoomFactor);
      Pen.Color := color;
      Brush.Color := color;
      Font.Color := textcolor;
      Brush.Style := bsSolid;
      TextOut(X, Y, tekst);
    end;
  end;
var
  resX, resY: Integer;  // device resolution
begin
  resX := GetDeviceCaps(aCanvas.Handle, LOGPIXELSX);
  resY := GetDeviceCaps(aCanvas.Handle, LOGPIXELSY);
  SetMapMode(aCanvas.Handle, MM_TEXT);

  SetViewportExtEx(aCanvas.Handle, resX, resY, nil);
  SetWindowExtEx(aCanvas.Handle, Round(100 * FZoomFactor), Round(100 * FZoomFactor), nil);

  SetWindowOrgEx(aCanvas.Handle, FOffset.X, FOffset.Y, nil);

  SetViewportOrgEx(aCanvas.Handle, SceneRect.Left, SceneRect.Top, nil);
  //rysowanie
  with aCanvas do
  begin
    PaintText(39, 39, clWhite, 'X:39 - Y:39', clBlack);
    PaintText(100, 100, clWhite, 'X:100 - Y:100', clBlack);
  end;
end;

i Teraz wywołuję ją dwa razy:

raz, dla rysowania po PaintBox'ie:

PaintScene(Paintbox.Canvas, Rect(PaintBox.Left, PaintBox.Top, PaintBox.Width, PaintBox.Height));

dwa, dla przesłania jej do drukarki:

PaintScene(Printer.Canvas, Rect(PaintBox.Left, PaintBox.Top, PaintBox.Width, PaintBox.Height));

Obraz na monitorze nie zgadza się z wydrukiem, co w tej procedurce jest nie tak?
Rozmieszczenie obiektów canvasa inaczej wygląda na papierze i na monitorze

0

Obraz na monitorze nie zgadza się z wydrukiem

fajnie, ale może byś sprecyzował :/

BTW wpadłęś na to, że DPI drukarki i monitora są różne

0

Oczywiście DPI.

Tylko jak to przełożyć na kod?

Wydruki nie zgadzają się:
różni się np.: umieszczaniem tekstu w innych miejscach niż podgląd czyli
punkty X, Y na papierze umieszczane są w innych miejscach,
wielkość tekstu jest większa niż na monitorze.

Jeżeli dam zamiast:
SetWindowExtEx(aCanvas.Handle, Round(100 * FZoomFactor), Round(100 * FZoomFactor), nil);
to:

SetWindowExtEx(aCanvas.Handle, Round(600* FZoomFactor), Round(600* FZoomFactor), nil);
wydruk jest zbliżony ale ja bym chciał mieć to idealnie to co na monitorze to też na papierze.
0
  1. olej wszystkie Set itd
  2. pozycjonuj nie wg pixeli tylko np. mm
  3. poczytaj te dwa wątki - powinno Ci się rozjaśnić http://4programmers.net/Forum/viewtopic.php?id=82033 http://4programmers.net/Forum/viewtopic.php?id=58745
0

Dzieki wielkie.
Bardzo mi to rozjaśniło sprawę.

jeszcze raz dzięki.

Pozdrawiam serdecznie

1 użytkowników online, w tym zalogowanych: 0, gości: 1