| |
VB.NET - FortgeschritteneAllgemeiner Fehler in GDI+ (MeasureString / Windows 10) | | | Autor: Bringtnix | Datum: 07.05.16 11:10 |
| Hallo,
beim Drucken aus meiner Anwendung unter Windows 10 kommt es zu folgendem Fehler:
Allgemeiner Fehler in GDI+.
bei System.Drawing.Graphics.MeasureString(String text, Font font, SizeF layoutArea, StringFormat stringFormat, Int32& charactersFitted, Int32& linesFilled)
bei WindowsApplication1.Form1.pdoc_PrintPage(Object sender, PrintPageEventArgs e)
Unter Windows XP und 7 funktioniert das problemlos. Hat jemand eine Idee woran das liegt?
Hier der Code:
Imports System.Drawing.Printing
Public Class Form1
Friend PrintDocument1 As New PrintDocument
Friend PrintPreviewDialog1 As New PrintPreviewDialog
Public Sub New()
' Dieser Aufruf ist für den Designer erforderlich.
InitializeComponent()
' Fügen Sie Initialisierungen nach dem InitializeComponent()-Aufruf
' hinzu.
AddHandler PrintDocument1.PrintPage, AddressOf pdoc_PrintPage
End Sub
Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) _
Handles MyBase.Load
SeitenEinrichtungLaden()
End Sub
Private Sub SeitenEinrichtungLaden()
PrintDocument1.DefaultPageSettings.PaperSize.Height = CInt(210 / 0.254)
PrintDocument1.DefaultPageSettings.PaperSize.Width = CInt(297 / 0.254)
PrintDocument1.DefaultPageSettings.Margins.Left = CInt(18 / 0.254)
PrintDocument1.DefaultPageSettings.Margins.Top = CInt(18 / 0.254)
PrintDocument1.DefaultPageSettings.Margins.Right = CInt(18 / 0.254)
PrintDocument1.DefaultPageSettings.Margins.Bottom = CInt(18 / 0.254)
PrintDocument1.DefaultPageSettings.Landscape = True
End Sub
Private Sub cmdVorschau_Click(sender As System.Object, e As _
System.EventArgs) Handles cmdVorschau.Click
PrintPreviewDialog1.Document = PrintDocument1
PrintPreviewDialog1.WindowState = FormWindowState.Maximized
PrintPreviewDialog1.ShowDialog()
End Sub
Private Sub pdoc_PrintPage(ByVal sender As Object, ByVal e As _
System.Drawing.Printing.PrintPageEventArgs) 'Handler wird in New erstellt
Try
Dim intPrintAreaHeight, intPrintAreaWidth, marginLeft, marginTop, _
intCharsFitted, intLinesFilled As Int32
With PrintDocument1.DefaultPageSettings
' Lokale Variablen initialisieren, die die Begrenzungen des
' Druckbereichrechtecks enthalten.
intPrintAreaHeight = .PaperSize.Height - .Margins.Top - _
.Margins.Bottom
intPrintAreaWidth = .PaperSize.Width - .Margins.Left - _
.Margins.Right
' Lokale Variablen initialisieren, die die Randwerte enthalten,
' die als X- und Y-Koordinaten für die oberen linke Ecke des
' Druckbereichrechtecks verwendet werden.
marginLeft = .Margins.Left ' X-Koordinate
marginTop = .Margins.Top ' Y-Koordinate
End With
Dim rectPrintingArea As New RectangleF(marginLeft, marginTop, _
intPrintAreaWidth, intPrintAreaHeight)
Dim fntBody As New Font("Arial", 10, FontStyle.Regular)
Dim fmt As New StringFormat(StringFormatFlags.LineLimit)
Dim strDruck As New String(ChrW(65), 40000)
' "MeasureString" aufrufen, um die Anzahl von Zeichen zu ermitteln,
' die das Druckbereichrechteck aufnehmen kann.
e.Graphics.MeasureString(strDruck, fntBody, New SizeF( _
intPrintAreaWidth, intPrintAreaHeight), fmt, intCharsFitted, _
intLinesFilled)
MsgBox(intCharsFitted.ToString & " - " & intLinesFilled.ToString)
' Text an die Seite ausgeben.
e.Graphics.DrawString(strDruck.Substring(0, intCharsFitted), _
fntBody, Brushes.Black, rectPrintingArea, fmt)
e.HasMorePages = False
Catch ex As Exception
Dim st = New StackTrace(ex, True) : MsgBox(ex.Message & vbCrLf & _
st.ToString)
End Try
End Sub
End Class Danke schon mal für die Hilfe!
Carsten
------------
Alle Menschen sind klug. Die einen vorher, die anderen nachher. (Voltaire)
| |
Re: Allgemeiner Fehler in GDI+ (MeasureString / Windows 10) | | | Autor: Manfred X | Datum: 07.05.16 14:05 |
| Hallo!
GDI+ ist eine "alte" Bibliothek, die nicht jede x-beliebige
Konstellation von "theoretisch" möglichen Funktions-Parametern
verarbeiten kann.
Schau Dir deshalb mal die Werte an, die Du übergibst.
Die "MeasureString"-Methode soll benutzt werden, um den Raum-Bedarf
für einen tatsächlich zu druckenden Text zu ermitteln, aber nicht
um eine hypothetisch mögliche Zeichenmenge (ohne Umbruch o.ä.)
zu berechnen. | |
Re: Allgemeiner Fehler in GDI+ (MeasureString / Windows 10) | | | Autor: Bringtnix | Datum: 07.05.16 15:25 |
| In der ursprünglichen Anwendung mache ich auch genau das. Um andere Ursachen auszuschließen, habe ich den relevanten Code in ein neues Projekt eingefügt und einfach einen String mit "A" gefüllt.
Was gibt es denn für "moderne" Möglichkeiten zu ermitteln wie viele Zeichen und Zeilen in einem bestimmten Bereich gedruckt werden können?
------------
Alle Menschen sind klug. Die einen vorher, die anderen nachher. (Voltaire)
| |
Re: Allgemeiner Fehler in GDI+ (MeasureString / Windows 10) | | | Autor: Manfred X | Datum: 07.05.16 15:44 |
| Das hat nichts mit "modern" zu tun. Dein Gedanke ist verkehrt.
Es kann nicht "abstrakt" quantitativ ermittelt werden,
wie viele Zeichen in einen Paint-Bereich passen.
Du mußt Dich auf den konkreten Content beziehen, der ausgegeben
werden soll (Daten-Formatierung, Zeilen-Umbrüche, Wort-Trennung,
Font-Eigenarten usw.).
Du kannst den Text zeilenweise aufbereiten und für jede
Zeile sukzewssive ermitteln, wie viel Raum sie benötigt (Size).
Beispiel
Du kannst auch den Text in einzelne Abschnitte/Sätze o.ä. gliedern
und in einer Schleife ermitteln (Measurestring, Abschnitt hinzufügen),
wie viele dieser Text-Teile jeweils auf eine Seite passen, bis die
verfügbare Seiten-Höhe überschritten ist.
Oder Du nutzt MS-Word (Automatisierung) oder eine andere Textbibliothek,
um den Ausdruck durchführen zu lassen.
Bei mir liefert der Code übrigens keinen Fehler.
Hast Du PaperSize auf benutzerdefiniert gestellt?
PrintDocument1.DefaultPageSettings.PaperSize = New PaperSize("Custom", width, _
height)
Beitrag wurde zuletzt am 07.05.16 um 16:10:14 editiert. | |
Re: Allgemeiner Fehler in GDI+ (MeasureString / Windows 10) | | | Autor: Manfred X | Datum: 07.05.16 18:34 |
| Prinzipiell ist das Problem bei GDI+, daß die
in Net verfügbaren Methoden und Einstellungen
nicht bei jedem Device-Kontext auch vollständig
(=alle Parameter-Konstellationen) funktionieren.
Es könnte also auch am Druckertreiber liegen. | |
Re: Allgemeiner Fehler in GDI+ (MeasureString / Windows 10) | | | Autor: Bringtnix | Datum: 29.05.16 16:21 |
| Das Problem ist gelöst.
Die einzige Änderung ist die Zeile:
Dim strTest As New String(Chr(65), 20000) die vorher so aussah:
Dim strTest As New String(ChrW(65), 40000) Vielen Dank an Manfred und alle die sich sonst noch Gedanken dazu gemacht haben!
------------
Alle Menschen sind klug. Die einen vorher, die anderen nachher. (Voltaire)
| |
| Sie sind nicht angemeldet! Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.
Einloggen | Neu registrieren |
|
|
vb@rchiv CD Vol.6 vb@rchiv Vol.6
Geballtes Wissen aus mehr als 8 Jahren vb@rchiv!
Online-Update-Funktion Entwickler-Vollversionen u.v.m.Jetzt zugreifen Tipp des Monats Neu! sevEingabe 3.0
Einfach stark!
Ein einziges Eingabe-Control für alle benötigten Eingabetypen und -formate, inkl. Kalender-, Taschenrechner und Floskelfunktion, mehrspaltige ComboBox mit DB-Anbindung, ImageComboBox u.v.m. Weitere Infos
|