Autor |
Beitrag |
woodart
Hält's aus hier
Beiträge: 9
Win7-64
C# (VS 2010 ultimate), ExpressionBlend, InstallShield 2011 LE, Adobe Dreamweaver 8.0
|
Verfasst: Fr 28.02.14 10:31
Hallo liebe Leser,
Ich möchte ein Programm schreiben (VisualStudio2010, Sprache C#, Net Framework 4.0), wobei in einem Windows-Form ein Panel ist und sich in diesem Panel wiederum diverser Text in TextBox, Label, und diversen anderen Controls für Text befinden.
(Später dann noch evtl. ein DataGrid für Eingaben)
Das Ansprechen des Druckers (pdf oder auch der echte Drucker) ist nicht das Problem.
(Es hat beim Ausdruck von z.B. Textboxen in einer Form ohne Panel geklappt)
Bei dem mitgeschicktem Programm kommen bisher nur leere Seiten heraus. Pdf ist ein leeres Blatt und auch der Drucker macht nur ein Papaer-Feed ohne Text zu drucken.
Das drucken von z.B. einer oder zwei Textboxen funktioniert (anderes Programm). Also Druck Dialog stimmt wohl soweit.
Using Direktiven habe ich auch alle richtig vergeben – weil es ja mit anderen Ausdrucken klappt (using.System.Printing … etc)
Ich gehe davon aus, dass ich dem Drucker nicht sagen kann, dass er das panel als Textausdruck / Ausdruck zu verstehen hat.
Bisher habe ich das panel als Bitmap zugewiesen mit dem entsprechenden Befehl für „ClientRectangle“ – damit der Druck / das Image als Image und nicht als Stream gedruckt wird. Ist ja eigentlich auch nur ein stream in Form von einer Hülle von Textboxen u.ä.
Es wäre toll, wenn jemand eine Idee für einen Ansatz hat, mit dem ich dann das problem lösen kann.
Grüße
Jan
Im Dateianhang der screenshot von der Form und der sourcecode
Einloggen, um Attachments anzusehen!
Zuletzt bearbeitet von woodart am Fr 28.02.14 11:03, insgesamt 2-mal bearbeitet
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Fr 28.02.14 10:35
Du sagst dem Drucker nirgendwo, was er drucken soll. Natürlich druckt er dann eine leere Seite 
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
woodart 
Hält's aus hier
Beiträge: 9
Win7-64
C# (VS 2010 ultimate), ExpressionBlend, InstallShield 2011 LE, Adobe Dreamweaver 8.0
|
Verfasst: Fr 28.02.14 10:45
Ich hatte den falschen Code hochgeladen.
Der aktuelle oben im Startbeitrag ist aktualisiert.
Gruß Jan
|
|
Th69
      

Beiträge: 4796
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Fr 28.02.14 10:52
Hallo woodart,
du benötigst noch die Ereignismethode für PrintDocument.PrintPage. (Edit: ok - hast du ja jetzt in der Zwischenzeit, aber der Code zum Drucken des Images fehlt dort trotzdem noch  )
Evtl. noch relevant:
Sind die anderen Controls denn auch wirklich dem Panel untergeordnet (und nicht der Form)?
Um beliebige Controls zu drucken, hat sich JüTho die Mühe gemacht eine Klasse dafür zu entwickeln: mycsharp.de - Formular/Control drucken oder als Bitmap speichern.
P.S. Du hast beim Editieren den Screenshot gelöscht (und stattdessen sind beide Source-Codes als Anhang jetzt da).
Zuletzt bearbeitet von Th69 am Fr 28.02.14 10:58, insgesamt 2-mal bearbeitet
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Fr 28.02.14 10:53
Ah so
In der unten markierten Zeile erstellst Du ein brandneues PrintDocument, damit sind alle Ereignis-Zuweisungen und sonstigen Einstellungen futsch. Wahrscheinlich geht es, wenn Du die Zeile einfach weglässt, denn das PrintDocument scheint ja durch den Designer eh schon erzeugt zu werden.
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| private void cmdPrint_Click(object sender, EventArgs e) {
printDocument1 = new PrintDocument();
if (printDialog1.ShowDialog() == DialogResult.OK) { printDocument1.Print(); } } |
//edit: Im PrintPage-Event sagst Du dem Drucker aber trotzdem immer noch nicht, was der drucken soll 
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
woodart 
Hält's aus hier
Beiträge: 9
Win7-64
C# (VS 2010 ultimate), ExpressionBlend, InstallShield 2011 LE, Adobe Dreamweaver 8.0
|
Verfasst: Mo 03.03.14 07:54
Erstmal Vielen Dank für die Antworten und Tips / Links.
Ich werde das in den nächsten Tagen mal ausführlich durcharbeiten
Gruß Jan
|
|
woodart 
Hält's aus hier
Beiträge: 9
Win7-64
C# (VS 2010 ultimate), ExpressionBlend, InstallShield 2011 LE, Adobe Dreamweaver 8.0
|
Verfasst: Fr 07.03.14 10:11
So, ich gehe noch mal zu der etwas einfacheren Variante, bei der ich eine einfache WindowsForm habe, in der sich zwei simple Textboxen befinden. Die Position der Textboxen im Form spielen hierbei erstmal keine Rolle. Auch nicht die Position derselben auf dem Blatt, was aus dem Drucker kommt.
Das Problem mit dem Drucken von einem Panel nehme ich später dann wieder auf.
Folgenden Code habe ich für das Ausdrucken der beiden Textboxen geschrieben (funktionstüchtig):
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:
| namespace TestDruck_2 { public partial class Form1 : Form { public Form1() { InitializeComponent(); }
private void btnDrucken_Click(object sender, EventArgs e) { printDocument1.DocumentName = textBox1.Text + textBox2.Text;
printDialog1.Document = printDocument1;
if (printDialog1.ShowDialog() == DialogResult.OK) { printDocument1.Print(); }
}
private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e) { e.Graphics.DrawString(textBox1.Text + Environment.NewLine + Environment.NewLine + textBox2.Text, this.Font, Brushes.Black, e.MarginBounds); } } } |
Die using Direktiven habe ich hier mal weggelassen.
Liege ich richtig, dass das, was ich drucken will (hier: Textbox), mit
C#-Quelltext 1:
| printDocument1.DocumentName = textBox1.Text + textBox2.Text; |
im Programm bekannt gebe ?
Also, so, dass ich statt der Textboxen auch quasi panel1.image oder so ähnlich schreiben könnte, damit der Drucker weiß, was er drucken soll ?
(natürlich dann mit dem Verweis auf die Grafik / das Image)
Gruß Jan
Moderiert von Christian S.: C#-Tags hinzugefügt
Moderiert von Th69: C#-Tags hinzugefügt
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Fr 07.03.14 10:22
Genau, Du weist dem string DocumentName dann einfach ein Bild zu, das wird dann in der Schriftart WingDings umgesetzt, damit es darstellbar ist. Und Microsoft hat sich da auch nur verschrieben, bei der Benennung der Eigenschaft, die meinen nicht wirklich den Namen des Dokuments, sondern den Inhalt.
Und printDocument1_PrintPage ist nur da, damit das Programm nicht so kurz aussieht ...
Oder doch nicht?
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
woodart 
Hält's aus hier
Beiträge: 9
Win7-64
C# (VS 2010 ultimate), ExpressionBlend, InstallShield 2011 LE, Adobe Dreamweaver 8.0
|
Verfasst: Fr 07.03.14 10:55
Hallo Christian,
ja das mit dem printPage Event ist richtig. man kann da schon zig Zeilen Code schreiben, damit sich der Drucker und der User freut.
Ich persönlich benutze seit geraumer Zeit unter anderem das Entwicklerbuch von MicrosoftPress "Visual C# 2010" und da stehen einige Seiten über das Drucken drin - nur eben für Text. (Bilder werden auch kurz angeschnitten - in dem Fall Fotodruck). Wenn man da Controls wie z.B. panel drucken möchte, muss das ein wenig umbasteln.
Für mich schon eine kleine Herausforderung.
Wobei ich es einfacher finde ein Programm für z.B. den typischen "Taschenrechner" oder ein Programm zur Berechnung von irgendwas zu schreiben, als ein Programm, wo es um das Ausdrucken von Text geht (in kombination mit der Speicherung einiger Textboxen in einer Datenbank für namen, die immer wiederkehren ...)
Den Link von Th69 hatte ich auch entdeckt.
|
|
Th69
      

Beiträge: 4796
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Fr 07.03.14 11:23
Hallo,
um dich jetzt konkret auf die richtige Spur zu führen: schau dir mal die Graphics.DrawImage-Methode(n) an.
Das Drucken ist intern nichts anderes als das Zeichnen auf dem Bildschirm (oder genauer auf einen Grafikbereich). Intern benutzt Windows dafür sog. Devices bzw. Device Contexts (ich hoffe, du bist der englischen Sprache mächtig, denn der Artikel ist wohl nur in englisch verfügbar - und der letzte Satz des ersten Abschnitts bestätigt meine obige Aussage).
Und jetzt solltest du auch verstehen, warum in der PrintPage-Ereignismethode auf e.Graphics zugegriffen werden muß.
P.S. Christian, ich hätte fast geglaubt, was du da geschrieben hast 
|
|
woodart 
Hält's aus hier
Beiträge: 9
Win7-64
C# (VS 2010 ultimate), ExpressionBlend, InstallShield 2011 LE, Adobe Dreamweaver 8.0
|
Verfasst: Mo 10.03.14 08:35
Hallo
Ich habe meinen Code dahingehend korrigiert, so dass das Panel mit der Grafik gedruckt wird. Allerdings fehlt die Textbox im Ausdruck. Ich bin aber am Problem dran.
Ich denke, dass ich zusätzlich zu "DrawBitmap" auch "DrawString" für dien eigentlichen Text mit einfügen muss.
Hier der korrigierte Code:
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:
| namespace Paint { public partial class Form1 : Form { public Form1() { InitializeComponent(); }
private void panel1_Paint(object sender, PaintEventArgs e) { Graphics g = e.Graphics; int y = 0; while (y < ClientRectangle.Bottom) { g.DrawLine(Pens.Black, 0, 0, ClientRectangle.Right, ClientRectangle.Bottom - y); y += 10; } }
private void panel1_Resize(object sender, EventArgs e) { this.Refresh(); }
private void cmdPrint_Click(object sender, EventArgs e) { printDialog1.Document = printDocument1; if (printDialog1.ShowDialog() == DialogResult.OK) { printDocument1.Print(); } }
private void printDocument1_PrintPage(object sender, PrintPageEventArgs e) { Bitmap myBitmap = new Bitmap(panel1.Width, panel1.Height); PaintEventArgs myPaintArgs = new PaintEventArgs(e.Graphics, new Rectangle(new Point(0, 0), this.Size)); this.InvokePaint(panel1, myPaintArgs); } } } |
edit: wie funktioniert hier das Hinzufügen von Tags für Programmcode ?
Gruß Jan
Moderiert von Christian S.: C#-Tags hinzugefügt
|
|
woodart 
Hält's aus hier
Beiträge: 9
Win7-64
C# (VS 2010 ultimate), ExpressionBlend, InstallShield 2011 LE, Adobe Dreamweaver 8.0
|
Verfasst: Do 13.03.14 23:00
Ich habe jetzt nochmal versucht das Panel mit den beiden Textboxen zu drucken.
Es werden die Textboxen rechts abgeschnitten und der Text wird nicht vom Drucker weitergeschrieben.
Ich habe die Befürchtung, dass das Drucken von Textbox-Inhalten in einem Panel nur mit WPF geht. Damit habe ich mich aber noch nicht näher beschäftigt.
Im Moment komme ich weder mit "MarginBounds" noch dem Versetzen der Textboxen in der Form weiter. Es liegt also nicht an diesen Dingen. Es müsste sowas wie "PrintableArea = Panel1.Bounds" geben, oder so in der Richtung.
Vielleicht hat ja jemand den alles entscheidenen Hinweis für mich.
MSDN Galileo Computing-Bücher und Microsoft Press hatte es nicht.
Als Dateianhang ist mal meine Projektmappe - falls jemand damit dann mehr anfangen kann.
Gruß
Jan
Moderiert von Christian S.: Der Einfachheit halber PrintPage-Event als Quelltext eingefügt
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:
| private void printDocument1_PrintPage(object sender, PrintPageEventArgs e) { double ratioX = (double)e.MarginBounds.Width / panel1.Width; double ratioY = (double)e.MarginBounds.Height / panel1.Height;
Bitmap myBitmap = new Bitmap(panel1.Width, panel1.Height); PaintEventArgs myPaintArgs = new PaintEventArgs(e.Graphics, new Rectangle(new Point(0, 0), this.Size)); this.InvokePaint(panel1, myPaintArgs);
StringReader printStream = new StringReader(textBox1.Text + textBox2);
string line; int count = 0; float yPos = 0; float leftMargin = e.MarginBounds.Left; float topMargin = e.MarginBounds.Top; float rightMargin = e.MarginBounds.Right; Font printFont = new Font("Arial", 12); while ((line = printStream.ReadLine()) != null) { yPos = topMargin + (count * printFont.GetHeight(e.Graphics));
e.Graphics.DrawString(textBox1 + Environment.NewLine + Environment.NewLine + textBox2.Text, this.Font, Brushes.Black, e.MarginBounds);
count++; }
} |
Einloggen, um Attachments anzusehen!
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Do 13.03.14 23:44
Dir ist aber schon klar, dass Du 90% von dem Code, den Du im PrintPage-Event hast, gar nicht benutzt? Also inklusive der Schleife
Wenn man das mal reduziert, sieht das so aus:
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| private void printDocument1_PrintPage(object sender, PrintPageEventArgs e) { PaintEventArgs myPaintArgs = new PaintEventArgs(e.Graphics, e.PageBounds); this.InvokePaint(panel1, myPaintArgs);
Font printFont = new Font("Arial", 12); e.Graphics.DrawString(textBox1.Text + Environment.NewLine + Environment.NewLine + textBox2.Text, printFont, Brushes.Black, e.MarginBounds); } |
Dabei habe ich noch ein paar Sachen geändert
- bei den PaintEventArgs benutze ich die Größe der Seite, nicht der Form
- bei DrawString muss es textBox1.Text heißen
- bei DrawString möchtest Du wahrscheinlich printFont anstatt this.Font benutzen
Wenn ich das dann so benutze, wird der Text korrekt gedruckt und auch am Seitenrand umgebrochen.
Falls das nicht so ist, wie Du das möchtest, wäre es vielleicht ganz gut, wenn Du mal in einen PDF-Drucker druckst, das Ergebnis hier anhängst und dazu schreibst, was nicht so ist, wie Du das haben möchstest.
Viele Grüße
Christian
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
woodart 
Hält's aus hier
Beiträge: 9
Win7-64
C# (VS 2010 ultimate), ExpressionBlend, InstallShield 2011 LE, Adobe Dreamweaver 8.0
|
Verfasst: Fr 14.03.14 16:08
Hallo Christian,
erstmal vielen Dank für die erweiterte Anregungen meiner Gehirnzellen.
Die geänderten Sachen von dir hatte ich hier völlig übersehen.
Zitat: |
- bei den PaintEventArgs benutze ich die Größe der Seite, nicht der Form
- bei DrawString muss es textBox1.Text heißen
- bei DrawString möchtest Du wahrscheinlich printFont anstatt this.Font benutzen
|
Ich habe es im Code soweit abgeändert und es funktioniert auch bei mir.
Zum "Ausdrucken" nehme ich ein PDF-Printer-Programm.
Das Programm druckt jetzt die Textboxen, die im Panel hinterlegt sind. - Das war das erste, wichtige Ziel.
Die (eher unwichtige) Grafik im Panel ist auch da - wird allerdings nicht bis zum rechten Rand gedruckt. (was erstmal nicht weiter schlimm ist)
Ich denke, dass es an den MarginBounds der Striche / Grafik liegt (oder am e.Graphics der Grafik selbst).
Da ich nicht vorhabe AutoCAD nach zu programmieren oder CNC Produktprogrammierern Konkurenz zu machen, ist das nicht so schlimm ...
Im Anhang ist das PDF, was den momentanen Stand darstellt.
Ich habe hier da noch eine dritte TextBox hinzugefügt - was ja nicht weiter stört. Es kommen eh noch etwa 15 Textboxen hinzu...
Vielen Dank für die super Tipps und Anstöße zu diesem Thema.
Dieser Dank gilt natürlich auch allen anderen, die bei der Lösung geholfen haben
Gruß
Jan
Einloggen, um Attachments anzusehen!
|
|
|