Autor Beitrag
JoelH
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 806
Erhaltene Danke: 17

Win10
Delphi Alexandria 11.2 Patch 1
BeitragVerfasst: Sa 10.05.03 13:26 
ich hab zwei Canvas Objekte, einmal eine aufem Bildschirm die mir eine Druckvorschau gibt und dann die eigentliche Druckausgabe. Leider verhält sich die Schrift beim Ausdrucken nicht so wie ich will Bzw. so wie es sein sollte. Vielleicht hab ich auch einen Denkfehler. Hier die procedure

ausblenden volle Höhe Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
    procedure TForm2.DruckeCanvasNeu();
    var
    outdc : HDC; { PrinterCanvasHandle }
    bx,by,ex,ey : integer; { Eckkoordinaten }
    ibx,iby, iex,iey : integer; { Innereeckkoordinaten }
    ycmpp, xcmpp : Real; { Pixel to cm }
    hres,vres,hsiz,vsiz : integer; { Canvasdimensionen }
    faktor : integer; { Verkleinerungsfaktor }
    gesamtbreite : integer; { alles im mm }
    gesamthoehe : integer;
    innenbreite : integer;
    innenhoehe : integer;
    textbreite : integer;
    textbeginx : integer;
    zeile1,zeile2 : integer;

    begin
    Printer.BeginDoc;
    //SpinEdit1.Value := Main.aktuelleschriftgroesse;
    faktor := 1;
    gesamtbreite := Main.aktuell.t_o_r+Main.aktuell.t_o_l;
    gesamthoehe := Main.aktuell.t_o_o+Main.aktuell.t_o_u;
    innenbreite := Main.aktuell.t_o_r-Main.aktuell.t_o_l;
    innenhoehe := Main.aktuell.t_o_u-Main.aktuell.t_o_o;
    outdc := Printer.Canvas.handle;
    hres := GetDeviceCaps(outdc,HORZRES); {display width in pixels}
    vres := GetDeviceCaps(outdc,VERTRES); {display height in pixels}
    hsiz := GetDeviceCaps(outdc,HORZSIZE); {display width in mm}
    vsiz := GetDeviceCaps(outdc,VERTSIZE); {display height in mm}
    xcmpp := hsiz/hres*0.1;
    ycmpp := vsiz/vres*0.1;
    // Caption:='100 pixels are '+FloatToStr(xcmpp*100)+' cm wide and '+FloatToStr(ycmpp*100)+' cm high';
    Printer.canvas.font.size := round(Main.aktuelleschriftgroesse/faktor);
    Printer.canvas.font.name := 'Arial';
    bx := round((Width -((((gesamtbreite/10)/(xcmpp*100))*100)/faktor))/2);
    by := 0;
    ex := bx + round(((((gesamtbreite/10)/(xcmpp*100))*100)/faktor));
    ey := by + round(((((gesamthoehe/10)/(ycmpp*100))*100)/faktor));
    ibx := bx + round(((((Main.aktuell.t_o_l/10)/(xcmpp*100))*100)/faktor));
    iex := ibx + round(((((innenbreite/10)/(xcmpp*100))*100)/faktor));
    iby := by + round(((((Main.aktuell.t_o_o/10)/(ycmpp*100))*100)/faktor));
    iey := iby + round(((((innenhoehe/10)/(ycmpp*100))*100)/faktor));
    Rectangle(outdc,bx,by,ex,ey);
    Rectangle(outdc,ibx,iby,iex,iey);
    textbreite := Printer.canvas.TextWidth(Main.Form1.Edit1.Text);
    textbeginx := round((Printer.PageWidth-textbreite)/2);
    if (Main.Form1.RadioButton1.Checked) then begin
    zeile1 := (iby-by)+ round(((iey-iby)-Printer.canvas.font.size)/2);
    Caption := IntToStr(zeile1); Printer.canvas.TextOut(textbeginx,zeile1,Main.Form1.Edit1.Text);
    end else begin
    zeile1 := round((iby-by)+(((iey-iby)-((2*Printer.canvas.font.size)+(10/faktor)))/2));
    Printer.canvas.TextOut(textbeginx,zeile1,Main.Form1.Edit1.Text);
    textbreite := Printer.canvas.TextWidth(Main.Form1.Edit2.Text);
    textbeginx := round((Printer.PageWidth-textbreite)/2);
    zeile2 := round(zeile1 + Printer.canvas.font.size + (10/faktor));
    Printer.canvas.TextOut(textbeginx,zeile2,Main.Form1.Edit2.Text);
    end;
    { OLD // zeile1 := round((iey-by)/2);
    zeile1 := (iby-by)+ round(((iey-iby)- Printer.canvas.font.size)/2);
    Printer.canvas.TextOut(textbeginx,zeile1,Main.Form1.Edit1.Text);
    if (Main.Form1.RadioButton2.checked) then begin
    textbreite := Printer.canvas.TextWidth(Main.Form1.Edit2.Text);
    textbeginx := round((Printer.PageWidth-textbreite)/2);
    zeile2 := round(zeile1 + Printer.canvas.font.Size + (10/faktor)); Printer.canvas.TextOut(textbeginx,zeile2,Main.Form1.Edit2.Text);
    end; }
    Printer.EndDoc;
    end;

bx,by ist der linkeobere Rand ex,ey der untererechte. Die innenboy ist ibx,iby, iex,iey. In dieser Innenbox wird dann der Text reingedruckt. Aber leider ist er nicht Zentriert in der innenBox sondern nach unten verschoben Wenn ich allerdings diese Procedure auf dem Bildschirm benutze, also ohne Printer Zusatz beim Canvas Objekt verhält es sich richtig Liegt es vielleicht am font.size ? Da ich ja mit Pixeln rechne ? Aber mit font.height wird die Sache nur noch schlimmer oder hab ich einen Rechenfehler drin ?

_________________
mfg. Joel