Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

[C++ .NET] Drucken ( Empfehlungen benötigt! )

Empfohlene Antworten

Veröffentlicht

Hallo.

In meinem Programm soll es möglich sein, einzelne Bons zu drucken, mit einem Bondrucker. Der Bondrucker ist als ganz Normaler drucker eingetragen, sprich ich kann auch mit Word drucken ( Auch wenn es Grafisch nicht sehr toll ist :D )

Er ist als Standartdrucker eingestellt.

Ich hab mich Bereits erkundigt und das gefunden: MSDN PrintDocument Class

Ich werde den Beispielcode noch nicht Anwenden, weil ich erstmal empfehlungen brauch. Erst dann fang ich an mich durchzukämpfen :D

Die übertragung läuft über USB oder Serial ( Ich nehm USB, da USB meines Wissens schneller ist als Serial ). Serial oder Parallel, ich kenn den Port nicht so genau.

Da es sich als teilstück eines Kassiersystems handelt und alles Rasend schnell sein soll, muss auch die Übertragung stimmen.

Meine erste frage ( vorerst ): Gibt es eine Schnellere möglichkeit Dateien zu drucken? ( P.S. ich finde es doof, dass ich Dateien anlegen muss, und nicht direkt eine String Variable ausdrucken kann )

Liebe Grüße

errox

Meine erste frage ( vorerst ): Gibt es eine Schnellere möglichkeit Dateien zu drucken? ( P.S. ich finde es doof, dass ich Dateien anlegen muss, und nicht direkt eine String Variable ausdrucken kann )
Wie kommst du darauf, dass du Dateien anlegen musst?

Für dein Programm ist es übrigens völlig egal, ob dein Drucker an einem COM-Port, an einem USB-Anschluss oder irgendwo im Netzwerk hängt. Es ist Aufgabe des Betriebssystems und des Druckertreibers, das für dich zu abstrahieren.

  • Autor


streamToPrint = gcnew StreamReader( "C:\\My Documents\\MyFile.txt" );

Darum meint ich das mit der Datei anzulegen.

Für dein Programm ist es übrigens völlig egal, ob dein Drucker an einem COM-Port, an einem USB-Anschluss oder irgendwo im Netzwerk hängt. Es ist Aufgabe des Betriebssystems und des Druckertreibers, das für dich zu abstrahieren.

Gut zu Wissen, danke.


streamToPrint = gcnew StreamReader( "C:\\My Documents\\MyFile.txt" );
[/CODE]

Darum meint ich das mit der Datei anzulegen.

Du hast aber schon gesehen, dass dieser StreamReader nur dazu dient, [i]Strings[/i] aus der Datei auszulesen und diese dann zu drucken? Also genau das, was du wolltest?

  • Autor

Also ich bin schonmal ziemlich weit:


String^ text = "Dies ist ein Test\nNeue Zeile!";

PrintDocument^ pd = gcnew PrintDocument;

System::Drawing::Font^ printFront = gcnew System::Drawing::Font("Arial",5);

// "text" ( Variable Drucken )

pd->Print();

Arial, größe 5 ist klar. Aber ich möchte es schlicht haben: Wie kann ich die Variable "text" drucken? Mit den Ganzen Klassen, zusätzlichen Funktionen ist es wirklich schwer :S

  • Autor

Ich hab mir mal Graphics.DrawString Method angeguckt.

Bin ich so auf dem Richtigen weg?


	public:

		void DrawStringPointF( PaintEventArgs^ e )

		{

			// Create string to draw.

			String^ drawString = "Dies ist ein Test\nNeue Zeile!";


			// Create font and brush.

			System::Drawing::Font^ drawFont = gcnew System::Drawing::Font( "Arial",5 );

			SolidBrush^ drawBrush = gcnew SolidBrush( Color::Black );


			// Create point for upper-left corner of drawing.

			PointF drawPoint = PointF(150.0F,150.0F);


			// Draw string to screen.

			e->Graphics->DrawString( drawString, drawFont, drawBrush, drawPoint );

		}

	private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) 

			 {

				 PrintDocument^ pd = gcnew PrintDocument;

				 pd->PrintPage += gcnew PrintPageEventHandler(this, DrawStringPointF());

				 pd->Print();

			 }

	};

}

Bin ich so auf dem Richtigen weg?
Das sollte dir doch der Compiler beantworten. Ich glaube nicht, dass sich das übersetzen lässt.

Erstens passt die Signatur des Eventhandlers nicht. Warum PaintEventArgs? Mit einem PaintEventArgs-Objekt kannst du weder die Seitenmaße ermitteln noch festlegen, ob noch eine Seite folgt.

Zweitens muss der zweite Parameter beim Erzeugen des PrintPageEventHandler-Objekts ein Methodenzeiger sein. DrawStringPointF() ist kein Methodenzeiger, sondern ein Aufruf.

  • Autor

Ich hätte nie im leben gedacht dass es so Kompliziert ist, einen kleinen Text auszudrucken. Gibt es vielleicht einen Methodenzeiger, der einfacher zu Bedienen ist?

Ich hätte nie im leben gedacht dass es so Kompliziert ist, einen kleinen Text auszudrucken.
Es ist überhaupt nicht kompliziert. Du machst es selbst kompliziert, indem du den Beispielcode willkürlich änderst.

Ich glaube, du solltest dir diesen und die darauf folgendenden Artikel einmal aufmerksam durchlesen.

Gibt es vielleicht einen Methodenzeiger, der einfacher zu Bedienen ist?
Was gibt's denn da zu bedienen? Im Beispiel steht

pd->PrintPage += gcnew PrintPageEventHandler( this, &PrintingExample::pd_PrintPage );
[/code]

[b]&PrintingExample::pd_PrintPage[/b] ist der Methodenzeiger. Klassische C++-Syntax.

  • Autor

Also so?


	private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) 

			 {

				 PrintDocument^ pd = gcnew PrintDocument;

				 pd->PrintPage += gcnew PrintPageEventHandler( this, &PrintingExample::pd_PrintPage );

				 pd->Print();

			 }

Und wie kann ich nun den Methodenzeiger deklarieren?

Also so?
Heißt deine Klasse PrintingExample?

Und wie kann ich nun den Methodenzeiger deklarieren?
Was meinst du mit "Methodenzeiger deklarieren"? Hast du dir die Grundlagen zu Events und Delegates durchgelesen? Beim Erzeugen eines Eventhandler-Objekts übergibst du einen Zeiger auf die Methode, die aufgerufen werden soll, wenn das Event eintritt.

Oder meinst du, wie du diese Eventhandlermethode deklarierst? Es ist nicht hilfreich, wenn du hier die Begriffe durcheinanderwirfst.

Wie das geht, steht auch im Beispielcode:

// The PrintPage event is raised for each page to be printed.
private void pd_PrintPage(object sender, PrintPageEventArgs ev)
{
...
[/code]

Das ist die Methode, die das PrintPage-Event bearbeiten soll. Und das ist die Methode, deren Adresse weiter oben an das EventHandler-Objekt übergeben wurde, welches wiederum mit += an das PrintPage-Event des PrintDocument-Objekts gekoppelt wurde.

Den Namen der Methode kannst du dir aussuchen, die muss nicht pd_PrintPage heißen.

  • Autor

Also solangsam komm ich in fahrt...

ich weiss dass ich jetzt void pd_PrintPage aufrufen muss. Das ist der Druckvorgang.

Aber bei dem pd_PrintPage wird Streamreader benutzt. Wie kann ich meinen "normalen" String benutzen? Ich habs mir so vorgestellt:


	private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) 

			 {

				 PrintDocument^ pd = gcnew PrintDocument;

				 pd->PrintPage += gcnew PrintPageEventHandler( this, &Form1::DrawStringPointF );

				 pd->Print();

			 }

ich weiss dass ich jetzt void pd_PrintPage aufrufen muss. Das ist der Druckvorgang.
Nein, aufrufen musst du es eben genau nicht. Den Druckvorgang startest du mit dem Aufruf von Print. Damit wird ein PrintPageEvent erzeugt. Und dadurch wird dein Eventhandler aufgerufen. Eventuell mehrfach, je nachdem, was du im Eventhandler tust.

Aber bei dem pd_PrintPage wird Streamreader benutzt. Wie kann ich meinen "normalen" String benutzen?

Der StreamReader hat absolut nichts mit dem Drucken zu tun. Im Beispielcode wird ein Objekt namens line gedruckt, und das ist ein String. Der String wird nur aus dem StreamReader befüllt.

Das hatten wir doch schon!

  • Autor

Vielen vielen vielen vielen lieben Dank!!! Ich habs!!!!



		void pd_PrintPage( Object^ /*sender*/, PrintPageEventArgs^ ev )

		{

			System::Drawing::Font^ printFont = gcnew System::Drawing::Font( "Arial",10 );

			ev->Graphics->DrawString("hallo\nDies ist ein test!!!",printFont,Brushes::Black,0,0);

		}

	private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) 

			 {

				 PrintDocument^ pd = gcnew PrintDocument;

				 pd->PrintPage += gcnew PrintPageEventHandler( this, &Form1::pd_PrintPage );

				 pd->Print();

			 }

Ein "wunsch" hab ich noch. Ganz oben sollte eine Grafik zu sehen sein ( 64 * 64 pix ) Dateiformat von jpg, über psd bis zu bmp. Wie es am besten zu verarbeiten ist.

Wie kann ich das hinzufügen?

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.