Inhalt mehrerer Formulare drucken

  • VB6

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!
    Besucht auch mein anderes Forum:
    Das Amateurfilm-Forum

    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!
    Besucht auch mein anderes Forum:
    Das Amateurfilm-Forum
    Danke mal. Mit Replace sollte das ja auch gehen. Hab ich bereits gefunden. Trotzdem Danke.

    ja und wie mache ich das mit den automatischen screenshots. Der andere weg wäre alles mit Printer.print und den dementsprechenden Formatierungen auszugeben. ist aber sehr aufwendig und schlecht pflegbar.
    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.
    Besucht auch mein anderes Forum:
    Das Amateurfilm-Forum
    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>
    Hallo!
    Ich bin ein Anfänger und habe das oben erlärte nich so ganz verstanden. Ich möchte nämlich genau ein Screenshot von Projett ausdrucken. Es sollte für den Anwender relativ einfach sein (am besten einfach nur auf Drucken klicken).
    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.
    Besucht auch mein anderes Forum:
    Das Amateurfilm-Forum
    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,

    Malcolm

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Malcolm“ ()