Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Drucken eines Controls?
torkel
myCSharp.de - Member



Dabei seit:
Beiträge: 506
Herkunft: Swiss

beantworten | zitieren | melden

hi... ne an dem liegt es nicht, denn meine Form heisst eh anders, habe das nur als beispiel geschrieben, dass es verständlich ist.

ich glaube ich habe den code einfach falsch platziert. ich nehme die ganze klasse in meine bestehende Form, oder ist das falsch???
private Nachricht | Beiträge des Benutzers
Programmierhans
myCSharp.de - Experte

Avatar #avatar-1651.gif


Dabei seit:
Beiträge: 4.221
Herkunft: Zentralschweiz

beantworten | zitieren | melden

Ich hab ja im Beispiel absichtlich ne eigene Klasse gemacht

dann machst Du

PrintFunctions pf=new PrintFunctions();
pf.PrintControl(-----das was du Drucken willst)


Das kannst Du dann aus jedem Form aufrufen....
Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

Hallo torkelm

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.

herbivore
private Nachricht | Beiträge des Benutzers
torkel
myCSharp.de - Member



Dabei seit:
Beiträge: 506
Herkunft: Swiss

beantworten | zitieren | melden

@prgrammierhans: ja, jetzt hat es geklappt! merci.

aber ich kann jetzt meine form2 nicht printen.

mit

                    

PrintFunctions pf=new PrintFunctions();
 pf.PrintControl(form2);
  

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.

geht das irgendwie?

mfg
private Nachricht | Beiträge des Benutzers
dschmoegner
myCSharp.de - Member



Dabei seit:
Beiträge: 280
Herkunft: Göttingen

Themenstarter:

beantworten | zitieren | melden

Hi torkel,

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
private Nachricht | Beiträge des Benutzers
torkel
myCSharp.de - Member



Dabei seit:
Beiträge: 506
Herkunft: Swiss

beantworten | zitieren | melden

@dschoegner:

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.

greetz
private Nachricht | Beiträge des Benutzers
dschmoegner
myCSharp.de - Member



Dabei seit:
Beiträge: 280
Herkunft: Göttingen

Themenstarter:

beantworten | zitieren | melden

Hi torkel,

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
private Nachricht | Beiträge des Benutzers
torkel
myCSharp.de - Member



Dabei seit:
Beiträge: 506
Herkunft: Swiss

beantworten | zitieren | melden

HI...

gibt es da irgendwo ein Codebeispiel?

was hat das buch für eine IBAN Nummer?

gruss
private Nachricht | Beiträge des Benutzers
dschmoegner
myCSharp.de - Member



Dabei seit:
Beiträge: 280
Herkunft: Göttingen

Themenstarter:

beantworten | zitieren | melden

Zitat
Original von torkel
HI...

gibt es da irgendwo ein Codebeispiel?

was hat das buch für eine IBAN Nummer?

gruss

ISBN: 3-86063-652-9

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
private Nachricht | Beiträge des Benutzers
bacella
myCSharp.de - Member



Dabei seit:
Beiträge: 2

beantworten | zitieren | melden

Hallo!

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...

Woran liegt das? Was muss ich machen?

Danke, im voraus....

MfG Bacella
private Nachricht | Beiträge des Benutzers
dschmoegner
myCSharp.de - Member



Dabei seit:
Beiträge: 280
Herkunft: Göttingen

Themenstarter:

beantworten | zitieren | melden

Hi bacella,

vielleicht ein bißchen billig aber auf Anhieb fällt mir nix weiter ein:



this.prndoc	= new PrintDocument();
			this.setdlg	= new PageSetupDialog();
			this.prndlg	= new PrintDialog();

			
			this.prndlg.Document		= this.prndoc;
			this.setdlg.Document		= this.prndoc;

private void FileToPrint()
		{
			if(this.prndlg.ShowDialog() == DialogResult.OK)
			{
				this.prndoc.DocumentName = "Datenblatt";
				this.prndoc.PrintPage	+= new PrintPageEventHandler(OnPrintPage);
			
			
				this.prndoc.Print();
			}
		}


Haste das alles im Code??????
Dennie Schmögner
Dipl. Ing. Informatik / Fachrichtung Automatisierungstechnik
Microsoft Business Intelligence 2005
SharePoint Portal Server 2007
private Nachricht | Beiträge des Benutzers
bacella
myCSharp.de - Member



Dabei seit:
Beiträge: 2

beantworten | zitieren | melden

Hab den Code vom Programmierhans übernommen... brauch ich das dann auch nocht.... sollte ja so auch funktionieren....

Hab keine Ahnung mit Drucken... mache es zum ersten Mal

MfG Bacella
private Nachricht | Beiträge des Benutzers
dschmoegner
myCSharp.de - Member



Dabei seit:
Beiträge: 280
Herkunft: Göttingen

Themenstarter:

beantworten | zitieren | melden

JA dieser Code ist notwendig, die ersten 5 stehen bei mir im Konstruktor und die Methode rufe ich auf wenn ich drucken will.

Schau dir besser noch einmal in der MSDN die Druckerfunktionen und -optionen an. Den Code einfach zu übernehmen wird dir nur sehr kurzfristig helfen.

gruss dschmoegner
Dennie Schmögner
Dipl. Ing. Informatik / Fachrichtung Automatisierungstechnik
Microsoft Business Intelligence 2005
SharePoint Portal Server 2007
private Nachricht | Beiträge des Benutzers
torkel
myCSharp.de - Member



Dabei seit:
Beiträge: 506
Herkunft: Swiss

beantworten | zitieren | melden

hallo

wie kann ich den Backcolor ändern, bei einem PrintOut?

hätte gerne, dass nicht der graue hintergrund gedruckt wird, sondern nur den text auf weisem background.

und gibt es irgendwo ein tutorial für diese OnPrint-Methode?

thanxx
private Nachricht | Beiträge des Benutzers
dschmoegner
myCSharp.de - Member



Dabei seit:
Beiträge: 280
Herkunft: Göttingen

Themenstarter:

beantworten | zitieren | melden

Hi torkel,

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
private Nachricht | Beiträge des Benutzers
alf468
myCSharp.de - Member



Dabei seit:
Beiträge: 196

beantworten | zitieren | melden

In .NET 2.0 gibt die Methode Control.DrawToBitmap .Damit kann man auch ganz einfach ein Control drucken.
Beispiel:

Bitmap b=new Bitmap(this.textBox1.Width,this.textBox1.Height);
this.textBox1.DrawToBitmap(b, e.PageBounds);
e.Graphics.DrawImage(b, new Point(15, 50));
private Nachricht | Beiträge des Benutzers
tequila slammer
myCSharp.de - Member



Dabei seit:
Beiträge: 253
Herkunft: DE

beantworten | zitieren | melden

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?

Danke schonmal.
private Nachricht | Beiträge des Benutzers
svenson
myCSharp.de - Member



Dabei seit:
Beiträge: 8.746
Herkunft: Berlin

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
Programmierhans
myCSharp.de - Experte

Avatar #avatar-1651.gif


Dabei seit:
Beiträge: 4.221
Herkunft: Zentralschweiz

beantworten | zitieren | melden

Zitat
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...
private Nachricht | Beiträge des Benutzers
tequila slammer
myCSharp.de - Member



Dabei seit:
Beiträge: 253
Herkunft: DE

beantworten | zitieren | melden

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 :-)
private Nachricht | Beiträge des Benutzers
zorck
myCSharp.de - Member



Dabei seit:
Beiträge: 1

Auflösung änderbar?!

beantworten | zitieren | melden

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?
private Nachricht | Beiträge des Benutzers
Programmierhans
myCSharp.de - Experte

Avatar #avatar-1651.gif


Dabei seit:
Beiträge: 4.221
Herkunft: Zentralschweiz

beantworten | zitieren | melden

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...
private Nachricht | Beiträge des Benutzers
Buck
myCSharp.de - Member



Dabei seit:
Beiträge: 26
Herkunft: Österreich

Problem bei der Position

beantworten | zitieren | melden

Kann mir bitte jemand folgende Programmzeile erklären. Welche Koordinaten sind für die Druckposition verantwortlich? ?(
BitBlt(hdcTarget,0,0,rectSource.Width,rectSource.Height,hdcSource,0,0,SRCCOPY);

Danke erstmals!
Buck
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

Hallo Buck,

das ist eine Frage für die Doku: BitBlt

herbivore
private Nachricht | Beiträge des Benutzers
zipperle
myCSharp.de - Member



Dabei seit:
Beiträge: 47

beantworten | zitieren | melden

hallo,

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?
private Nachricht | Beiträge des Benutzers
zipperle
myCSharp.de - Member



Dabei seit:
Beiträge: 47

beantworten | zitieren | melden

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!!
private Nachricht | Beiträge des Benutzers
norman_timo
myCSharp.de - Member

Avatar #avatar-1775.jpeg


Dabei seit:
Beiträge: 4.506
Herkunft: Wald-Michelbach (Odw)

beantworten | zitieren | melden

Hallo zipperle,

na eventuell siehst Du den Wald vor lauter Bäumen wirklich nicht ;-)

Dir liegt doch das Bitmap

_ImageToPrint=new Bitmap(rectSource.Width,rectSource.Height,gSource);
vor, das zum Drucker gesendet wird.

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!”
private Nachricht | Beiträge des Benutzers
zipperle
myCSharp.de - Member



Dabei seit:
Beiträge: 47

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
zipperle
myCSharp.de - Member



Dabei seit:
Beiträge: 47

beantworten | zitieren | melden

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 !?
private Nachricht | Beiträge des Benutzers
Programmierhans
myCSharp.de - Experte

Avatar #avatar-1651.gif


Dabei seit:
Beiträge: 4.221
Herkunft: Zentralschweiz

beantworten | zitieren | melden

@zipperle

Verwende doch den GetThumbNail aus dem folgenden Code.

Listbox für Bilder
Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...
private Nachricht | Beiträge des Benutzers