Zum Inhalt springen

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


errox

Empfohlene Beiträge

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen


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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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();

			 }

	};

}

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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?

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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();

			 }

Link zu diesem Kommentar
Auf anderen Seiten teilen

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!

Link zu diesem Kommentar
Auf anderen Seiten teilen

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?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...