Benutzer mit den meisten Antworten
Schon wieder Drucken

Frage
-
Hallo,
das Thema lässt mich nicht los.
Inzwischen haben ich grundsätzlich schon mal meinen Drucker zum Drucken gebracht und jetzt auch eine Vorlage zum Abschreiben gefungen, bei der Kopf- und Fuzeile gedruckt werden, Schriftfont und Schriftgröße übernommen werden und der Text so getrimmt wird, dass er die Seitenränder einhält. Grafiken schaffe ich noch nicht, kommt aber auch noch irgendwann ;-).Aktuell habe ich noch das Problem damit, dass die Schriftfarbe der Vorlage nicht übernommen wird weil ich fix Brushes.Black eingestellt habe.
Hier der Code:
Private Sub Druck(ByVal sender As Object, ByVal e As PrintPageEventArgs) _ Handles doc.PrintPage Try Dim ft As Font = Textfenster.Font Dim fc As Color = Textfenster.ForeColor Dim form As New StringFormat() Dim außen, innen As RectangleF Dim zeichen, zeilen As Integer 'umschreibendes Rechteck des Druckbereichs mit/ohne Kopfzeile außen = e.MarginBounds innen = RectangleF.Inflate(außen, 0, -2 * ft.GetHeight(e.Graphics)) 'Anzahl vollständig passender Druckzeilen ermitteln und Höhe anpassen Dim anzahlZeilen As Integer = innen.Height \ ft.GetHeight(e.Graphics) innen.Height = anzahlZeilen * Textfenster.Font.GetHeight(e.Graphics) 'Seite drucken (automatisch abgeschnitten durch form) If nummer >= von AndAlso zuDrucken.Length >= 0 Then 'zu langen Text hinter dem Wort anpassen/umbrechen form.Trimming = StringTrimming.Word e.Graphics.DrawString(zuDrucken, ft, Brushes.Black, innen, form) 'Dateiname in der Kopfzeile anzeigen form.Alignment = StringAlignment.Center e.Graphics.DrawString(Text, ft, Brushes.Black, außen, form) 'Seitennummer rechtsbündig in Fußzeile anzeigen form.Alignment = StringAlignment.Far e.Graphics.DrawString("S " & nummer, ft, Brushes.Black, außen, form) End If 'Gedruckten Text aus Drucktext nehmen; zeichen:zeilen: Größe der Seite form.Trimming = StringTrimming.Word e.Graphics.MeasureString(zuDrucken, ft, innen.Size, form, zeichen, zeilen) zuDrucken = zuDrucken.Substring(zeichen) nummer += 1 If nummer - 1 > von Then Druck(sender, e) Else e.HasMorePages = zuDrucken.Length > 0 AndAlso nummer <= bis End If Catch ex As Exception End Try
Eigentlich wollte ich an dieser Stelle das Gleiche machen wir mit ft
Dim fc As Color = Textfenster.ForeColor
Also einfach im Code anstelle Brushes.Blach eben fc eingeben. Da scheitere ich aber. Was mache ich verkehrt?
Antworten
-
Hallo Stefan,
da unter Windows gemalt wird, verwendet man einen Pinsel und nicht die Farbe direkt.
Deswegen muß einen zur Farbe passenden Pinsel erstellen:
Dim foreBrush As Brush = new SolidBrush(Textfenster.ForeColor)
und den jeweils an den Stellen einsetzen, wo Du derzeit Bruhes.Black stehen hast.
Am Ende solltest Du den Brush wieder freigeben:
foreBrush.Dispose()
Gruß Elmar- Als Antwort vorgeschlagen Robert Breitenhofer Dienstag, 6. April 2010 08:46
- Als Antwort markiert Giftzwockel Dienstag, 6. April 2010 09:15
-
Hallo Stefan,
der Fehler dürfte an Deinem rekursiven Aufruf am Ende liegen:If nummer - 1 > von Then Druck(sender, e) Else e.HasMorePages = zuDrucken.Length > 0 AndAlso nummer <= bis End If
Der wiederholte Aufruf von Druck ist dort vermutlich überflüssig.
Das PrintPage Ereignis wird solange aufgerufen, wie HasMorePages ein True zurückgibst.
Da der Code sehr nach dem Galileo Buch aussieht 16.7 Mehrseitiger Text
meckere ich mal darüber: Das ist da eher ungeschickt gelöst.Gruß Elmar
- Als Antwort markiert Giftzwockel Mittwoch, 7. April 2010 19:50
Alle Antworten
-
Hallo Stefan,
da unter Windows gemalt wird, verwendet man einen Pinsel und nicht die Farbe direkt.
Deswegen muß einen zur Farbe passenden Pinsel erstellen:
Dim foreBrush As Brush = new SolidBrush(Textfenster.ForeColor)
und den jeweils an den Stellen einsetzen, wo Du derzeit Bruhes.Black stehen hast.
Am Ende solltest Du den Brush wieder freigeben:
foreBrush.Dispose()
Gruß Elmar- Als Antwort vorgeschlagen Robert Breitenhofer Dienstag, 6. April 2010 08:46
- Als Antwort markiert Giftzwockel Dienstag, 6. April 2010 09:15
-
Hallo Elmar,
nun habe ich die Schriftfarbe mit entsprechend deiner Antwort eingebunden und das funktionitert auch.
Dafür bekomme ich nun beim Drucken mehrseitiger Dokumente die meldung.
Eine nicht behandelte Ausnahme des Typs "System.StackOverflowException" ist in Drucken mit Komfort.exe aufgetreten. Stellen Sie sicher, dass sich keine Endlosschleife ergibt. Das hat aber nichts mit dem neuen Code zu tun wie ich herausgefunden habe, denn wenn ich den Teil weglasse und mit dem alten Code mehrseitige Vorlagen drucken möchte, passiert dasselbe.
Gibt es da eine typische Fehlerquelle?
Liebe Grüße Stefan -
Hallo Stefan,
der Fehler dürfte an Deinem rekursiven Aufruf am Ende liegen:If nummer - 1 > von Then Druck(sender, e) Else e.HasMorePages = zuDrucken.Length > 0 AndAlso nummer <= bis End If
Der wiederholte Aufruf von Druck ist dort vermutlich überflüssig.
Das PrintPage Ereignis wird solange aufgerufen, wie HasMorePages ein True zurückgibst.
Da der Code sehr nach dem Galileo Buch aussieht 16.7 Mehrseitiger Text
meckere ich mal darüber: Das ist da eher ungeschickt gelöst.Gruß Elmar
- Als Antwort markiert Giftzwockel Mittwoch, 7. April 2010 19:50
-
Hallo Elmar,
erwischt. Genau aus diesem Buch habe ich den Text. Allerdings war ich nicht so clever und habe den online gesucht sonder abgetippt.
Aber dabei kann man ja auch was lernen.
Danek für deinen Hinweis, ich habe die If-Then-Schleife dahingehend ignoriert und nur die Zeile:e.HasMorePages = zuDrucken.Length > 0 AndAlso nummer <= bis
übrig gelassen und es geht. Nicht das ich wirklich alles verstehe was ich abgeschrieben habe, aber es geht.
Das ihr MVPs allerdings schon an einem Code die Quelle erkennt ... Kompliment.
Als nächstes versuche ich mich dann daran, auch noch Grafik ausdrucken zu können.
Liebe Grüße Stefan -
Hallo Stefan,
auf den Code bin ich durch reinen Zufall gestoßen,
als ich nach einem besseren Beispiel gesucht hatte.
Rekursiver Code stößt einem an solcher Stelle immer auf ;-)Ein Treffer dabei, der allerdings schon in die Jahre gekommen ist
und sich an DataTables orientiert: Printing Reports in Windows FormsGruß Elmar