da musstes dir mal raussuchen... (die includierten .PBI´s darf ich wg.
Einspruch vom Chef nicht rausgeben...)...
Code: Alles auswählen
;Modul Drucker_init Version 3.2 vom 21.11.2007
;
;Funktion: Drucker-Initierung, Kopfzeilen-Ausdruck, Druck-Unterstützung und -Abschluß,
; das Ganze seit Version 3.0 basierend auf API-Funktionen (PB-DruckFunktionen
; bieten keinen Zugriff auf PrintRequester-Vorgaben...)
;
;Aufruf: drucken.l = Drucker_Init(Titel$) die Drucker-Auswahl & -Initierung
;wobei: Titel$ = Überschrift des Ausdruck´s (Kopfzeilen werden generell ausgegeben:
; 1. Zeile = FirmenName (lt. Lizenz-Daten: 1. Name und 2. Name)
; 2. Zeile = dieser hier übergebene Titel
; 3. Zeile = Stand und SeitenNr )
; Der Aufbau der Kopfzeilen kann via Prg. "DruckKopf" vielfältig eingestellt
; werden...
; Folgende globalen Eingangs-Variablen werden hier berücksichtigt:
; Prt_Seite = aktuelle SeitenNr-1
; Prt_Rand = linker Rand vom Papierrand [mm], incl. nicht bedruckbarer Papier-Bereich !!!
; ist nach Funktions-Rückkehr immer in Dot´s umgerechnet
; !!! alte Norm !!! benutze nun Prt_RandX1_mm !!!
; Prt_Oben = oberer Rand vom Papierrand (incl. nicht bedruckbarer Papier-Bereich!!!)
; überhalt der Kopfzeilen, (ist nach Funktions-Rückkehr immer in Dot´s
; umgerechnet)
; !!! alte Norm !!! benutze nun Prt_RandY1_mm !!!
; Prt_OutFile$ = DateiName für Umlenkung Drucker-Ausgabe (nach Druck-Abschluß
; {Funktion Prt_Exit()} wird die erzeugte BMP-Datei angezeigt, es
; !! wird nicht´s gedruckt !!!)
; Prt_OutSize$ = Größe der Ausgabe-Datei (Wort-Format: Breite und Höhe {Dot´s])
; nur, wenn auch Prt-Outfile$ angegeben ist !!!
; wenn nicht angegeben, so wird Monitor-Breit und doppelte Monitor-Höhe
; benutzt)
; Prt_NoHead = wenn ungleich 0, so wird kein Standart-SeitenKopf ausgedruckt
; Prt_NoStatus = wenn ungleich 0, so wird die Statuszeile ("Stand: <datum> <Zeit>, Seite..."
; _nicht_ ausgedruckt
; Prt_MultiPage= wenn ungleich 0, so wird beim Ausdruck im Quer-Format eine Doppel-Seite
; (zwei Druck-Seiten nebenainander auf einer Papier-Seite) ausgegeben
; (zur Generierung von 2 DIN-A-5-Seiten auf 1 DIN-A-4-Seite...)
; Prt_RandX1mm = linker Papierrand [mm]
; Prt_RandY1mm = oberer Papierrand [mm]
; Prt_RandX9mm = rechter Papierrand [mm]
; Prt_RandY9mm = unterer Papierrand [mm]
; Nach FunktionsEnde sind -sofern nicht abgebrochen- folgende Variablen belegt:
; Prt_Hdl = Drucker-Handle
; Prt_Breit = bedruckbare Papier-Breite [Dot´s] !! ohne Ränder-Berücksichtingung !!
; Prt_Tief = bedruckbare Papier-Höhe [Dot´s] !! ohne Ränder-Berücksichtingung !!
; Prt_mmX = bedruckbare Papier-Breite [mm] !! ohne Ränder-Berücksichtingung !!
; Prt_mmY = bedruckbare Papier-Höhe [mm] !! ohne Ränder-Berücksichtingung !!
; Prt_X, Prt_Y = aktuelle DruckKopfPosition [Dot´s]
; Prt_SizeX = bedruckbare Papier-Breite !!incl. Ränder-Berücksichtingung !!
; Prt_SizeY = bedruckbare Papier-Breite !!incl. Ränder-Berücksichtingung !!
; Prt_Seite = SeitenZähler
; Prt_Rand = linker DruckRand [Dot´s]
; Prt_Oben = oberer DruckRand [Dot´s]
; Prt_xFakt.f = Dot´s je Eingangs-Einheit Breit
; Prt_yFakt.f = Dot´s je Eingangs-Einheit Höhe
; Prt_FontNr = aktuell aktiver DruckerFont (lt. Prt_Font())
; Prt_Color = FarbFähigkeit des Druckers (0=sw/ws, <>0=farbig)
; Prt_LastTitel$ = zuletzt benutzter Druckkopf-Titel
; Prt_OutImage = Ausgabe-BildNr (OutFile$- oder DruckBuffer-Image, auf Diesem erfolgen alle
; Ausgaben, erst bei Seiten- oder DruckEnde wird Dieses zur Datei bzw. zum
; Drucker kopiert...)
; Prt_RandX1 = linker Papierrand [Dot´s], nicht bedruckbar
; Prt_RandY1 = oberer Papierrand [Dot´s], nicht bedruckbar
; Prt_RandX9 = rechter Papierrand [Dot´s], nicht bedruckbar
; Prt_RandY9 = unterer Papierrand [Dot´s], nicht bedruckbar
; Prt_RandX1_mm= linker Papierrand [mm], nicht bedruckbar
; Prt_RandY1_mm= oberer Papierrand [mm], nicht bedruckbar
; Prt_RandX9_mm= rechter Papierrand [mm], nicht bedruckbar
; Prt_RandY9_mm= unterer Papierrand [mm], nicht bedruckbar
; Prt_MitteX = Papier-Mitte incl. nicht bedruckbarer Ränder [Dot´s]
; Prt_MitteY = Papier-Mitte incl. nicht bedruckbarer Ränder [Dot´s]
; Prt_MultiPage = aktuelle Seitenhälften-Nr (2 DruckSeiten je PapierSeite)
; Prt_MP_MitteX = PapierMitte X im MultiPage-Mode
; Prt_MP_X1$ = Rand-Positonen der DruckSeiten in Wort-Format
;
; ---------- FontDefinitonen ----------
; Die folgenden Variablen enthalten Daten für FontDefinitionen (Belegung via
; Funktion Prt_LontLoad(Nr, Define$), siehe unten). Einige Standart-Fonts sind
; in Prg. "DruckKopf" definierbar und werden hier auch eingelesen
#DruckKopf_Fonts = 2 ;Anzahl Standart-Font s von Prg. "DruckKopf", erreichbar
; via Index 1 (=1. Standart-Font) und 2 (=2. Standart-Font), erweiterbar
; via Funktion "Prt_LoadFont(...)".
#maxPrtFont = 16 ;max. Anzahl Drucker-Font´s
; Prt_FontID(?) = Standart-Font-ID (z.B. für DwawFont(Prt_FontID(x)
; Prt_FontNr(?) =LoadFont-Nr des geladenen Font´s
; Prt_FontName$(?) = Bezeichnung des Standart-Fornt´s
; Prt_FontSize(?) ;Fontgröße in DOT´s
; Prt_FontAtt$(?) ;F=Fett K=Kursiv U=unterstrichen
; Prt_FontAtt(?) ;als Zahlenwert
; Prt_Abst.f(?) ;ZeilenAbstand [% of FontHöhe]
;
;
;========== die Druck-Funktionen ==========
;
;Aufruf: Prt_FontLoad(Nr,Definition) läd einen Zeichensatz (wird !!nicht!! aktiviert !!!)
;wobei: Definition$ = Definition eines Font´s, wortweise: Name, Größe, Attribute
; (nummerisch oder als KennBuchatabe(n) {F=Fett(256), K=Kursiv(512) und/oder
; U=unterstrichen(4)} und Abstand [% of ZeilenHöhe(50...200)], wenn nicht
; angegeben, so wird 100% benutzt.
; Es wird der definierte Font aufbereitet und eingelesen, die oben angeführten
; Variablen werden entsprechend belegt, !!! der Font wird _nicht_ aktiviert !!!
;Aufruf: Prt_Font(Nr) - aktiviert einen zuvor geladenen Zeichensatz
; es wird der Font Nr aktiviert (muß zuvor via Prt_FontLoad(Nr,definition)
; definiert sein !!!
;Aufruf: Prt_TextOut(X, Y, Text$): - Text mit RandPrüfung ausgeben
; der Text$ wird an dr durch X/Y angegebenen Position ausgegeben, wobei ein ggf.
; überlanger Text mit getrenntem Zeilen-Umbruch (Umbruch bei Leer- bzw. Sonder=
; zeichen...). Ist X < 0 oder Y <0, wo wird der entsprechende Wert aus den globalen
; Variablen Prt_X und/oder Prt_Y benutzt. Diese Variabelen werden auch entsprechend
; der Text-Ausgabe gepflegt (stehen nach DunktionsEnde am Anfang der nächsten Druck=
; zeile)
;Aufruf: Prt_NewLine() - aktuelle Drucker-Textzeile abschließen, ggf. neue Seite...
; es wird eine neue DruckZeile angelegt: Prt_X und Prt_Y werden umgesetzt und
; der Drucker-Cursor positioniert, Die ZeilenHöhe ergibt sich aus dem zuletzt benutzen
; Font (lt. Funktion Prt_Font) mit PrT_Abst(?) beim ZeilenVorschub)
; Beim Seiten-Überlauf wird eine neue Seite angelegt und der Druckkopf wird dort
; ausgegeben...
;Aufruf: Prt_NewPage() - neue Drucker-Seite aufbauen
;Aufruf: Prt_ZeilHoch() liefert FontHöhe [Dot´s] aktueller Font auf aktuellem Drucker
;Aufruf: Drucker_Exit() schließt Ausdruck ab, wirft Seite aus / zeigt letzte Seite an
;
;Aufruf: DruckKopf(Titel$) Ausgabe des Standart-Druckkopfes (incl. Firma, Stand, Seite...)
;wobei: Titel$ = Überschrift des Ausdruck´s, wenn nur Fragezeichen ("?"), so wird der zuletzt
; ausgedruckte (also wie bei Drucker_Init()) Seiten-Titel ausgedruckt.
; es wird eine neue Seite angelegt mit Ausdruck des DruckKopfes, der DruckCursor
; wird auf den Beginn der 1. DruckZeile unterhalb des DruckKopfes gesetzt und es
; wird der Standart-Font #1 aktiviert
;
;Aufruf: PRT_TextHoch(hDC) liefert FontHöhe [[Dot´s] aktueller Font auf bestimmtem AusgabeKanal
Global Prt_Hdl ;Drucker-Hanlding
Global Prt_Breit ;bedruckbare Papier-Breite [Dot´s] !! ohne Ränder-Berücksichtingung !!
Global Prt_Tief ;bedruckbare Papier-Höhe [Dot´s] !! ohne Ränder-Berücksichtingung !!
Global Prt_mmX ;bedruckbare Papier-Breite [mm] !! ohne Ränder-Berücksichtingung !!
Global Prt_mmY ;bedruckbare Papier-Höhe [mm] !! ohne Ränder-Berücksichtingung !!
Global Prt_X, Prt_Y ;aktuelle DruckKopfPosition [Dot´s]
Global Prt_SizeX ;bedruckbare Papier-Breite !!incl. Ränder-Berücksichtingung !!
Global Prt_SizeY ;bedruckbare Papier-Breite !!incl. Ränder-Berücksichtingung !!
Global Prt_Seite ;SeitenZähler
Global Prt_Rand ;linker DruckRand (Eingang: [mm], Ausgang: [Dot´s], !!! alte Norm !!! benutze nun Prt_RandX1_mm !!!
Global Prt_Oben ;oberer DruckRand (Eingang: [mm], Ausgang: [Dot´s], !!! alte Norm !!! benutze nun Prt_RandX1_mm !!!
Global Prt_xFakt.f ;Dot´s je Eingangs-Einheit Breit
Global Prt_yFakt.f ;Dot´s je Eingangs-Einheit Höhe
Global Prt_FontNr ;aktuell aktiver DruckerFont (lt. Prt_Font())
Global Prt_Color ;FarbFähigkeit des Druckers (0=sw/ws, <>0=farbig)
Global Prt_LastTitel$ ;zuletzt benutzter Druckkopf-Titel
Global Prt_Outfile$ ;Ausgabe-Datei (wenn leer: Drucker-Ausgabe)
Global Prt_OutSize$ ;Größe der Ausgabe-Datei (Wort-Format: Breite und Höhe {Dot´s])
Global Prt_OutImage ;Ausgabe-Bild (alle Ausgaben erfolgen auf diesem Image, erst bei
;Seiten- / Druck-Ende wird´s zur Datei oder Drucker kopiert...)
Global Prt_RandX1 ;linker Papierrand [Dot´s], nicht bedruckbar
Global Prt_RandY1 ;oberer Papierrand [Dot´s], nicht bedruckbar
Global Prt_RandX9 ;rechter Papierrand [Dot´s], nicht bedruckbar
Global Prt_RandY9 ;unterer Papierrand [Dot´s], nicht bedruckbar
Global Prt_RandX1_mm ;linker Papier-Rand [mm]
Global Prt_RandX9_mm ;rechter Papier-Rand [mm]
Global Prt_RandY1_mm ;oberer Papier-Rand [mm]
Global Prt_RandY9_mm ;unterer Papier-Rand [mm]
Global Prt_MitteX ;Papier-Mitte incl. nicht bedruckbarer Ränder [Dot´s]
Global Prt_MitteY ;Papier-Mitte incl. nicht bedruckbarer Ränder [Dot´s]
Global Prt_MultiPage ;aktuelle Seitenhälften-Nr (mehrere DruckSeiten je PapierSeite)
Global Prt_MP_MitteX ;PapierMitte X im MultiPage-Mode
Global Prt_MP_X1$ ;Rand-Positonen der DruckSeiten in Wort-Format
Global Prt_noHead ;Steuerung: wenn ungleich 0: kein Standart-Seitenkopf aufbauen
Global Prt_noStatus ;Steuerung: wenn ungleich 0: keine Statuszeile ausdrucken (Stand, SeitenNr...)
Dim Prt_FontID(#maxPrtFont) ;Font-ID (z.B. für DwawFont(Prt_FontID(?))
Dim Prt_FontName$(#maxPrtFont) ;Font-Namen
Dim Prt_FontSize(#maxPrtFont) ;Fontgröße in DOT´s
Dim Prt_FontAtt$(#maxPrtFont) ;Font-Attribute (F=Fett K=Kursiv U=unterstrichen)
Dim Prt_FontAtt(#maxPrtFont) ;Font-Attribute als Zahlenwert
Dim Prt_FontNr(#maxPrtFont) ;LoadFont-Nr
Dim Prt_Abst.f(#maxPrtFont) ;ZeilenAbstand [% of FontGröße (=Höhe)]
XIncludeFile "C:\AlsterSoft\PureBasic\Module\FontSet.PBI"
XIncludeFile "C:\AlsterSoft\PureBasic\Module\Registry.PBI"
XIncludeFile "C:\AlsterSoft\PureBasic\Module\Lizenz.PBI"
XIncludeFile "C:\AlsterSoft\PureBasic\Module\TrimAll.PBI"
XIncludeFile "C:\AlsterSoft\PureBasic\Module\max.PBI"
XIncludeFile "C:\AlsterSoft\PureBasic\Module\min.PBI"
XIncludeFile "C:\AlsterSoft\PureBasic\Module\freeFont.PBI"
XIncludeFile "C:\AlsterSoft\PureBasic\Module\freeBildNr.PBI"
XIncludeFile "C:\AlsterSoft\PureBasic\Module\trennen.PBI"
XIncludeFile "C:\AlsterSoft\PureBasic\Module\DruckerRequester.PBI"
Procedure PRT_TextHoch(hdc) ;- liefert FontHöhe aktueller Font auf bestimmtem AusgabeKanal
tm.TEXTMETRIC
PrevMapMode=SetMapMode_(hdc,#mm_text)
GetTextMetrics_(hdc,tm)
If PrevMapMode : SetMapMode_(hdc,PrevMapMode) : EndIf
Debug "ZeilHoch="+Str(tm\tmHeight)
ProcedureReturn tm\tmHeight
;ProcedureReturn tm\tmMaxCharWidth
EndProcedure
Procedure Prt_ZeilHoch() ;- liefert ZeilenHöhe aktueller Font auf aktuellem Drucker
ProcedureReturn PRT_TextHoch(Prt_Hdl)
EndProcedure
Procedure Prt_Font(Nr) ;- Druck-Font aktivieren
Nr=Max(1,Min(#maxPrtFont,Nr))
If Prt_FontID(Nr) : DrawingFont(Prt_FontID(Nr)) : Prt_FontNr=Nr : EndIf
Debug "aktiviere Font #"+Str(Nr)+" ("+Prt_FontName$(Nr)+") = "+Str(Prt_FontID(Nr))
EndProcedure
Procedure Prt_FontLoad(Nr,Define$) ;- Druck-Font laden
Nr=Max(1,Min(#maxPrtFont,Nr))
If Define$>""
Debug "load Prt-Font #"+Str(Nr)+" ("+Define$+")"
Prt_Fonts=Max(Prt_Fonts,Nr)
Prt_FontName$(Nr)=Wort(@Define$) ;1. Font-Name
Prt_FontSize(Nr)=Val(Wort(@Define$)) ;2. Font-Höhe
Prt_FontAtt$(Nr)=Wort(@Define$) ;3. Atribut (F, K und/oder U)
If Trim(Define$)=""
Define$="100"
EndIf
Prt_Abst(Nr)=Val(Define$)/100 ;4. Abstand (% of realHight)
If Val(Prt_FontAtt$(Nr))
Prt_FontAtt(Nr)=Val(Prt_FontAtt$(Nr))
Else
Prt_FontAtt(Nr)=FontAtt(Prt_FontAtt$(Nr))
EndIf
If Prt_FontNr(Nr)=0
Prt_FontNr(Nr)=FreeFont(0)
EndIf
Prt_FontID(Nr)=LoadFont(Prt_FontNr(Nr),Prt_FontName$(Nr),Prt_FontSize(Nr),Prt_FontAtt(Nr))
Debug "Prt-Font "+Str(Nr)+": Nr="+Str(Prt_FontNr(Nr))+", ID="+Str(Prt_FontID(Nr))
EndIf
EndProcedure
Procedure Prt_ImageReset() ;- Ausgabe-Bild resten (weißer Hintergrund)
UseImage(Prt_OutImage)
FrontColor($FF,$FF,$FF) ;weiss
BackColor($FF,$FF,$FF) ;weiss
Box(0,0,Prt_Breit,Prt_Tief) ;Blatt einweisen
FrontColor(0, 0, 0) ;Schreibfarbe = schwarz
EndProcedure
Procedure Prt_PagePrint() ;- Buffer-Bild auf Drucker übertragen, Seite abschließen
Protected BildID
SetBkMode_(Prt_DC,#OPAQUE)
BitBlt_(Prt_DC,0,0,Pap_Br,Pap_Ti, Prt_Hdl,0,0,#SRCCOPY )
Debug "PagePrint: #"+Str(BildID)+" ("+Str(Prt_Breit)+" x "+Str(Prt_Tief)+") --> "
Debug " #"+Str(Prt_DC)+" ("+Str(Pap_Br)+" x "+Str(Pap_Ti)+")"
Debug ""
EndPage_(Prt_DC);Seite abschliessen
Prt_ImageReset() ;Bild löschen (für nächset Seite...)
EndProcedure
Declare DruckKopf(Prt_Titel$)
Procedure Prt_NewPage() ;- Seitenwechsel
If Prt_MultiPage
Prt_MultiPage+1 : If Prt_MultiPage>2 : Prt_MultiPage=1 : EndIf
Ctrl$=Prt_MP_X1$ : For i=1 To Prt_MultiPage : Prt_Rand=Val(Wort(@Ctrl$)) : Next
Debug "MultiPage: ---------- setze Rand auf "+Str(Prt_Rand)+" ----------"
EndIf
If Prt_MultiPage<2
If Prt_Outfile$>"" ;aktuelle Seite als BMP-Datei speichern
SaveImage(Prt_OutImage,CharChg(Prt_Outfile$,".","_Seite_"+Str(Prt_Seite-Prt_MultiPage)+"."))
Prt_ImageReset()
Else
Prt_PagePrint() ;Image ausdrucken, Seite abschließen
StartPage_(Prt_DC);neue Seite anlegen
EndIf
If Prt_MultiPage
LineXY(Prt_MP_MitteX,0,Prt_MP_MitteX,Prt_Tief) ;MultiPage-TrennLinie
EndIf
EndIf
DruckKopf("?")
EndProcedure
Procedure Prt_NewLine() ;- setzt Prt_X und Prt_Y auf nächste Zeile lt. aktuellem Font, incl. SeitenVorschub
Protected Ctrl$,hoch
Debug "newLine (mit #"+Str(Prt_FontNr)+" ("+Prt_FontName$(Prt_FontNr)+" ,Abst="+StrF(Prt_Abst(Nr),2)+")"
hoch=Round(Prt_ZeilHoch()*Prt_Abst(Prt_FontNr),1)
Prt_Y+hoch
If Prt_Y>Prt_Tief ;/========== Seiten-Vorschub ==========
Prt_NewPage()
Else
Prt_X=Prt_Rand
Locate(Prt_X,Prt_Y)
Debug "Prt_NewLine rdy"
EndIf
EndProcedure
Procedure Prt_TextOut(PT_X, PT_Y, PT_Txt$) ;- Text mit RandPrüfung ausgeben
Protected TrennPos
If PT_X<0 : PT_X=Prt_X : EndIf
If PT_Y<0 : PT_Y=Prt_Y : EndIf
Locate(PT_X,PT_Y)
While PT_Txt$>""
TrennPos=Len(PT_Txt$)+1
Debug "TextOut at "+Str(PT_X)+"/"+Str(PT_Y)+": "+PT_Txt$+": Len="+Str(TextLength(PT_Txt$))+", Breit="+Str(Prt_SizeX)
While TextLength(Left(PT_Txt$,TrennPos))>Prt_SizeX : TrennPos-1 : Wend
Debug "TextOut: "+Left(PT_Txt$,TrennPos-1)+"<"+Mid(PT_Txt$,TrennPos,1)+">"+Mid(PT_Txt$,TrennPos+1,9999)
DrawText(trennen(@PT_Txt$,TrennPos))
If PT_Txt$>""
Prt_NewLine()
Locate(PT_X,PT_Y)
PT_Y=Prt_Y
EndIf
Wend
EndProcedure
Procedure DruckKopf(Prt_Titel$) ;- Seiten-Kopf ausdrucken
Protected Prt_Firma$,Prt_Status$,RegData$,Prt_KopfData$
Protected Prt_LineLen,passt, Prt_Font, ChgStep
Prt_Y=Prt_Oben ;Drucker-Position (Anz. Dot´s vom oberen PapierRand)
Prt_X=Prt_Rand
Prt_Seite+1
If Prt_noHead=0
If Prt_Titel$="?" : Prt_Titel$=Prt_LastTitel$ : EndIf : Prt_LastTitel$=Prt_Titel$
;KopfZeilen-Daten zusammenbauen
If Lizenz_Name1$(0)="" : Lizenz("") : EndIf
Prt_maxSize=Max(Val(RegistryRead("DruckKopf","maxSize")),60)
Prt_Firma$=TrimAll(Lizenz_Name1$(0)+" "+lizenz_name2$(0))
Prt_Status$="Stand: "+FormatDate("%dd.%mm.%yyyy, %hh:%ii", Date())+" Uhr"
Prt_KopfData$=" Font_Firma "+Chr(255)+Prt_Firma$+Chr(255)
Prt_KopfData$+" Font_Titel "+Chr(255)+Prt_Titel$+Chr(255)
Prt_KopfData$+" Font_Status "+Chr(255)+Prt_Status$
Debug "Firma=<"+Prt_Firma$+">"
Debug "Titel=<"+Prt_Titel$+">"
Debug "State=<"+Prt_Status$+">"
If Prt_FontNr(0)=0 : Prt_FontNr(0)=FreeFont(0) : EndIf
UseImage(Prt_OutImage)
DrawingMode(1) ;transparent
While Prt_KopfData$>""
RegData$=RegistryRead("DruckKopf",Wort(@Prt_KopfData$)) ;1. KopfDataWort: Registry-Key Zeilen-Prt_Font
Prt_Firma$=Wort(@Prt_KopfData$) ;2. KopfData-Wort: DatenZeile
Prt_FontName$(0)=Wort(@RegData$) ;1. Prt_Font-Wort= Prt_Font-Name
Prt_FontSize(0)=Val(Wort(@RegData$)) ;2. Prt_Font-Wort= Prt_Font-Höhe
Prt_FontAtt(0)=FontAtt(Wort(@RegData$)) ;3. Prt_Font-Wort= Atribut (F, K und/oder U)
Prt_Abst(0)=Val(RegData$)/100 ;4. Prt_Font-Wort= ZeilenAbstand [% od FontHöhe]
passt=0 : ChgStep=5 : ChgMode=0
If Prt_KopfData$>"" Or Prt_noStatus=0
Repeat ;Kopfzeilen über geammte Papier-Breite: Schriftgröße anpassen
Prt_FontID(0)=LoadFont(Prt_FontNr(0),Prt_FontName$(0),Prt_FontSize(0),Prt_FontAtt(0))
DrawingFont(Prt_FontID(0))
Prt_LineLen=TextLength(Prt_Firma$)
If Prt_KopfData$="" : passt=1 ;Status (Datum, Seite...) nicht anpassen (siehe unten)
ElseIf Prt_LineLen<Prt_SizeX*0.9 ;Schriftgröße vergrößern
Prt_FontSize(0)+ChgStep : ChgMode|1 : If ChgMode=3 And ChgStep>1 : ChgStep-1 : EndIf
ElseIf Prt_LineLen>Prt_SizeX ;Schriftgröße verkleinern
Prt_FontSize(0)-ChgStep : ChgMode|2 : If ChgMode=3 And ChgStep>1 : ChgStep-1 : EndIf
Else : passt=1
EndIf
Until passt=1 Or Prt_KopfData$="" Or Prt_FontSize(0)>=Prt_maxSize Or Prt_FontSize(0)<10
If Prt_KopfData$="" : Prt_FontSize(0)=Max(Prt_FontSize(0),Prt_Breit/50) : EndIf
Prt_FontSize(0)=Min(Prt_FontSize(0),Prt_maxSize)
Prt_FontID(0)=LoadFont(Prt_FontNr(0),Prt_FontName$(0),Prt_FontSize(0),Prt_FontAtt(0))
DrawingFont(Prt_FontID(0))
Prt_LineLen=TextLength(Prt_Firma$)
If Prt_KopfData$>"" ;Prt_Firma & Titel: Papier-mittig ausrichten
While TextLength(Prt_Firma$)<Prt_SizeX : Prt_Firma$=" "+Prt_Firma$+" " : Wend
While TextLength(Prt_Firma$)>Prt_SizeX And Len(Prt_Firma$)>10 : Prt_Firma$=Left(Prt_Firma$,Len(Prt_Firma$)-1) : Wend
Else ;StatusZeile: Seite anhängen
Prt_Status$="Seite "+Str(Prt_Seite)
While TextLength(Prt_Firma$+Prt_Status$)<Prt_SizeX : Prt_Firma$+" " : Wend
While TextLength(Prt_Firma$+Prt_Status$)>Prt_SizeX And Len(Prt_Firma$)>10 : Prt_Firma$=Left(Prt_Firma$,Len(Prt_Firma$)-1) : Wend
Prt_Firma$+Prt_Status$
EndIf
;DruckKopf positionieren und Zeile drucken
Debug "drucke ab "+Str(Prt_X)+"/"+Str(Prt_Y)+": "+Prt_Firma$
Prt_TextOut(Prt_X,Prt_Y,Prt_Firma$)
hoch=Round(Prt_ZeilHoch()*Prt_Abst(0),1)
Prt_Y+hoch
EndIf
Wend
EndIf
If Prt_noStatus : Prt_Y-hoch+Prt_ZeilHoch() : EndIf ;ohne StatusZeile: volle ZeilenHöhe TitelZeile setzen
Locate(Prt_X,Prt_Y)
Prt_Font(1) ; 1. Standart-Font aktivieren
EndProcedure
Procedure StartPrint(PrintJobName$);- startet Wiondows-DruckerJob (replaced PB-"StartPrinting()"
Protected mDI.DOCINFO
mDI\cbSize = 12
mDI\lpszDocName = @PrintJobName$
mDI\lpszOutput = 0
StartDoc_(Prt_DC,mDI)
EndProcedure
Procedure Drucker_Init(Prt_Titel$) ;- Drucker-Auswahl, Kopfzeilen
Protected i,Prt_SetupQueue$,Prt_RegData$
Prt_Breit=0 : Prt_Tief=0 : Prt_Hdl=0 : Prt_Seite=0
If Prt_Outfile$>"" ;Ausgabe in .BMP-Datei (spez. für PrgTest´s zum Papier-sparen....)
If FindString(Prt_Outfile$,".",1)=0 : Prt_Outfile$+".BMP" : EndIf
If Prt_OutSize$>""
Prt_Breit=Val(Wort(@Prt_OutSize$))
Prt_Tief=Val(Prt_OutSize$)
EndIf
If Prt_Breit<10 : Prt_Breit=GetSystemMetrics_(#SM_CXSCREEN)-80 : EndIf ;80=X-Ränder of Prg. MsPaint
If Prt_Tief<10 : Prt_Tief=GetSystemMetrics_(#SM_CYSCREEN)*2 : EndIf
Prt_Color=1 ;Farbe möglich
Prt_OutImage=FreeBildNr(0)
CreateImage(Prt_OutImage, Prt_Breit, Prt_Tief)
Prt_Hdl=StartDrawing(ImageOutput())
Prt_mmX = GetDeviceCaps_(Prt_Hdl,#HORZSIZE) ;bedruckbare PapierHöhe [mm]
Prt_mmY = GetDeviceCaps_(Prt_Hdl,#VERTSIZE) ;bedruckbare PapierTiefe [mm]
Prt_RandX1=0 : Prt_RandX9=0 : Prt_RandY1=0 : Prt_RandY9=0 ; Outfile: keine physikalischen Ränder !!!
Prt_MitteX = Prt_Breit/2
Prt_MitteY = Prt_Tief/2
Prt_ImageReset()
Debug "Outfile="+Prt_Outfile$+": "+Str(Prt_Breit)+" * "+Str(Prt_Tief)
Else ;- Ausgabe auf Drucker via Image-File (ohne PB-DruckFnc´s)
Prt_RegKey$ = "Drucker" ;load&save Prt_Copys, Prt_Orient, Prt_DPI & Prt_isColor von/in Registry
If DruckerRequester()
Prt_Color=Prt_isColor-1
StartPrint(Prt_Titel$)
StartPage_(Prt_DC);neue Seite anlegen
Prt_Tief = Pap_Ti
Prt_Breit = Pap_Br
Prt_OutImage=FreeBildNr(0)
If CreateImage(Prt_OutImage, Prt_Breit, Prt_Tief)=0
MessageRequester("Anforderung Druck-Speicher fehlgeschlagen !!!", Str(Prt_Breit)+" x "+Str(Prt_Tief)+" Pixel = "+Str(Prt_Breit*Prt_Tief/1024)+" KB", #MB_OK|#MB_ICONWARNING)
End
EndIf
Prt_Hdl=StartDrawing(ImageOutput())
Prt_ImageReset()
Prt_mmX = GetDeviceCaps_(Prt_Hdl,#HORZSIZE) ;bedruckbare PapierHöhe [mm]
Prt_mmY = GetDeviceCaps_(Prt_Hdl,#VERTSIZE) ;bedruckbare PapierTiefe [mm]
; Prt_DotX = GetDeviceCaps_(Prt_Hdl,#HORZRES) ;bedruckbare PapierHöhe [Pixel]
; Prt_DotY = GetDeviceCaps_(Prt_Hdl,#VERTRES) ;bedruckbare PapierTiefe [Pixel]
Prt_RandX1 = GetDeviceCaps_(Prt_Hdl,#PHYSICALOFFSETX) ;linker Papierrand [Pixel]
Prt_RandY1 = GetDeviceCaps_(Prt_Hdl,#PHYSICALOFFSETY) ;oberer Papierrand [Pixel]
Prt_RandX9 = GetDeviceCaps_(Prt_Hdl,#PHYSICALWIDTH)-Prt_Breit-Prt_RandX1 ;rechter Papierrand [Pixel]
Prt_RandY9 = GetDeviceCaps_(Prt_Hdl,#PHYSICALHEIGHT)-Prt_Tief-Prt_RandY1 ;unterer Papierrand [Pixel]
Debug "PrtSize="+Str(Prt_Breit)+" * "+Str(Prt_Tief)+" Pixel (="+Str(Prt_mmX)+"*"+Str(Prt_mmY)+"mm)"
EndIf
If Win_T>10 And Win_B>10
ResizeWindow(Win_B,Win_T)
Delay(100) ;wait for Window-Refresh (wg. empty Space unter PrinterRequerster)
EndIf
EndIf
Prt_MitteX = (Prt_RandX1+Prt_Breit+Prt_RandX9)/2-Prt_RandX1
Prt_MitteY = (Prt_RandY1+Prt_Tief+Prt_RandY9)/2-Prt_RandY1
Prt_xFakt=Prt_Breit/Prt_mmX : Prt_yFakt=Prt_Tief/Prt_mmY ;Faktoren: Dot´s je mm
If Prt_Rand>0 : Prt_RandX1_mm=Prt_Rand : EndIf ;alte Norm: vorgegebener linker Rand [mm]
If Prt_Oben>0 : Prt_RandY1_mm=Prt_Oben : EndIf ;alte Norm: vorgegebener oberer Rand [mm]
If Prt_RandX1_mm : Prt_RandX1 = Max(0,Prt_RandX1_mm*Prt_xFakt-Prt_RandX1) : EndIf
If Prt_RandX9_mm : Prt_RandX9 = Max(0,Prt_RandX9_mm*Prt_xFakt-Prt_RandX9) : EndIf
If Prt_RandY1_mm : Prt_RandY1 = Max(0,Prt_RandY1_mm*Prt_yFakt-Prt_RandY1) : EndIf
If Prt_RandY9_mm : Prt_RandY9 = Max(0,Prt_RandY9_mm*Prt_yFakt-Prt_RandY9) : EndIf
Prt_Rand = Prt_RandX1 ;Prt_Rand nun in Pixel´s
Prt_Oben = Prt_RandY1 ;Prt_Oben nun in Pixel´s
Prt_SizeX=Prt_Breit-Prt_RandX1;-Prt_RandX9
Prt_SizeY=Prt_Tief-Prt_RandY1;-Prt_RandY9
Debug "Prt_SizeX = "+Str(Prt_SizeX)+" (Breit="+Str(Prt_Breit)+", Ränder="+Str(Prt_RandX1)+" / "+Str(Prt_RandX9)+")"
;/---------- MehrSeiten-Ausgabe (mehrere Ausgabe-Seiten auf einer Papier-Seite) ----------
If Prt_MultiPage
If Prt_Breit>Prt_Tief ;QuerFormat: Papier-Seite halbieren
Prt_MP_MitteX=(Prt_RandX1+Prt_Breit+Prt_RandX9)/2-Prt_RandX1
Debug "set MultiMode: Mitte="+StrF(Prt_MP_MitteX/Prt_xFakt)+", Rand1="+StrF(Prt_RandX1/Prt_xFakt)+", Breit="+StrF(Prt_Breit/Prt_xFakt)+", Rand9="+StrF(Prt_RandX9/Prt_xFakt)
LineXY(Prt_MP_MitteX,0,Prt_MP_MitteX,Prt_Tief) ;TrennLinie
If Prt_Rand
Prt_MP_X1$=Str(Prt_Rand)+" "+Str(Prt_MP_MitteX+Prt_Rand-Prt_RandX9)
Debug "Rand: 0="+StrF(Prt_Rand/Prt_xFakt)+" 1="+StrF((Prt_MP_MitteX+Prt_Rand-Prt_RandX9)/Prt_xFakt)
Else
Prt_MP_X1$="0 "+Str(Prt_MP_MitteX+Prt_RandX1)
EndIf
Prt_SizeX=Prt_SizeX/2-Prt_RandX1
Prt_Breit=Prt_Breit/2-Prt_RandX1
Prt_MultiPage=1
Else
Prt_MultiPage=0
EndIf
EndIf
If Prt_Hdl ;/---------- DruckKopf ausgeben, Standart-Font´s aufbereiten & laden ----------
For i=1 To #DruckKopf_Fonts ; via Prg. DruckKopf definierte Standart-Fonts einlesen
Prt_RegData$=RegistryRead("DruckKopf","Font_Standart"+Str(i))
Prt_FontLoad(i,Prt_RegData$)
Next
Debug "call DruckKopf ("+Prt_Titel$+")"
DruckKopf(Prt_Titel$)
EndIf
ProcedureReturn Prt_Hdl ;wenn 0: kein Druck möglich
EndProcedure
Procedure Drucker_Exit() ;- Druck-Abschluss
Protected Filename$, i, FileMask$
If Prt_Hdl
If Prt_Outfile$>"" ;BMP-Output nun anzeigen
If Prt_Seite>1 ;ggf. mehrere Seiten (=Dateien)
Filename$=CharChg(Prt_Outfile$,".","_Seite_"+Str(Prt_Seite)+".")
Else
Filename$=Prt_Outfile$
EndIf
If SaveImage(Prt_OutImage,Filename$)
If Prt_Seite>1 ;generierte .BMP-Dateien in MsPaint-FilesListe eintragen
#Paint_FilesList = "Software\Microsoft\Windows\CurrentVersion\Applets\Paint\Recent File List"
FileMask$=GetPathPart(Filename$)+GetFilePart(Prt_Outfile$) ;vollständige DateiNamensMaske aufbauen
For i=1 To Min(8,Prt_Seite-1)
If Reg_CreateKey (#HKEY_CURRENT_USER, #Paint_FilesList, "")
Reg_SetValue (#HKEY_CURRENT_USER, #Paint_FilesList,"File"+Str(i),CharChg(FileMask$,".","_Seite_"+Str(i)+"."),#REG_SZ, "")
Debug "FilesList: <File "+Str(i)+"> = <"+CharChg(FileMask$,".","_Seite_"+Str(i)+".")+">"
EndIf
Next
If Prt_Seite>8
For i=Max(9,Prt_Seite-9) To Prt_Seite
If Reg_CreateKey (#HKEY_CURRENT_USER, #Paint_FilesList, "")
Reg_SetValue (#HKEY_CURRENT_USER, #Paint_FilesList,"File"+Str(i),CharChg(FileMask$,".","_Seite_"+Str(i)+"."),#REG_SZ, "")
EndIf
Next
EndIf
EndIf
RunProgram("mspaint",Filename$,"",1)
SetForegroundWindow_(WindowID())
EndIf
DeleteFile(Filename$)
Prt_Seite-1
While Prt_Seite
DeleteFile(CharChg(Prt_Outfile$,".","_Seite_"+Str(Prt_Seite)+"."))
Prt_Seite-1
Wend
Else ;-Image-Datei ausdrucken
Prt_PagePrint() ;Image ausdrucken, Seite abschließen
EndDoc_(Prt_DC) ;Ausdruck beenden (repcae of PB-"StopPrinting()")
EndIf ;nun noch alle Steuerungen und Resourcen reseten...
StopDrawing()
FreeImage(Prt_OutImage)
FreeBildNr(Prt_OutImage)
Prt_Outfile$ = "" : Prt_OutImage=0 : Prt_noStatus = 0 : Prt_MultiPage = 0 : Prt_Seite = 0 : Prt_noHead = 0
For i=0 To Prt_Fonts : If Prt_FontNr(i) : FreeFont(Prt_FontNr(i)) : EndIf : Next
EndIf
EndProcedure
Code: Alles auswählen
;Modul DruckerRequester Version 1.3 vom 28.08.2007
;
;Funktion: Auswahl / Einstellungen eines Druckers mit Vorgabe
; (entspricht dem Standart-PrinterRequester, jedoch können diverse
; Einstellungen vorgegeben oder ausgeblendet werden...
;
;Aufruf: Handle = DruckerRequester() - Drucker-Auswahl incl. speziellem Setup-Handling
; zuvor können folgende Variablen belegt werden:
; Prt_Copys = Anzahl Kopien
; Prt_Orient = Papier-Orientierung (1=HochFormat 2=QuerFormat)
; Prt_Page1 = SeitenNr 1. Seite ---\
; Prt_Page9 = SeitenNr letzte Seite >--- für Einstellung "von Seite" und "bis Seite"
; Prt_MaxPage= max. SeitenZahl ---/
; Prt_DPI = DruckQualität (je nach Drucker 150, 300, 600.. Dot´s per Inch)
; Prt_isColor= Farbdruck (1=einfarbig {schwarz} 2=Farbig)
; Prt_UseLast= wenn ungleich 0, so wird kein Requester aufgebaut (benutzt dann die
; Einstellungen vom letzen Aufruf mit Prt_LastUse=0)
; Prt_RegKey$= Registry-Schlüßel für programmindividuelle Einstellungs-Speicherung
; (wenn Prt_RegKey$>"", so werden Prt_Copys, Prt_Orient, Prt_DPI und
; Prt_isColor aus Registry geholt/geschrieben (#Prg_Name\Prt_RegKey$),
; und vor FunktionsAufruf gesetzte Einstellungen werden ignoriert...
; Diese Variablen sind nach FunktionsEnde entsprechend den vorgenommenen
; Einstellungen belegt...
;
; Wenn die Drucker-Auswahl / -Einstellung abgebrochen wurde, so wird ein
; Null-Wert geliefert, ansonsten das Handle des gewählten Druckers.
;
Structure PRINTDLG_TYPE
lStructSize.l
hwndOwner.l
hDevMode.l
hDevNames.l
hdc.l
flags.l
nFromPage.w
nToPage.w
nMinPage.w
nMaxPage.w
nCopies.w
hInstance.l
lCustData.l
lpfnPrintHook.l
lpfnSetupHook.l
lpPrintTemplateName.s
lpSetupTemplateName.s
hPrintTemplate.l
hSetupTemplate.l
EndStructure
Structure DEVNAMES_TYPE
wDriverOffset.w
wDeviceOffset.w
wOutputOffset.w
wDefault.w
extra.b[100]
EndStructure
Structure DEVMODE_TYPE
dmDeviceName.b[32]
dmSpecVersion.w
dmDriverVersion.w
dmSize.w
dmDriverExtra.w
dmFields.l
dmOrientation.w
dmPaperSize.w
dmPaperLength.w
dmPaperWidth.w
dmScale.w
dmCopies.w
dmDefaultSource.w
dmPrintQuality.w
dmColor.w
dmDuplex.w
dmYResolution.w
dmTTOption.w
dmCollate.w
dmFormName.b[32]
dmUnusedPadding.w
dmBitsPerPel.w
dmPelsWidth.l
dmPelsHeight.l
dmDisplayFlags.l
dmDisplayFrequency.l
EndStructure
Structure PAGESETUPDLG
lStructSize.l
hwndOwner.l
hDevMode.l
hDevNames.l
flags.l
ptPaperSize.POINT
rtMinMargin.RECT
rtMargin.RECT
hInstance.l
lCustData.l
lpfnPageSetupHook.l
lpfnPagePaintHook.l
lpPageSetupTemplateName.s
hPageSetupTemplate.l
EndStructure
#DM_DUPLEX = $1000
#DM_ORIENTATION = $1
#PD_ALLPAGES = $0
#PD_COLLATE = $10
#PD_DISABLEPRINTTOFILE = $80000
#PD_ENABLEPRINTHOOK = $1000
#PD_ENABLEPRINTTEMPLATE = $4000
#PD_ENABLEPRINTTEMPLATEHANDLE = $10000
#PD_ENABLESETUPHOOK = $2000
#PD_ENABLESETUPTEMPLATE = $8000
#PD_ENABLESETUPTEMPLATEHANDLE = $20000
#PD_HIDEPRINTTOFILE = $100000
#PD_NONETWORKBUTTON = $200000
#PD_NOPAGENUMS = $8
#PD_NOSELECTION = $4
#PD_NOWARNING = $80
#PD_PAGENUMS = $2
#PD_PRINTSETUP = $40
#PD_PRINTTOFILE = $20
#PD_RETURNDC = $100
#PD_RETURNDEFAULT = $400
#PD_RETURNIC = $200
#PD_SELECTION = $1
#PD_SHOWHELP = $800
#PD_USEDEVMODECOPIES = $40000
#PD_USEDEVMODECOPIESANDCOLLATE = $40000
#PSD_DEFAULTMINMARGINS ;minimal einstellbarer Rand (ignored if the #PSD_MARGINS And PSD_MINMARGINS gesetzt)
#PSD_DISABLEMARGINS ;Disables the margin controls, preventing the user from setting the margins.
#PSD_DISABLEORIENTATION;Disables the orientation controls, preventing the user from setting the page orientation
#PSD_DISABLEPAGEPAINTING;Prevents the dialog box from drawing the contents of the sample page. If you enable a
;PagePaintHook hook procedure, you can still draw the contents of the sample page.
#PSD_DISABLEPAPER ;Disables the paper controls, preventing the user from setting page parameters such as the
;paper size And source.
#PSD_DISABLEPRINTER;Disables the Printer button, preventing the user from invoking a dialog box that contains
;additional printer setup information.
#PSD_ENABLEPAGEPAINTHOOK ;Enables the hook Procedure specified in the lpfnPagePaintHook member.
#PSD_ENABLEPAGESETUPHOOK ;Enables the hook Procedure specified in the lpfnPageSetupHook member.
#PSD_ENABLEPAGESETUPTEMPLATE;Indicates that the hInstance And lpPageSetupTemplateName members specify a dialog
;box template To use in place of the Default template.
#PSD_ENABLEPAGESETUPTEMPLATEHANDLE ;Indicates that the hPageSetupTemplate member identifies a Data block that
;contains a preloaded dialog box template. The system ignores The
;lpPageSetupTemplateName member If ;this flag is specified.
#PSD_INHUNDREDTHSOFMILLIMETERS ;Indicates that hundredths of millimeters are the unit of measurement For
;margins And paper size. The values in the rtMargin, rtMinMargin, And
;ptPaperSize members are in ;hundredths of millimeters. You can set this flag on
;input To override the Default unit of measurement For the user's locale. When
;the function returns, the dialog box sets this ;flag To indicate the units used.
#PSD_INTHOUSANDTHSOFINCHES ;Indicates that thousandths of inches are the unit of measurement For margins And paper
;size. The values in the rtMargin, rtMinMargin, And ptPaperSize members are in
;thousandths of inches. You can set this flag on input To override the Default unit of
;measurement For the user's locale. When the function returns, the dialog box sets this
;Flag To indicate the units used.
#PSD_INWININIINTLMEASURE ;Not implemented.
#PSD_MARGINS ;Causes the system To use the values specified in the rtMargin member as the initial widths
;For the left, top, right, And bottom margins. If PSD_MARGINS is Not set, the system sets
;the initial widths To one inch For all margins.
#PSD_MINMARGINS;Causes the system To use the values specified in the rtMinMargin member as the minimum
;allowable widths For the left, top, right, And bottom margins. The system prevents the
;user from entering a width that is less than the specified minimum. If PSD_MINMARGINS is
;Not specified, the system sets the minimum allowable widths To those allowed by the ;printer.
#PSD_NOWARNING ;Prevents the system from displaying a warning message when there is no Default printer.
#PSD_RETURNDEFAULT;PageSetupDlg does Not display the dialog box. Instead, it sets the hDevNames And hDevMode
;members To handles To DEVMODE And DEVNAMES structures that are initialized For the system
;Default printer. PageSetupDlg returns an error If either hDevNames Or hDevMode is Not ;NULL.
#PSD_SHOWHELP ;Causes the dialog box To display the Help button. The hwndOwner member must specify the
;window To receive the HELPMSGSTRING registered messages that the dialog box sends when
;the user clicks the Help button.
#GMEM_MOVEABLE = $2
#GMEM_ZEROINIT = $40
Global Prt_Copys, Prt_Orient, Prt_Page1, Prt_Page9, Prt_MaxPage, Prt_DPI, Prt_isColor, Prt_UseLast
Global Prt_DC, Pap_Br, Pap_Ti, Prt_RegKey$
Global Drucker_Requester_MemMode ;0=AllocateMemory 1=GlobalAlloc 2=beides klappt nicht...
XIncludeFile "C:\Alstersoft\PureBasic\Module\Registry.PBI"
XIncludeFile "C:\Alstersoft\PureBasic\Module\Wort.PBI"
Procedure DruckerRequester()
Protected DevMode.DEVMODE ,pd.PRINTDLGAPI, DR_MemBuff, result, Zeile$
; Drucker_Requester_MemMode=0 ;maybe OS-abhängig ? mit 0 klappt´s nicht immer !!! (z.B. nicht auf USB...)
If Drucker_Requester_MemMode=0
DR_MemBuff=AllocateMemory(1,SizeOf(DEVMODE),0)
Else
DR_MemBuff=GlobalAlloc_(#GMEM_MOVEABLE|#GMEM_ZEROINIT, SizeOf(DEVMODE))
EndIf
If DR_MemBuff
pd\lStructSize = SizeOf(PRINTDLGAPI)
pd\hwndOwner = WindowID()
Debug "WinID="+Str(WindowID())
pd\hDevMode = DR_MemBuff
pd\hDevNames = #NULL
pd\hInstance = 0
pd\lpfnSetupHook = #NULL
pd\lpPrintSetupTemplateName = #NULL
pd\lpfnPrintHook = #NULL
pd\lpPrintTemplateName = #NULL
If Prt_MaxPage<1 : Prt_MaxPage=999 : EndIf
pd\nFromPage=Prt_Page1
pd\nToPage=Prt_Page9
pd\nMinPage = 1
pd\nMaxPage = Prt_MaxPage
If Prt_UseLast
pd\flags=#PD_RETURNDEFAULT ;keine DialogBox, liefert Default-Einstellungen
Else
pd\flags = #PD_HIDEPRINTTOFILE|#PD_NOSELECTION ;#PD_NOPAGENUMS | #PD_ALLPAGES | #PD_COLLATE
EndIf
; If Prt_RegKey$>"" ;programmfixierte Einstellung holen
; Zeile$=RegistryRead(#Prg_Name,Prt_RegKey$)
; Debug "DruckerRequester: read Setup (Copy´s, Orient, DPI und color="+Zeile$
; If Zeile$>"" : Prt_Copys=Val(Wort(@Zeile$)) : EndIf
; If Zeile$>"" : Prt_Orient=Val(Wort(@Zeile$)) : EndIf
; If Zeile$>"" : Prt_DPI=Val(Wort(@Zeile$)) : EndIf
; If Zeile$>"" : Prt_isColor=Val(Wort(@Zeile$)) : EndIf
; EndIf
;Setting up the special Printermode
DevMode\dmSize=SizeOf(DEVMODE)
DevMode\dmFields = #DM_ORIENTATION | #DM_COPIES | #DM_PRINTQUALITY | #DM_COLOR | #PD_PAGENUMS ;| DM_COLLATE
DevMode\dmCopies = Prt_Copys ;Anzahl Kopien
DevMode\dmOrientation = Prt_Orient ;1=hoch 2=quer
DevMode\dmPrintQuality= Prt_DPI ;Dot´s per Inch
DevMode\dmColor = Prt_isColor ;1=sw 2=farbig
Debug "DruckRequester: copy Mem"
If Drucker_Requester_MemMode
lpDevMode=GlobalLock_(DR_MemBuff)
If lpDevMode
result=CopyMemory(DevMode.DEVMODE,DR_MemBuff,SizeOf(DEVMODE))
result=CopyMemory(DR_MemBuff,lpDevMode, SizeOf(DEVMODE))
result =GlobalunLock_(DR_MemBuff)
EndIf
Else
result=CopyMemory(DevMode.DEVMODE,DR_MemBuff,SizeOf(DEVMODE))
EndIf
Debug "DruckRequester: PrintDlg start"
If PrintDlg_(pd)
Debug "DruckRequester: PrintDlg ready"
Prt_DC = GlobalLock_(pd\hDevNames)
Debug "Prt_DC="+Str(Prt_DC)
Prt_DC = CreateDC_(PeekS(Prt_DC + PeekW(Prt_DC)),PeekS(Prt_DC + PeekW(Prt_DC + 2)),0,GlobalLock_(pd\hDevMode))
Prt_Page1=pd\nFromPage
Prt_Page9=pd\nToPage
Debug "Seiten "+Str(Prt_Page1)+" bis "+Str(Prt_Page9)
If Drucker_Requester_MemMode
lpDevMode=GlobalLock_(DR_MemBuff)
If lpDevMode
result=CopyMemory(lpDevMode,DR_MemBuff, SizeOf(DEVMODE))
Debug "Result 1 = "+Str(result)
result=CopyMemory(DR_MemBuff,DevMode.DEVMODE,SizeOf(DEVMODE))
Debug "Result 2 = "+Str(result)
result =GlobalunLock_(DR_MemBuff)
Debug "Result 3 = "+Str(result)
EndIf
result = GlobalFree_(DR_MemBuff)
Debug "Result 4 = "+Str(result)
Else
result=CopyMemory(DR_MemBuff,DevMode.DEVMODE,SizeOf(DEVMODE))
FreeMemory(1)
EndIf
Pap_Br=GetDeviceCaps_(Prt_DC, #HORZRES);Blattbreite in Pixel
Pap_Ti=GetDeviceCaps_(Prt_DC, #VERTRES);Blatthöhe in Pixel
Debug "Papier: "+Str(Pap_Br)+" x "+Str(Pap_Ti)+" Pixel"
Else :
Drucker_Requester_MemMode+1
Debug "Drucker_Requester_MemMode = "+Str(Drucker_Requester_MemMode)
If Drucker_Requester_MemMode<2
ProcedureReturn DruckerRequester()
Else : MessageRequester("Drucker-Ansprache fehlgeschlagen !!!", "Drucker-Speicher weder lokal noch global ansprechbar." + Chr(10) + "", #MB_OK|#MB_ICONERROR)
EndIf
Debug "PrintDLG err"
EndIf
Prt_Copys=DevMode\dmCopies
Prt_Orient=DevMode\dmOrientation
Prt_DPI=DevMode\dmPrintQuality
Prt_isColor=DevMode\dmColor
If Prt_RegKey$>"" ;programmfixierte Einstellung speichern
Zeile$=Str(Prt_Copys)+" "
Zeile$+Str(Prt_Orient)+" "
Zeile$+Str(Prt_DPI)+" "
Zeile$+Str(Prt_isColor)
Debug "RegWrite :"+#Prg_Name+"\"+Prt_RegKey$+" <-- "+Zeile$
RegistryWrite(#Prg_Name,Prt_RegKey$,Zeile$)
Debug "RegWrite Rdy"
EndIf
Debug "Requester-Exit="+Str(Prt_DC)
ProcedureReturn Prt_DC
EndIf
ProcedureReturn 0 ;Mem_Error
EndProcedure