Deutsch
Forum

RTF - Print

 

Thomas
Freier
Wollte ein RTF mehrfach auf mehreren Seiten drucken. Ein von Pascal angepasstes Script geht.
KompilierenMarkierenSeparieren
DEMO DRAWRICHTEXT GRÖSSENABFRAGE
window 0,0-400,300
 $H Windows.ph
 $H Messages.ph
 $H RichEdit.ph

proc DrawRichText2---------------------------------------------------------DrawRichText2

    parameters RTF&,PosX%,PosY%,MaxX%,MaxY%--Position + Grösse in Pixeln!
    declare PrinterDpiX%,PrinterDpiY%
    declare WindowDpiX%,WindowDpiY%
    declare fx!,fy!

    if %printing--Bei Druck: %HDC2 = %HDC = &PDC

        ~SetMapMode(%hdc2,1)
        ~SetWindowExtEx(%hdc2,1,1,0)
        ~SetViewPortExtEx(%hdc2,1,1,0)
        PosX%=PosX%+30--Korrektur ???
        PosY%=PosY%+30--Korrektur ???

    endif

    PrinterDpiX%=~GetDeviceCaps(%hdc2,~LOGPIXELSX)--dpi X des Druckers
    PrinterDpiY%=~GetDeviceCaps(%hdc2,~LOGPIXELSY)--dpi X des Druckers
    WindowDpiX%=~GetDeviceCaps(~GetDC(%hwnd),~LOGPIXELSX)--dpi X des Bildschirms (!)
    WindowDpiY%=~GetDeviceCaps(~GetDC(%hwnd),~LOGPIXELSY)--dpi Y des Bildschirms (!)
    PosX%=int(PosX%/WindowDpiX%*1440)
    PosY%=int(PosY%/WindowDpiX%*1440)
    MaxX%=int(MaxX%/WindowDpiX%*1440)
    MaxY%=int(MaxY%/WindowDpiX%*1440)
    declare Range#
    dim Range#,48
    clear Range#
    long Range#, 0=%hdc2,%hdc2
    long Range#, 8=PosX%,PosY%,PosX%+MaxX%,PosY%+MaxY%
    long Range#,24=PosX%,PosY%,PosX%+MaxX%,PosY%+MaxY%
    long Range#,44=-1
    sendmessage(RTF&,~EM_FORMATRANGE,1,Range#)

    if %printing

        fx!=~GetDeviceCaps(%hdc2,~LOGPIXELSX)/300
        fy!=~GetDeviceCaps(%hdc2,~LOGPIXELSY)/300
        ~SetMapMode(%hdc2,~MM_ANISOTROPIC)
        ~SetWindowExtEx(%hdc2,6400,9600,0)
        ~SetViewPortExtEx(%hdc2,int(2200*fx!),int(3300*fy!),0)

    endif

    dispose Range#
    casenot %printing:repaint
    endproc---------------------------------------------------------------------------------
    Print "Bitte warten, der Druck wird vorbereitet!"
    var hFont% = @Create("Font","Arial",20,12,0,0,0)
    declare RtfDll&,RichEdit&
    RtfDll&=usedll("RichEd20.dll")
    RichEdit&=control("RichEdit20A","Test",$500050c4,0,0,0,0,%hwnd,5000,0)
    settext RichEdit&,"Diese RTF-Anwendung läßt mich nicht verzweifeln!"
    SetFont RichEdit&,hFont%
    declare Breite%,Höhe%
    Breite%= 400
    Höhe%= 200
    var    y1%=0
    var    x1%=0
    startprint
    var y%=0

    While y% < 26  ....einfach einmal auf zwei Seiten drucken

        DrawRichText2 RichEdit&,(y1%*4.40),(x1%*4.40),400,200
        inc y%
        y1%=y1% + 105

        if y1%>105

            y1%=0
            x1%=x1%+43

            IF x1%>290

                x1%=0
                NEXTPAGE

            endif

        endif

    wend

    endprint
    destroywindow(RichEdit&)
    waitkey

In meiner, hier stark gekürzten, Anwendung wird der Font auf der zweiten Seite geändert und ich finde den Fehler nicht.
KompilierenMarkierenSeparieren
LABEL-EDIT-DRUCK-E
 $H Windows.ph
 $H Messages.ph
 $H RichEdit.ph

proc DrawRichText2---------------------------------------------------------DrawRichText2

    parameters RTF&,PosX%,PosY%,MaxX%,MaxY%--Position + Grösse in Pixeln!
    declare PrinterDpiX%,PrinterDpiY%
    declare WindowDpiX%,WindowDpiY%
    declare fx!,fy!

    if %printing--Bei Druck: %HDC2 = %HDC = &PDC

        ~SetMapMode(%hdc2,1)
        ~SetWindowExtEx(%hdc2,1,1,0)
        ~SetViewPortExtEx(%hdc2,1,1,0)
        PosX%=PosX%+3--Korrektur ???
        PosY%=PosY%+3--Korrektur ???

    endif

    PrinterDpiX%=~GetDeviceCaps(%hdc2,~LOGPIXELSX)--dpi X des Druckers
    PrinterDpiY%=~GetDeviceCaps(%hdc2,~LOGPIXELSY)--dpi X des Druckers
    WindowDpiX%=~GetDeviceCaps(~GetDC(%hwnd),~LOGPIXELSX)--dpi X des Bildschirms (!)
    WindowDpiY%=~GetDeviceCaps(~GetDC(%hwnd),~LOGPIXELSY)--dpi Y des Bildschirms (!)
    PosX%=int(PosX%/WindowDpiX%*1440)
    PosY%=int(PosY%/WindowDpiX%*1440)
    MaxX%=int(MaxX%/WindowDpiX%*1440)
    MaxY%=int(MaxY%/WindowDpiX%*1440)
    declare Range#
    dim Range#,48
    clear Range#
    long Range#, 0=%hdc2,%hdc2
    long Range#, 8=PosX%,PosY%,PosX%+MaxX%,PosY%+MaxY%
    long Range#,24=PosX%,PosY%,PosX%+MaxX%,PosY%+MaxY%
    long Range#,44=-1
    sendmessage(RTF&,~EM_FORMATRANGE,1,Range#)

    if %printing

        fx!=~GetDeviceCaps(%hdc2,~LOGPIXELSX)/300
        fy!=~GetDeviceCaps(%hdc2,~LOGPIXELSY)/300
        ~SetMapMode(%hdc2,~MM_ANISOTROPIC)
        ~SetWindowExtEx(%hdc2,6400,9600,0)
        ~SetViewPortExtEx(%hdc2,int(2200*fx!),int(3300*fy!),0)

    endif

    dispose Range#
    casenot %printing:repaint
    endproc---------------------------------------------------------------------------------
    #########################################################################################

    Proc Label

        declare x1%,y1%
        Declare rtf#
        Declare x&,x%,y%
        declare Label_m&,RtfDll&,Label_dlg&
        declare a#
        declare LB_form&
        declare RichEdit&
        declare MaxB%,MaxH%
        declare IstB%,IstH%
        declare Pos#
        declare WndProc&
        dim Pos#,8
        dim rtf#,512
        RtfDll&=usedll("RichEd20.dll")
        WINDOWSTYLE 16
        Label_m&=create("Window",%hwnd,"Adresslabelformat: 105x43 ; auf dem Blatt: 7 Zeilen + 2 Reihen",100,50, 640,640)
        usefont "MS Sans Serif",16,0,0,0,0
        setdialogfont 1
        var hFont% = @Create("Font","Arial",20,12,0,0,0)
        var  BP_but4& =@Create("Button",Label_m&,"Drucken",450,554,82,25)
        var  BP_but5& = @Create("Button",Label_m&,"Ende",540,554,82,25)
        .....................................................................RTF-Edit erzeugen
        Label_dlg&=@Control("STATIC","",$5400110E,0,32,624,340,Label_m&,$7918,%hinstance)
        MaxB%=405
        MaxH%=243
        x%= (MaxB%/2) - 50
        Lb_form&=@Control("STATIC","",$5400110E,x%,5,MaxB%/2,20,Label_dlg&,$7918,%hinstance)
        RichEdit&=control("RichEdit20A","",$54005004,33,33,MaxB%,MaxH%,Label_dlg&,5000,0)
        settext RichEdit&,"Diese RTF-Anwendung läßt mich verzweifeln!"
        SetFont RichEdit&,hFont%

        while 1

            WaitInput
            case GetFocus(BP_but5&): break

            If GetFocus(BP_but4&)  ----------------------------Drucken

                y1%=0
                x1%=0
                startprint
                y%=0

                While y% < 26  ....einfach einmal auf zwei Seiten drucken

                    DrawRichText2 RichEdit&,(y1%*4.40),(x1%*4.40),400,200
                    inc y%
                    y1%=y1% + 105

                    if y1%>105

                        y1%=0
                        x1%=x1%+43

                        IF x1%>290

                            x1%=0
                            NEXTPAGE

                        endif

                    endif

                wend

                endprint

            EndIf

        endwhile

        destroywindow(RichEdit&)
        dispose rtf#
        dispose a#
        dispose pos#
        destroywindow(Label_m&)
        freedll RtfDll&

    EndProc

    #########################################################################################
    WINDOWSTYLE 543512+8+2
    Windowtitle "CSV Daten für Adresslabel"
    window 0,0 - 900,600
    Label                       Adresslabel
    destroywindow(%hWnd)
    end

Sieht ihn einer von euch oder hat einen Tip, woran es liegen könnte?
 
Gruß Thomas
Windows XP SP2, XProfan X2
20.08.2008  
 




Dieter
Zornow
Ich denke mal nach jedem nextpage sollte oder muss der Font neu übergeben werden.
Habs nicht getestet, da ich nichts zum ausdrucken habe.
 
Er ist ein Mann wie ein Baum. Sie nennen ihn Bonsai., Win 7 32 bit und Win 7 64 bit, mit XProfan X2
20.08.2008  
 




Thomas
Freier
@ Dieter , ich verwende beim Testen "FreePDF XP".
Der eigentliche Vorgang:
erster dbf Datensatz
die blanko.rtf wird geladen
die Platzhalter (dbf-Feldnamen) werden noch einmal überprüft
dann die entsprechende RTF-Zeile mit den Daten aus der dbf ersetzt
Ausdruck an der vorgesehenen Position.
die RTF gelöscht
nächster dbf Datensatz
die blanko.rtf wird geladen
usw.
so müsste es eigentlich gehen. Leider nur auf der 1. Seite.
 
Gruß Thomas
Windows XP SP2, XProfan X2
20.08.2008  
 




Jörg
Sellmeyer
Daieter hat Recht mit NextPage: [...]  [...] 
 
Windows XP SP2 XProfan X4
... und hier mal was ganz anderes als Profan ...
20.08.2008  
 




Thomas
Freier
@ Jörg, dass du das ausbuddeln würdest war mir klar.
Aber, hier erweitert mit Daten, ergibt das Gewünschte mit "nextpage".
KompilierenMarkierenSeparieren
DEMO DRAWRICHTEXT GRÖSSENABFRAGE
 $H Windows.ph
 $H Messages.ph
 $H RichEdit.ph
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 $I Listview_Funktionen.inc
var lvdll&=usedll("Listview.dll")
Declare bereich#,bytes&,Label_view&,x&,y&,z&,x%
Declare listview&, text$
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Def GetSysColor(1) !"USER32","GetSysColor"
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

proc DrawRichText2---------------------------------------------------------DrawRichText2

    parameters RTF&,PosX%,PosY%,MaxX%,MaxY%--Position + Grösse in Pixeln!
    declare PrinterDpiX%,PrinterDpiY%
    declare WindowDpiX%,WindowDpiY%
    declare fx!,fy!

    if %printing--Bei Druck: %HDC2 = %HDC = &PDC

        ~SetMapMode(%hdc2,1)
        ~SetWindowExtEx(%hdc2,1,1,0)
        ~SetViewPortExtEx(%hdc2,1,1,0)
        PosX%=PosX%+30--Korrektur ???
        PosY%=PosY%+30--Korrektur ???

    endif

    PrinterDpiX%=~GetDeviceCaps(%hdc2,~LOGPIXELSX)--dpi X des Druckers
    PrinterDpiY%=~GetDeviceCaps(%hdc2,~LOGPIXELSY)--dpi X des Druckers
    WindowDpiX%=~GetDeviceCaps(~GetDC(%hwnd),~LOGPIXELSX)--dpi X des Bildschirms (!)
    WindowDpiY%=~GetDeviceCaps(~GetDC(%hwnd),~LOGPIXELSY)--dpi Y des Bildschirms (!)
    PosX%=int(PosX%/WindowDpiX%*1440)
    PosY%=int(PosY%/WindowDpiX%*1440)
    MaxX%=int(MaxX%/WindowDpiX%*1440)
    MaxY%=int(MaxY%/WindowDpiX%*1440)
    declare Range#
    dim Range#,48
    clear Range#
    long Range#, 0=%hdc2,%hdc2
    long Range#, 8=PosX%,PosY%,PosX%+MaxX%,PosY%+MaxY%
    long Range#,24=PosX%,PosY%,PosX%+MaxX%,PosY%+MaxY%
    long Range#,44=-1
    sendmessage(RTF&,~EM_FORMATRANGE,1,Range#)

    if %printing

        fx!=~GetDeviceCaps(%hdc2,~LOGPIXELSX)/300
        fy!=~GetDeviceCaps(%hdc2,~LOGPIXELSY)/300
        ~SetMapMode(%hdc2,~MM_ANISOTROPIC)
        ~SetWindowExtEx(%hdc2,6400,9600,0)
        ~SetViewPortExtEx(%hdc2,int(2200*fx!),int(3300*fy!),0)

    endif

    dispose Range#
    casenot %printing:repaint
    endproc---------------------------------------------------------------------------------

    Proc ErsetzeMultiLine

        Parameters REdit&,Line&
        Declare Index&,Index1&
        Index& = ~sendMessage(REdit&,~EM_LINEINDEX,Line&-1,0)
        Index1& = ~sendMessage(REdit&,~EM_LINEINDEX,Line&,0)
        ~sendmessage(REdit&,~EM_SETSEL,Index&,Index1&)
        ~sendmessage(REdit&,~EM_REPLACESEL,0,addr(c$)) Ersetzt den markierten Text
        Endproc----------------------------------------------------------------------------------
        WINDOWSTYLE 543512+8+2
        Windowtitle "CSV Daten für Adresslabel"
        window 0,0 - 900,600
        AppendMenuBar 3,"   Adresslabel   "
        x&=MixRGBs(GetSysColor(15),$00ffffff)
        listview&=CreateListView(%hwnd,%hinstance,0,x&,-1,$31)
        text$="Pliete.csv"
        bytes&=@FileSize(text$)

        If bytes&>0

            Dim bereich#,bytes&
            ReadFileQuick(addr(text$),bereich#,0,bytes&)
            x&=SetColumnsFromMem(listview&,bereich#,addr(y&))
            CsvToListview(listview&,(bereich#+y&),(bytes&-y&),x&)

        EndIf

        AutoSortListview listview&,1,1,1,1,2,2
        ShowListView(listview&,100,32,754,456)
        Print "Bitte warten, der Druck wird vorbereitet!"
        var hFont% = @Create("Font","Arial",20,12,0,0,0)
        declare RtfDll&,REdit&
        RtfDll&=usedll("RichEd20.dll")
        REdit&=control("RichEdit20A","Test",$500050c4,0,0,0,0,%hwnd,5000,0)
        RTF("LoadRTF",REdit&,"Aufkleber Brief.rtf")
        x%=3
        declare c$
        declare Breite%,Höhe%
        Breite%= 800
        Höhe%= 400
        var    y1%=0
        var    x1%=0
        startprint
        y&=0

        While y& < 226  ....einfach einmal auf zwei Seiten drucken

            c$="Herrn"+"
            "
            ErsetzeMultiLine(REdit&,4)Zeile ersetzen
            GetItemText(listview&,bereich#,1,y&)
            c$=String$(bereich#,0)
            GetItemText(listview&,bereich#,2,y&)
            c$=c$ + " " + String$(bereich#,0) + "
            "
            ErsetzeMultiLine(REdit&,5)Zeile ersetzen
            GetItemText(listview&,bereich#,11,y&)
            c$=String$(bereich#,0) + "
            "
            ErsetzeMultiLine(REdit&,6)Zeile ersetzen
            GetItemText(listview&,bereich#,9,y&)
            c$=String$(bereich#,0)
            GetItemText(listview&,bereich#,10,y&)
            c$=c$ + " " + String$(bereich#,0) + "
            "
            ErsetzeMultiLine(REdit&,8)Zeile ersetzen
            DrawRichText2 REdit&,(y1%*4.40),(x1%*4.40),400,200
            inc y&
            y1%=y1% + 105

            if y1%>105

                y1%=0
                x1%=x1%+43

                IF x1%>290

                    x1%=0
                    NEXTPAGE

                endif

            endif

        wend

        endprint
        WaitInput
        destroywindow(REdit&)
        dispose bereich#
        destroywindow(%hWnd)
        freedll lvdll&
         $I Listview_Dispose.inc

Habe aber noch einen code gefunden:
KompilierenMarkierenSeparieren
StartDoc(PrinterDC&,DocInfo#)

Whilenot OR(iTextOut& >= iTextLength&,itextOut& = -1)

    StartPage(PrinterDC&)
    Long FormatRange#,44 = -1
    iTextOut& = SendMessage(RichEdit&, 1081, 1, FormatRange#)
    Long FormatRange#,40 = iTextOut&
    SendMessage(RichEdit&,1075,0,cRect#)
    EndPage(PrinterDC&)

Wend

EndDoc(PrinterDC&)

den ich ausprobieren werde.
 
Gruß Thomas
Windows XP SP2, XProfan X2
21.08.2008  
 




Thomas
Freier
@Jörg, ich hoffe mein Kommentar war nicht zu hart. Aber UseFont darf eigentlich auf den Font in der RTF auch beim Drucken oder erzwungenem Seitenwechsel keinen Einfluß nehmen. Obwohl, bei XProfan ist das nicht gewiss. Eine A5 RTF wird beim Speichern zu einer A4 RTF. Warum??? Genaues wird wohl nur Roland wissen.
Hat nicht einer einen Tip, wie ein Seitenwechsel erzwungen wird, außer Druckersteuerzeichen zu senden?
 
Gruß Thomas
Windows XP SP2, XProfan X2
22.08.2008  
 



Antworten


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

1.416 Betrachtungen

Unbenanntvor 0 min.
Uwe Lang20.06.2023
Member 361000501.12.2022
H.Brill08.02.2022
RudiB.06.11.2021
Mehr...

Themeninformationen



Admins  |  AGB  |  Anwendungen  |  Autoren  |  Chat  |  Datenschutz  |  Download  |  Eingangshalle  |  Hilfe  |  Händlerportal  |  Impressum  |  Mart  |  Schnittstellen  |  SDK  |  Services  |  Spiele  |  Suche  |  Support

Ein Projekt aller XProfaner, die es gibt!


Mein XProfan
Private Nachrichten
Eigenes Ablageforum
Themen-Merkliste
Eigene Beiträge
Eigene Themen
Zwischenablage
Abmelden
 Deutsch English Français Español Italia
Übersetzungen

Datenschutz


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie