mag sein, dass es dann geht, aber eine Klasse so lange zu verschieben, bis sie da steht, dass sich der Code übersetzen lässt, ist keine besonders sinnvolle Vorgehensweise. Genausowenig, wie man mit private, protected und public solange spielen sollte, bis die die Zugriffe gehen, die man gerne hätte. In der Objektorientierung sind ja absichtlich mache Zugriffe verboten.
Aber bezogen auf dein Beispiel kann ich es nicht beurteilen, weil es ja gerade darauf ankommt, was das für Klassen sind.
kann ich denn da nicht nur den namen der form eingeben? es geht auch nicht mit der instanz der form.
wenn ich es mit this mache, drückt er mir zwar, aber ein gemisch aus form1 und form2. ich bräuchte wirklich nur den inhalt der form, kein rahmen, nix. und auch der graue hintergrund soll nicht geprintet werden.
wenn du eine gesammte Form als Control übergibst, dann druckt dir diese Klasse auch die gesammte Form. Diese Klasse ist in der Lage Controls zu drucken. Wenn du mehrere Controls einer Form drucken möchtest dann solltes du die Klasse verwenden um die einzelnen Bitmaps zu generieren und dann in der OnPrint Eventmethode im Layout zu platzieren und schlussendlich zu drucken.
Die Klasse ist erweiterbar auf mehrer Controls. Ich selber habe sie um ein weiteres Control erweitert. Des funzt also.
Wenn ich dich richtig verstanden habe willst du ein komplettes WindowsForms drucken. Von welcher Form aus stösst du den Druck an? Veranlasst du in Form1 den Druck von Form2 oder veranlasst du von Form2 aus den Druck selbiger?
Gruss
dschmoegner
Dennie Schmögner
Dipl. Ing. Informatik / Fachrichtung Automatisierungstechnik
Microsoft Business Intelligence 2005
SharePoint Portal Server 2007
nein, eigentlich weill ich nicht die ganze Form drucken. ich will nur zb. den Inhalt eines Panels oder auch von zwei Panels drucken.
zudem möchte ich den print von der form1 starten. das heisst, ich habe auf der form1 ein button und wenn der gedrückt wird, soll mir form2 gedruckt werden.
Kann ich mit dieser Klasse auch seiteneinstellungen druchtgeben? wie gross der ausdruck werden soll, und wo er auf dem blatt angeordnet wird?
sorry für diese vielen Fragen, aber das mit dem Print ist nicht so einfach, wie ich es mir gedacht habe.
das was du möchtest, kannst du in der OnPrint-Methode erledigen ohne die Klasse von Programmierhans zu verwenden.
Nimm das was in den Panels ist und zeichne es auf den Drucker, falls es eben nicht irgendein Grafikcontrol ist.
Ich kann dir nur das Buch Windows Programmierung in C# von Charles Petzold empfehlen. Der Druck wird dort recht ausführlich mit Beispielen erklärt.
Was mich zu einer Frage führt. Ich musste feststellen, dass bei einem Merhseitendruck bei jedem 2. Druck die Seiten überlagert werden. Genauer gesagt, habe ich im 1. Druck 14 Seiten druckt er mir beim 2. Druck die Seiten überlagert also nur 7 Seiten dann.
Irgendwie verlassen mich da grad die Geister.
private void prndoc_PrintPage(object sender, PrintPageEventArgs e)
{
Graphics grfx = e.Graphics;
Font myFont = new Font("Times New Roman", 10);
Pen myPen = new Pen(Brushes.Black);
StringFormat strFormat = new StringFormat();
string path = System.Environment.GetFolderPath(Environment.SpecialFolder.System);
Image imgtop = Image.FromFile(path + "\\logotop.bmp");
//Hier folgt Generierung des Drucklayouts
PageNumber++;
int rows = ((int)((e.MarginBounds.Bottom - 60 - rectfNotes.Bottom +5)/sizeFTime.Height)*2);
if(((int)this.MVToPrint.TimeToPrint.Length%rows)!=0)
{
//Prüfen ob eine weitere Seite gedruckt werden soll
e.HasMorePages = PageNumber<((this.MVToPrint.TimeToPrint.Length/rows)+1);
}
else
{
e.HasMorePages = PageNumber<(this.MVToPrint.TimeToPrint.Length/rows);
}
if(!e.HasMorePages)
{
grfx.DrawLine(myPen,new PointF(rectfSign.Left,rectfSign.Top - 1), new PointF(e.MarginBounds.Right-5,rectfSign.Top - 1));
grfx.DrawString("Datum, Unterschrift", myFont, Brushes.Black, rectfSign, strFormat);
PageNumber = 0;
NumberValues = 0;
}
}
Dennie Schmögner
Dipl. Ing. Informatik / Fachrichtung Automatisierungstechnik
Microsoft Business Intelligence 2005
SharePoint Portal Server 2007
Codebeispiele.....hmmm im Grunde verfährt man in der OnPrint genauso wie man es in der OnPaint machen würde.....sich das Graphicsobject besorgen und damit zeichnen.
Ich weiss jetzt nicht wie stark du mit der OnPaint vertraut bist, aber vielleicht solltest du dich damit noch einmal kurz auseinander setzen.
gruss
dschmoegner
Dennie Schmögner
Dipl. Ing. Informatik / Fachrichtung Automatisierungstechnik
Microsoft Business Intelligence 2005
SharePoint Portal Server 2007
Habe den Code probiert.... scheint auch zu funktionieren.
Bei mir kommt jedoch immer die Fehlermeldung, "Kein Drucker installier". Habe es mit dem Document Image Writer bzw. mit einem Drucker vom Netzwerk, als Standarddrucker probiert. Jedes Mal die Fehlermeldung...
wie schon erwähnt kann man in der OnPrint alle Zeichnen-Operationen wie in der OnPaint Methode vornehmen.....ich weiss jetzt nicht ob es für OnPrints nen Tutorial gibt, aber für die gesammte Paintgeschichte bestimmt irgendwo. Damit kann ich dir aber leider nicht dienen.
gruss
dschmoegner
Dennie Schmögner
Dipl. Ing. Informatik / Fachrichtung Automatisierungstechnik
Microsoft Business Intelligence 2005
SharePoint Portal Server 2007
Ich habe mal eine Frage zu dem schon angesprochenen Buch.
Ich programmiere mit .net 2.0 und stehe genau vor dem Problem, dass ich
ein Programm schreiben muss, dass mir Adressetiketten bedruckt.
Den Drucker ansprechen klappt nur kann ich keinen String usw. übergeben. Deshalb wollte ich wissen ob das Buch (3-86063-652-9) auch für .net 2.0 geeignet ist?
Für Ettikettendruck gibt es fertige, kommerzielle Lösungen. Wenn du im kommerziellen Umfeld programmierst, dann würde ich zum Einsatz raten. Sei mal List&Label als eines der bekanntesten Produkte genannt. Kostet zwar ein paar Euros für eine Entwicklerlizenz, ist aber allemal billiger als eine handgefrickelte Lösung.
Original von svenson
List&Label als eines der bekanntesten Produkte genannt. Kostet zwar ein paar Euros für eine Entwicklerlizenz, ist aber allemal billiger als eine handgefrickelte Lösung.
Und läuft auch wirklich gut
Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...
naja ich habe das Programm für eine Arbeitskollegin geschrieben. Und nun möchte ich es erweitern, dass es ihr die Etiketten auf Endlospapier ausdruckt.
Sicher gibt es dafür kommerzielle Software aber damit kann ich nicht meine C# Kenntnisse erweitern und verbessern :-)
Hallo,
hab mich auch mal an dem Code vergriffen und diesen bei mir eingebaut.
Funktioniert soweit auch alles super.
Hab nur leider das Problem, dass die erstellte Grafik (ausgehend vom Control-Handle) nur eine Auflösung von 96dpi hat. Daher sieht der Ausdruck nicht wirklich schick aus.
Gibt es eine Möglichkeit die dpi-Zahl anzupassen um bessere Druckergebnisse zu erziehlen?
Im Prinzip ist es ein partieller PrintScreen... und der Screen hat nun mal nur 96 dpi.... man könnte das Bild zwar vergrössern... dann sind aber trotzdem nicht mehr Informationen drin.... wird also nicht besser aussehen.
Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...
erstmal n riesen dankeschön für diesen code (und erklärungen dazu), habs auch ohne probleme zum laufen gebracht. aber ich hab da jetz noch zwei problemchen bzw. anpassungen die ich gerne verwenden würde.
und zwar wie bekommt man es hin, ein control das größer ist als eine DIN A4 seite auf die papiergröße anzupassen so dass quasi dass control automatisch auf die gesamte seiten größe angepasst wird?(unter Berücksichtung der seitenränder,wie in meiner nächsten frage erklärt)
die andere frage ist, wie kann ich der methode (bzw. klasse) meine pagesetupdialog einstellungen übergeben? also was bis jetzt klappt, ist dass die einstellung der Orientierung (Hoch/Querformat) des pagesetupdialog für den druck mit der Methode übernimmt, jedoch nicht die seitenränder. das control setzt er immer ins linke obere eck. wie kann ich die seitenränder an die methode von programmierhans übergeben?
ist meine Frage zu trivial oder hat sie einfach noch keiner gelesen?
bräucht bitte eure hilfe.
was ich jetzt noch festgestellt habe ist wenn ich das control bzw. die form maximiert ist dann ist die auflösung zu groß und das control wird dann natürlich auf dem papier abgeschnitten. also wäre es notwendig, dass sich die druckgröße kontrollieren kann, standardmäßig würde es reichen wenn es automatisch an die papiergröße angepasst wird. ist das zu realisieren? könnt ihr mir bitte sagen wie ich das hinbekomme?
vielen dank!!
Skalier es durch ganz herkömmliche Bildtransformation, bevor Du es an den Drucker sendest. Wie das geht, solltest Du selbst herausfinden können (ich weiß es aus dem Stehgreif nicht).
Gruß
Norman-Timo
A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”
he norman, danke dir! naja das problem is net den wald nicht zu sehen sondern sich im wald zurechtzufinden, wenn man erst seit einigen wochen mit c# zu tun hat. und des druckthema is dann für so n fortgeschrittenen anfänger wie mich net so einfach. kann mir unter deinem vorschlag noch nix genaues vorstelle aber ich werd jetz ma versuchen was zu deinem vorschlag zu finden und einzulesen. evtl meld ich mich nochmal.
also hab des jetzt mal mit folgender methode probiert:
private Bitmap ResizeBitmap(Bitmap b, int nWidth, int nHeight)
{
Bitmap result = new Bitmap(nWidth, nHeight);
using(Graphics g = Graphics.FromImage((Image) result))
g.DrawImage(b, 0, 0, nWidth, nHeight);
return result;
}
aber so funktioniert des irgendwie net. muss ich da noch was anderes im code ändern. also irgendwann nach meinem methodenaufruf? oder is des schon der völlig falsche weg was ich da vor hab?
den parameter b hab ich mit _ImageToPrint übergeben und die andern beiden parameter hardcodiert. da muss ich mir noch überlegen wie ich meine papiergröße bzw papiergröße minus ränder übergebe. müsste eigtl irgendwie über mein PageSetupDialog gehen !?