Hallo EBFE,
habe Ihre Druckroutine für ein Richedit1-Steuerelement umgegeschrieben. Funktioniert gut. Schicke sie Ihnen mit. Bekomme sie aber nur sehr unübersichtlich in das Fenster.
Mit freundlichen Grüßen
Paulchen
name Drucken
title "Text ausdrucken"
Drucken PROTO
PrintSetup PROTO

WORD,:DWORD
X_MAX equ 120 ;Breite linker Seitenrand
Y_MAX equ 20
.data
FontName db "MS Sans Serif",0
X DWORD X_MAX
Y DWORD Y_MAX
.code
align 4
Drucken proc
LOCAL pd:PRINTDLG ;Struktur für Printdialog
LOCAL DocInfo:DOCINFO ;Struktur für StartDoc
LOCAL LFont: TEXTMETRIC
LOCAL hFont:HANDLE ;Handle Schriftart
LOCAL buffer[130]:BYTE ;I/O für Zeile
LOCAL AnzZeilen:DWORD ;Anzahl Zeilen
LOCAL ZeilenIndex:DWORD ;Zeilennummer im Control
LOCAL LgPfad:DWORD ;L'Pfad der Datei
LOCAL AnzKopien:DWORD ;Anzahl Kopien
LOCAL ZProSeite:DWORD ;Zeilen pro Seite
mov AnzZeilen,0 ;Anzzahl Zeilen im Control löschen
mov ZeilenIndex,0 ;Zeilennummer im Control löschen
mov ZProSeite,0 ;Zeilen pro Seite löschen
invoke SendMessage,hWnd,WM_GETTEXTLENGTH,0,0 ;L'Fenstername holen
mov LgPfad,eax ;Länge sichern
invoke PrintSetup, ADDR pd,hWnd ;Struktur für Printdialog füllen
invoke PrintDlg,addr pd ;Printdialog aufrufen
cmp eax,0 ;Abbruch?
je druckende ;ja
;
;*** Schriftart 'MS Sans Serif' erzeugen
;
invoke Font,50,0,0,0,FW_LIGHT,FALSE,FALSE,FALSE,ANSI_CHARSET,0,0,\
DEFAULT_QUALITY,0,addr FontName ;Schriftart MS Sans Serif erzeugen
mov hFont,eax ;Handle Schriftart
;
;*** Struktur DOCINFO versorgen
;
mov DocInfo.cbSize, sizeof DOCINFO ;L' der Struktur DOCINFO
mov eax, offset szFileName ;Pfadname
mov DocInfo.lpszDocName, eax
mov DocInfo.lpszOutput, NULL
mov DocInfo.lpszDatatype, NULL
mov DocInfo.fwType, 0
invoke GetTextMetrics, pd.hDC, ADDR LFont ;Metrische Eigenschaften der Schriftart bestimmen
invoke SendMessage,hRichEd,EM_GETLINECOUNT,0,0 ;Anz. Zeilen im Steuerelement holen
mov AnzZeilen,eax ;Anzahl Zeilen sichern
;
;*** Druckauftrag starten
;
invoke StartDoc,pd.hDC,addr DocInfo
mov AnzKopien,0 ;Anzahl der Kopien
print_loop:
invoke StartPage,pd.hDC ;neue Seite
invoke SelectObject,pd.hDC,hFont ;selektiere Gerätekontext
mov X,X_MAX
mov Y,Y_MAX
mov eax,LgPfad
invoke TextOut,pd.hDC,X,Y,addr szFileName,eax ;Pfad der Datei
mov eax, Y
add eax, LFont.tmHeight
add eax, LFont.tmExternalLeading
add eax, LFont.tmHeight
mov Y, eax
text_loop:
mov WORD PTR [buffer],128 ;max. Zeilenlänge
invoke SendMessage,hRichEd,EM_LINELENGTH,ZeilenIndex,0 ;Zeilenlänge holen
invoke SendMessage,hRichEd,EM_GETLINE,ZeilenIndex,ADDR buffer ;Zeile lesen
sub eax,2 ;wahrscheinlich am Ende der Zeile X'OD0A'
invoke TextOut,pd.hDC,X,Y,ADDR buffer,eax ;Zeile ausgeben
mov eax, Y
add eax, LFont.tmHeight
add eax, LFont.tmExternalLeading
mov Y, eax
inc ZeilenIndex ;Index Zeilennummer + 1
inc ZProSeite ;Zeile pro Seite + 1
cmp ZProSeite,62 ;62 Zeilen pro Seite?
jne text_loop10 ;nein
invoke EndPage,pd.hDC ;Ende der Seite
mov ZProSeite,0 ;Zähler pro Seite auf 0
jmp print_loop ;neue Seite
text_loop10:
mov eax,ZeilenIndex ;ZeilenIndex
cmp eax,AnzZeilen ;alle Zeilen gedruckt?
jng text_loop ;nein
invoke EndPage,pd.hDC ;Ende der Seite
invoke EndDoc,pd.hDC ;Ende Druckauftrag
invoke DeleteDC,pd.hDC ;lösche Gerätekontext
.if pd.hDevMode != NULL
invoke GlobalFree,pd.hDevMode
.endif
.if (pd.hDevNames != NULL)
invoke GlobalFree,pd.hDevNames
.endif
druckende:
ret
Drucken endp