Laden...

DrawString und Druckertreiber

Letzter Beitrag vor einem Jahr 5 Posts 744 Views
DrawString und Druckertreiber

Hallo zusammen,

ich bin hier gerade etwas am verzweifeln. Ich möchte gern 4 Stringzeilen an einer bestimmten Stelle auf einem A5 Blatt ausgeben. Nun muß ich feststellen, dass die DrawString Methode unter Windows 7 und Windows 10 unterschiedlich arbeitet.

es geht um folgende Codeabschnitte, zuerst die Werte mit denen ich arbeite

 ZertifikatInfos = new ZertPosInfos()
            {
                PosName = new Point(62, 59),
                SizeName = 77.5,
                PosMAC = new Point(104,86),
                SizeMAC=36,
                PosVersion = new Point(40,86),
                SizeVersion=36,
                Abmessung = new Point(148,210)
            };	

und hier werden die Daten zur Positionierung benutzt :

        /// <summary>
        /// rechnet die Millimeterangaben der Zertifikatparameter in 1/100stel Zoll um
        /// </summary>
        /// <param name="milimeters">Abmessungen in mm</param>
        /// <returns>Wert in 1/100 inch</returns>
        int toInch(double milimeters)
        { return Convert.ToInt32(milimeters / 0.2536585); }

        /// <summary>
        /// Formatiert die Seitengröße 
        /// </summary> void createPrintData()
        {
            // Papierabmessungen in mm umrechnen in 1/100 inch
            int inchWidth = toInch(config.ZertifikatInfos.Abmessung.X);
            int inchHeight = toInch(config.ZertifikatInfos.Abmessung.Y);

            zert_printDocument.DefaultPageSettings.PaperSize = new PaperSize("custom", inchWidth, inchHeight);
        }
        
        /// <summary>
        /// wird durch die Druckvorschau und Druckvorgang ausgetriggert. füllt die Seite mit den Werten
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="ev"></param>
        void zert_PrintPage(object sender, PrintPageEventArgs ev)
        {
            int startX;
            int startY;
            int FontHeigth;
            Pen p = new Pen(Brushes.Black, 2.5F);
            float leftMargin = ev.MarginBounds.Left;
            float topMargin = ev.MarginBounds.Top;
            StringFormat sf = new StringFormat() { LineAlignment = StringAlignment.Center, Alignment = StringAlignment.Center };
            Rectangle area;
            // Variablen zuordnen
            string name = comboBox_device.SelectedItem.ToString() + "\n" + maskedTextBox_SerNoKW.Text + label_ID.Text + maskedTextBox_serNoLFN.Text;
            string version = textBox_FW.Text;
            string mac = textBox_MAC.Text;

            // Texte schreiben
            #region Gerätename und SerNo
            printFont = new Font("Arial", 12);
            FontHeigth = Convert.ToInt32(printFont.GetHeight(ev.Graphics));
            startX = toInch(config.ZertifikatInfos.PosName.X);
            startY = toInch(config.ZertifikatInfos.PosName.Y) - 3 * FontHeigth;

            area = new Rectangle(startX, startY, toInch(config.ZertifikatInfos.SizeName), Convert.ToInt32(FontHeigth * 3));
            ev.Graphics.DrawString(name, printFont, Brushes.Black, area, sf);
            ev.Graphics.DrawRectangle(p,area);
            #endregion

            #region Versionsnummer 
            printFont = new Font("Arial", 10);
            FontHeigth = Convert.ToInt32(printFont.GetHeight(ev.Graphics));
            startX = toInch(config.ZertifikatInfos.PosVersion.X);
            startY = toInch(config.ZertifikatInfos.PosVersion.Y) - (FontHeigth + 4);


            area = new Rectangle(startX, startY, toInch(config.ZertifikatInfos.SizeVersion), FontHeigth + 4);
            ev.Graphics.DrawString("V " + version, printFont, Brushes.Black, area, sf);
            ev.Graphics.DrawRectangle(p, area);
            #endregion

            #region MAC Adresse
            if (mac.Length > 8)
            {
                startX = toInch(config.ZertifikatInfos.PosMAC.X);
                startY = toInch(config.ZertifikatInfos.PosMAC.Y) - (FontHeigth + 4);
                area = new Rectangle(startX, startY, toInch(config.ZertifikatInfos.SizeMAC), FontHeigth + 4);
                ev.Graphics.DrawString(mac, printFont, Brushes.Black, area, sf);
                ev.Graphics.DrawRectangle(p, area);
            }
            #endregion
        }

Komischerweise scheint die Routine, mit der ich die Papiergröße festlege, nicht zu funktionieren. In der Vorschau ist alles korrekt aber auf dem Papier ist dann am Ende alles falsch angeordnet. was übersehe ich hier ? (XPS Print W7/W10 im Anhang)

Wäre echt toll, wenn mir hier jemand helfen könnte.
Danke schonmal im Vorraus.

Hallo,

ich nehme an, du rufst createPrintData einmalig vor dem Drucken auf (auch wenn du die Methodensignatur hier auskommentiert hast)?

Hast du denn mal mit dem Debugger die PrintPageEventArgs.PageSettings sowie PrintPageEventArgs.PageBounds überprüft?

PS: Alle Ressourcen, wie z.B. Fontoder Pen-Objekte solltest du korrekt 'disposen' (d.h. per using-Anweisung) oder aber noch besser nur einmalig als Klassenmember anlegen (damit es nicht bei jeder Druckseite immer wieder erstellt und vom GC entfernt wird).

Hi, erstmal Danke für den Hinweis mit dem dispose, habe das mal umgebaut.

Während der weiteren Versuche ist mir aufgefallen, dass ich dem Drucker erst mitteilen muß welches Format ich nutze. Sprich, entweder den Drucker selber auswählen durch eine eigene Auswahlbox oder nach der "printdocument.showDialog" das papierformat und Parameter zuweisen.

Dann passen die Positionen deutlich besser, nachdem der Drucker ausgewählt wurde, wurde jedesmal das Papier wieder auf A4 gestellt und dann auf a5 gezoomt .. das ergab komische Druckergebnisse.

Allerdings sind jetzt die Druckbereiche immernoch ganz leicht verschoben (x/y+5mm).. da muß ich mal schauen wo das her kommt ..

Ja, die 4 Elemente sollen an in bestimmte Bereiche eines Formulars gedruckt werden. Das die Ränder mir hier dazwischengrätschen könnten, der Gedanke kam mir gestern auch.

Ich muß mir in der GUI  mal die Ränder anzeigen lassen, nachdem ich den Drucker ausgewählt habe. Die Werte scheinen ja auch davon abzuhängen welcher Drucker und welches Papier ausgewählt wurde. Werde das mal ausprobieren.

Danke nochmal für den Tip