Inhalt mehrerer Formulare drucken
- VB6
Sie verwenden einen veralteten Browser (%browser%) mit Sicherheitsschwachstellen und können nicht alle Funktionen dieser Webseite nutzen.
Hier erfahren Sie, wie einfach Sie Ihren Browser aktualisieren können.
Hier erfahren Sie, wie einfach Sie Ihren Browser aktualisieren können.
Es gibt 24 Antworten in diesem Thema. Der letzte Beitrag () ist von red1825.
-
-
Ja, die gibt es, und zwar mit Hilfe des Printer-Objekts. Was das Printer-Objekt alles kann, kannst du ausführlich in der MSDN nachlesen, daher hier nur die wichtigsten Befehle:
<pre>
Printer.CurrentX = 100 ' auf X Position 100 gehen
Printer.CurrentY = 100 ' auf Y Position 100 gehen
Printer.Print "Hallo Welt" ' "Hallo Welt" ausgeben
Printer.EndDoc ' Den Druck starten
</pre>
Und das nächste Mal bitte keine zwei Topics für eine Frage eröffnen!Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()
-
-
-
Zu deiner ersten Frage:
variable = " hallo welt"
variable = LTrim(variable)
msgbox variable ' ergibt "hallo welt"
Zu deiner zweiten Frage:
Die habe ich dir doch schon in deinem anderen Thread beantwortet! -
-
Mit Replace kannst du dein Problem mit den führenden (!) Leerzeichen aber nicht lösen. Das geht (meiner Meinung nach) NUR mit LTrim.
Wegen dem Ausdruck: Das Drucken über das Printer Objekt mit Printer.Print [...] ist vielleicht schlechter zu pflegen, aber definitv viel eleganter. Und es sieht so auch besser aus. Mit dem simplen Ausdruck des Formulars machst du es dir ziemlich einfach. Aber das ist ja deine Sache.
Wie man Screenshots macht, kann ich dir im Moment auch nicht direkt sagen, ich weiss nur das es geht und das der Code dafür auf vielen VB Websites steht, also einfach mal per Google suchen.
Wenn du dann die einzelnen Grafiken hast, dann kannst du sie mit Printer.PaintPicture ausgeben. Dort kannst du auch noch die Pixelgröße (und Position) angeben. -
Zum ScreenShot:
Ich denke mal, du möchtest nur dein Formular ausdrucken
nicht den ganzen Bildschirm. Also musst du dir ein Handle
auf den DeviceContect deines Formulares mit GetDC()
holen und mit BitBlt() dann von deinem hDC auf den
hDC des Druckers umkopieren. Beachte dabei allerdings,
dass du dein Formular an die richtige Stelle kopieren musst,
damit du nicht irgendwelche Texte überlagerst.
Danach kannst du das Formular ausdrucken und den
DeviceContect deines Formulares mit ReleaseDC freigeben:
<pre>
Private Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function BitBlt Lib "gdi32" _
(ByVal hdcDest As Long, ByVal nXDest As Integer, _
ByVal nYDest As Integer, ByVal nWidth As Integer, _
ByVal nHeight As Integer, ByVal hdcSrc As Long, _
ByVal nXSrc As Integer, ByVal nYSrc As Integer, _
ByVal dwRop As Long) As Long
Private Declare Function ReleaseDC Lib "user32" (ByVal hwnd As Long, ByVal hdc As Long) As Long
Private Const SRCCOPY As Long = &HCC0020
Private Sub Form_Load()
Dim handleDC As Long
handleDC = GetDC(Me.hwnd)
BitBlt Printer.hdc, 0, 0, Breite, Hoehe, handleDC, 0, 0, SRCCOPY
'Erst jetzt solltest du die Textausgabe beginnen, sofern nötig
Printer.CurrentY = Hoehe + 5 'und auch erst hinter deinem Formular
Printer.EndDoc 'Jetzt kannst du drucken
ReleaseDC handleDC, Me.hwnd 'Und den hDC freigeben
End Sub
</pre> -
-
Dein Projekt besteht ja aus Fenstern. Jedes Fenster
hat eine Nr. mit der man es eindeutig identifizieren
kann, das bezeichnet man als handleWindow.
Ein handle kannst du dir wie einen Zeiger vorstellen,
mit dem du Zugriff auf dein Fenster hast. Nun hat
jedes Fenster einen DeviceContext. Ein DeviceContext
ist eine Datenstruktur, die Informationen über ein
Ausgabegerät, wie z.B. den Drucker, oder ein Fenster
enthält. In diesem DeviceContext sind also die Informationen
über das aussehen des Fenster gespeichert. Da das
Printer-Objekt ebenfalls einen DeviceContext enthält,
kannst du einfach den Inhalt des DeviceContexts deines
Fenster, in das des DeviceContexts des Printer-Objekts
umkopieren. Dazu benutzt du die Funktion BitBlt
(die Bezeichnung Blt oder Blit, bit block transfer, geht
auf die ersten Grafikcoprozessoren zurück, die Blitter
genannt wurden, da sie in der Lage waren, Speicher
(Bits) blockweise zu verschieben).
Der Funktion BitBlt übergibst du dann den handle auf
den DeviceContext des Fensters, die Höhe und Breite
des Teils der kopiert werden soll, die Position von der
kopiert werden soll, die Position an die kopiert werden soll
sowie ein handle auf den Ziel DeviceContext und die
Art des Kopiervorgangs.
Solltest du jetzt noch Grafiken ausgeben wollen, musst
du darauf achten, dass du nich in den Bereich zeichnest,
in dem du vorher mit BitBlt kopiert hast.
Da du nun die Funktion des Printer-Objektes übergangen hast,
kann VisualBasic nicht wissen, dass du irgendwelche
Zeichen- Operationen vorgenommen hast und wird
somit das Drucken nicht zulassen, da theoretisch nur
eine leere Seite herauskommen würde.
Deshalb musst du, sofern du keine anderen Zeichen-
Operationen vorgenommen hast, die Line oder Print
Funktion des Printer-Objekts aufrufen, erst dann
kannst du mithilfe der EndDoc Funktion Drucken.
-
-
Hättest du meinen vorherigen Beitrag gelesen, wüsstest
du, warum der obige Quellcode nicht funktioniert.
Nochmal: wenn du Grafik-Operationen durchführst, die
nicht über das Printer-Objekt laufen, dann kann VB nicht
wissen, wann etwas auf der Seite vorhanden ist und wird
nicht drucken. In dem obigen Quellcode, bin ich davon
ausgegangen, dass er noch Text ausgibt, also Grafik-
Operationen über das Printer-Objekt durchführt, das sollte
er nach der Zeile
<pre>
'Erst jetzt solltest du die Textausgabe beginnen, sofern nötig
Printer.CurrentY = Hoehe + 5 'und auch erst hinter deinem Formular
</pre>
machen. Zeichne also irgend etwas, so z.B.
<pre>
'Erst jetzt solltest du die Textausgabe beginnen, sofern nötig
Printer.CurrentY = Hoehe + 5 'und auch erst hinter deinem Formular
Printer.Line(0, Hoehe + 5)-(0,Hoehe + 5)
</pre>
Jetzt sollte es funktionieren.Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Unknown“ ()
-
-
Jedes Formular hat einen DeviceContext. In diesem
DeviceContext sind Informationen über das Aussehen
des Formulares gespeichert. Mit Hilfe der BitBlt Funktion,
kannst du diese Informationen kopieren.
Da du bei dem Vorgang dann aber keine Visual Basic
Funktionen des Printer Objektes verwendest, kann
Visual Basic nicht erkennen, dass sich etwas auf der
zu druckenden Seite befindet und wird das Drucken
nicht zulassen. Deshalb, musst du irgend eine der
Grafik-Funktionen des Printer-Objektes benutzen, wie
z.B. Line. Erst dann wird das Formular ordnungsgemäß
gedruckt. -
-
-
julianzur schrieb am 23.11.2003 09:15
Ich habe eine einfachere Lösung gefunden!
Einfach Form1.PrintForm eingeben!
lol, das hätten wir dir sicher auch schon früher sagen können. Aber dem Threadersteller ging es ja darum, mehrere Formulare auf ein Blatt zu drucken, bzw. die Daten aufbereitet zu drucken. -
Hallo,
habe die letzten Einträge erst jetzt gelesen. Ist es also doch möglich, mehrere Formulare auf eine Seite zu bringen??? Aber wie nur? Ich versteh das nicht so richtig.
Ich habe es bis jetzt übergangsweise mit dem PRINTFORM-Befehl gelöst. Jedoch ist es nicht schön, wenn ich dann 8 Seiten habe!
Gruss und Danke für Hilfe eines DAUs.
PS: beim PrintForm wird die Statusleiste (sprich mit dem X für Schliessen, Minimieren etc.) nicht mitausgegeben. gibt es da ne möglichkeit, dass diese mitausgedruckt werden?
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „red1825“ ()
-
Ein Screenshot machen, auf die Zwischenablage zugreifen und den Inhalt ausdrucken.
Wenn du das, was du ausdrucken willst, dann nur auf deine Anwendung beschränken willst, kannst du den Teil ja einfach aus dem Screenshot herausschneiden und ausdrucken.
mfG,
MalcolmDieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Malcolm“ ()
-
-
Ähnliche Themen
-
3 Benutzer haben hier geschrieben
- Gast (20)
- Marcus Gräfe (4)
- Agent (1)