Drucken Problem

  • Hallo,

    Ich habe mir mehrere Inputs erstellt und er soll den Inhalt Drucken.

    Aber mit welchen befehl mach ich das am besten das man auch einstellen kann wie er drucken soll oben,unten mitte...

    Er erstelt erst eine Datei und dann wird das geschriebene Zeugs reingeschrieben und wird dann gedruckt gibt es auch andere Möglichkeiten wenn ja welche wenn nein was ist dann besser .ini,.doc.... , wie kann ich das am besten Lösen ???

    Das Skript sollte auf allen windows Rechner funktionieren !


    Hoffentlich könnt ihr mir helfen :)

  • Ja danke für die Antwort aber man braucht darfür Word gibt es eine andere Möglichkeit?

  • Hallo PowerRash,

    herzlich willkommen im Forum und viel Spass mit AutoIt.

    Hier kannst du dir die deutsche Hilfe herunterladen.
    Hier gibt es ein AutoIt-Tutorial: http://wiki.autoit.de/wiki/index.php/TutorialSehr hilfreich ist auch das Buch von peethebee

    und jetzt zu deiner Frage: da es auf allen Windows-Rechnern funktionieren soll scheidet Word leider aus, du solltest dich also mit der "GuiRichEdit Benutzerdefinierte Funktion Referenz" auuseinander setzen, z.B.:

    [autoit]

    _GUICtrlRichEdit_InsertText

    [/autoit]

    .
    Vielleicht hilft dir aber auch [ offen ] Bild drucken weiter, vor allem die Posts von @progandy lesen,

    mfg autoBert


    mfg autoBert

  • Ja wie kann ich das mit der _GUICtrlRichEdit machen, das man einstellen kann wie man druckt, ich blicke da nicht durch, ich gucke mir die ganzen Befehle an und frage mich wie das jetzt gehen soll :)

    Gibt es den kein Tutorial darüber?

  • Wenn du den Text in Inputboxen hattest, dann brauchst du nicht extra ein RichEdit.
    Bastel dir einfach einen String zusammen und schau dir an, wie in PrintDemoText.au3 ein einfacher Text gedruckt wird.

  • Ja gut, aber wie bastel ich mir ein String mit RichEdit ?

    Über ein kleines beispiel würde ich mich sehr freuen :)

  • Hast du jetzt ein RichEdit oder nicht in deinem bisherigen Programm? Wenn du keines hast, dann mach dir das Drucken nicht schwerer dadurch , dass du es einbaust.
    Das einfachste ist es immer noch, normalen Text ohne Formatierungen zu drucken. Einfach einen normalen String
    z.B. "Meine Erste Zeile" & @CRLF & "Zweite Zeile" schreiben und den Drucken. Dafür hast du ja schon ein vollständiges Beispiel.

    Edit: Wenn ich mich Recht erinnere hab ich mal für das scintilla-Control mal einen Druckdialog geschrieben. Der müsste sich fast 1:1 auf ein Richedit übertragen lassen. Ich hab nur für die nächsten 3 Wochen keinen Zugriff darauf.

  • Also hier mal mein Quellcode:


    Spoiler anzeigen
    [autoit]


    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include <File.au3>
    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Test", 518, 259, 192, 124)
    $Label1 = GUICtrlCreateLabel("Adresse", 48, 136, 42, 17)
    $InputName = GUICtrlCreateInput("", 192, 72, 281, 21)
    $Label2 = GUICtrlCreateLabel("Name", 56, 72, 32, 17)
    $InputAdresse = GUICtrlCreateInput("", 192, 136, 281, 21)
    $Button1 = GUICtrlCreateButton("Drucken", 104, 200, 307, 49)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit

    [/autoit] [autoit][/autoit] [autoit]

    Case $Button1

    [/autoit] [autoit][/autoit] [autoit]

    _FileCreate("Druckentest.ini")
    FileWrite("Druckentest",GUICtrlRead($InputName)& GUICtrlRead($InputAdresse))
    _FilePrint("Druckentest.ini")

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    EndSwitch
    WEnd

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit]

    Ich möchte wenn ich Adresse und Name eingegeben habe das er mir dann in bestimmten Positionen druckt z.b der Name soll mittig gedruckt werden Adresse soll oben links gedruckt werden!
    Wie mache ich jetzt das er mittig druckt mit GuiRich?

  • Dafür würde ich kein RichEdit nehmen, denn das wird nicht einfach, auf eine Seite einzupassen für 2 Strings.

    Für das Drucken bekommst du einen hDC, einen DeviceContext. Darauf kannst du jetzt beliebig mit z.B. _GDI_TextOut Text positionnieren. Wie du an die Seitenränder kommst, sollte in den Druckbeispielen ersichtlich sein.

  • Ja und wie baue ich das jetzt in mein Skript um so das es funktioniert?
    Den Quellcode den ich geposted habe war ja nur ein beispiel bei mein normalen Skript habe ich mehrere Inputboxen insgesamt 12 stück und ich möchte das er dann von der
    Erste Inputbox den Inhalt ganz oben druckt , den 2. mittig druckt... 15. ...
    Bitte Korigiere mal den Quellcode so wie du das jetzt meinst das ich das jetzt in zusammenhang mit mein Beispiel Skript verstehe weil ich weiß jetzt nicht wie ich das jetzt machen soll.

  • Ich hab mal ein Beispiel gemacht, wie das ungefähr geht:

    Spoiler anzeigen
    [autoit]

    #include<GDI.au3>
    #include<Memory.au3>
    #include<Misc.au3>

    [/autoit] [autoit][/autoit] [autoit]

    ; Aktuell sind ein paar Strukturen nicht korrekt für 64bit
    #AutoIt3Wrapper_usex64=n

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $sAddress = "Mars Mensch" & @CRLF & "Krater 12" & @CRLF & "00000 Hinterm Mond"
    $sName = "Erd Ling"

    [/autoit] [autoit][/autoit] [autoit]

    ; show Printer dialog
    $PrinterStruct = _GDI_PrintDlg()
    If @error Then
    ; on error free all memory possibly allocated by _GDI_PrintDlg
    If DllStructGetData($PrinterStruct, "hDC") Then _GDI_DeleteDC(DllStructGetData($PrinterStruct, "hDC"))
    _MemGlobalFree(DllStructGetData($PrinterStruct, 3))
    _MemGlobalFree(DllStructGetData($PrinterStruct, 4))
    Exit ; then Exit
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    ; get the DC handle for Printer DC
    Local $pDC = DllStructGetData($PrinterStruct, "hDC")
    If $pDC Then
    ; If it is a valid DC then print

    [/autoit] [autoit][/autoit] [autoit]

    $TotalHeight = _GDI_GetDeviceCaps($pDC, $PHYSICALHEIGHT) ; the total height of the page in pixels
    $TotalWidth = _GDI_GetDeviceCaps($pDC, $PHYSICALWIDTH) ; the total wodth in pixels
    $PrintOffsetX = _GDI_GetDeviceCaps($pDC, $PHYSICALOFFSETX) ; x-offset of printable area
    $PrintOffsetY = _GDI_GetDeviceCaps($pDC, $PHYSICALOFFSETY) ; y-offset of printable area
    $PrintableWidth = _GDI_GetDeviceCaps($pDC, $HORZRES) ; the printable width
    $PrintableHeight = _GDI_GetDeviceCaps($pDC, $VERTRES) ; the printable height
    If $PrintOffsetX = 0 Then ; at least 50 px border
    $PrintOffsetX = 50
    $PrintableWidth -= 100
    EndIf
    If $PrintOffsetY = 0 Then ; at least 50 px border
    $PrintOffsetY = 50
    $PrintableHeight -= 100
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    ; set Info for Document (title shown in Print Spooler)
    $DocumentInfo = DllStructCreate($tagDOCINFO)
    DllStructSetData($DocumentInfo, 1, DllStructGetSize($DocumentInfo))
    $DocName = _PrintUDF_CreateTextStruct("Test Doc") ; we need an extra struct for the text
    DllStructSetData($DocumentInfo, "lpszDocName", DllStructGetPtr($DocName)) ; set the text-pointer to the Infostruct

    [/autoit] [autoit][/autoit] [autoit]

    ; Structure for printing of multiple pages
    $DRAWTEXTPARAMS = DllStructCreate($tagDRAWTEXTPARAMS)
    DllStructSetData($DRAWTEXTPARAMS, 1, DllStructGetSize($DRAWTEXTPARAMS)) ; initialise ParamStruct
    DllStructSetData($DRAWTEXTPARAMS, 2, 4) ; set size of tabstob to 4 characters

    [/autoit] [autoit][/autoit] [autoit]

    ; start printing
    _GDI_StartDoc($pDC, $DocumentInfo)

    [/autoit] [autoit][/autoit] [autoit]

    ; Choose a font
    $Font = _ChooseFont("Arial", 12)
    ;If no font chosen (Cancel), set default values:
    If Not IsArray($Font) Then Dim $Font[8] = [7, 0, "Arial", 11, 400, 0, "000000", "000000"]

    [/autoit] [autoit][/autoit] [autoit]

    ; set font color
    _GDI_SetTextColor($pDC, $Font[5])
    ; create font and set it as default in printer DC
    $hFont = _GDI_CreateFont(_FonSizePT($pDC, $Font[3]), 0, 0, 0, $Font[4], BitAND($Font[1], 2) = 2, BitAND($Font[1], 4) = 4, BitAND($Font[1], 8) = 8, 1, $OUT_TT_PRECIS, $CLIP_DEFAULT_PRECIS, $ANTIALIASED_QUALITY, $DEFAULT_PITCH, $Font[2])
    $hOldFont = _GDI_SelectObject($pDC, $hFont)

    [/autoit] [autoit][/autoit] [autoit]

    _GDI_StartPage($pDC)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ; rectangel in wich to print text
    $RECT = DllStructCreate($tagRECT)

    [/autoit] [autoit][/autoit] [autoit]

    ; calculate size of rectangle for address
    _GDI_DrawTextEx($pDC, $sAddress, $RECT, BitOR($DT_NOPREFIX, $DT_TABSTOP, $DT_CALCRECT), $DRAWTEXTPARAMS, StringLen($sAddress))

    [/autoit] [autoit][/autoit] [autoit]

    ; move the rectanglge to the ocrrect position
    DllStructSetData($RECT, 1, $PrintOffsetX + $PrintableWidth - DllStructGetData($RECT, 3)) ; left border: x-offset
    DllStructSetData($RECT, 2, $PrintOffsetY) ; top border: y-offset
    DllStructSetData($RECT, 3, $PrintOffsetX + $PrintableWidth) ; top border: y-offset
    DllStructSetData($RECT, 4, $PrintOffsetY + DllStructGetData($RECT, 4)) ; top border: y-offset
    _GDI_DrawTextEx($pDC, $sAddress, $RECT, BitOR($DT_NOPREFIX, $DT_TABSTOP), $DRAWTEXTPARAMS, StringLen($sAddress))

    [/autoit] [autoit][/autoit] [autoit]

    ; draw singleline text centered in whole page
    DllStructSetData($RECT, 1, $PrintOffsetX) ; left border: x-offset
    DllStructSetData($RECT, 2, $PrintOffsetY) ; top border: y-offset
    DllStructSetData($RECT, 3, $PrintOffsetX + $PrintableWidth) ; width: printable width
    DllStructSetData($RECT, 4, $PrintOffsetY + $PrintableHeight); width: printable height
    _GDI_DrawTextEx($pDC, $sName, $RECT, BitOR($DT_SINGLELINE, $DT_CENTER, $DT_VCENTER, $DT_NOPREFIX, $DT_TABSTOP), $DRAWTEXTPARAMS, StringLen($sName))

    [/autoit] [autoit][/autoit] [autoit]

    _GDI_EndPage($pDC)

    [/autoit] [autoit][/autoit] [autoit]

    ; delete font -> clean up resources
    _GDI_SelectObject($pDC, $hOldFont)
    _GDI_DeleteObject($hFont)

    [/autoit] [autoit][/autoit] [autoit]

    ; end printing, printer can now print your Doc
    _GDI_EndDoc($pDC)

    [/autoit] [autoit][/autoit] [autoit]

    EndIf
    ; free memory allocated by _GDI_PrintDlg
    _MemGlobalFree(DllStructGetData($PrinterStruct, 3))
    _MemGlobalFree(DllStructGetData($PrinterStruct, 4))

    [/autoit] [autoit][/autoit] [autoit]

    ; calcualte font size for printer (from MSDN)
    ; by Prog@ndy
    Func _FonSizePT($pDC, $Pt)
    Return -_MulDiv($Pt, _GDI_GetDeviceCaps($pDC, $LOGPIXELSY), 72)
    EndFunc ;==>_FonSizePT
    ; Function to muliply and divide in ine step, from MSDN
    ; by Prog@ndy
    Func _MulDiv($nNumber, $nNumerator, $nDenominator)
    Local $res = DllCall("Kernel32.dll", "int", "MulDiv", "int", $nNumber, "int", $nNumerator, "int", $nDenominator)
    If @error Then Return SetError(1, 0, 0)
    Return $res[0]
    EndFunc ;==>_MulDiv

    [/autoit]
  • Danke es klappt, so wollte ich das haben jetzt nur eine frage wo kann man jetzt die positionen ändern?
    Ich hätte da so eine ahnung:

    [autoit]


    _GDI_DrawTextEx($pDC, $sAddress, $RECT, BitOR($DT_NOPREFIX, $DT_TABSTOP), $DRAWTEXTPARAMS, StringLen($sAddress))

    [/autoit]

    Bei der Zeile kann man doch die Position von der Adresse ändern oder?
    Wenn ja woher weiß ich jetzt die bestimmten variablen für mitte, unten etc.

    • Offizieller Beitrag

    Die Ahnung geht in die richtige Richtung, genau dadrüber liegt der Hund begraben. ;)
    Die von dir angeführte Befehlszeile druckt aus. In den Zeilen dadrüber ( DllStructSetData($RECT, .... ) wird der Druckbereich in Form eines Rectangle (Rechteck) festgelegt.
    Die heute gängigen Drucker drucken nicht in Zeilen und Spalten - sie drucken Bilder. Aus diesem Grund wird das Rechteck in dem das Textabbild dargestellt wird definiert.
    Ausnahmen findest du in Form von Typenraddruckern oder Nadeldruckern meist in Arztpraxen zum Rezeptdruck. Die Dinger kann man noch richtig hardcodiert mit Zeile & Spalte ansprechen.

    Spiele einfach mal mit den Werten für das Rectangle - dann merkst du am Besten, wie es funktioniert.

  • Also hier kann man die positionen von der Adresse ändern:

    [autoit]


    DllStructSetData($RECT, 1, $PrintOffsetX + $PrintableWidth - DllStructGetData($RECT, 3)) ; left border: x-offset
    DllStructSetData($RECT, 2, $PrintOffsetY) ; top border: y-offset
    DllStructSetData($RECT, 3, $PrintOffsetX + $PrintableWidth) ; top border: y-offset
    DllStructSetData($RECT, 4, $PrintOffsetY + DllStructGetData($RECT, 4)) ; top border: y-offset

    [/autoit]


    Er druckt die Adresse oben rechts aber meine frage ist woher weiß er das er an diese stelle drucken soll, ich weiß das sind die $PrintOffsetX,$PrintOffsetY.. Geschichten aber ich weiß jetzt nicht wenn
    ich die Variable $PrintOffsetY was dann passiert sprich die bedeutung!

    Ich würde mich freuen wenn einer mal etwas Zeit nimmt und mir das über Skype,... zu erklären.

  • Also, du hast z.B. ein A4-Blatt. Dein Drucker kann jetzt nicht randlos drucken, sondern hat Seitenränder. PrintOffsetX ist der linke Seitenrand, PrintOffsetY der obere Seitenrand.
    Da das Rechteck über 2 Punkte definiert wird und nicht durch einen Punkt und Breite + Höhe, ist beim 2. Punkt ebenfalls der Offset addiert.

    Durch den DrawText-Aufruf mit $DT_CALCRECT wurde in der Zeile davor die nötige Größe des Rechtecks bestimmt.
    In den von dir zitierten Zeilen wird nun das Rechteck verschoben:
    - nach rechts bis an den Rand des druckbaren Bereichs
    - und von oben an den Start des druckbaren Bereichs.

    PS: Die Angaben sind standardmäßig alle in Pixeln.

  • ThPfund Du hättest autoBerts's Beitrag genauer durchlesen sollen ;). Darin steht nämlich ein Link zu progandys Beitrag wo du auch die GDI.au3 findest.

    "The requested URL /PHPCVS/AutoIT/GDI_UDF/ was not found on this server."