Auflösung des Druckers abfragen? [gelöst]
Auflösung des Druckers abfragen? [gelöst]
Hi @ all,
ich bräuchte mal 'n Tipp, wie man die aktuell eingestellte Auflösung (horizontal und vertikal) eines Druckers in PB abfragen kann.
Grund: Ich möchte Koordinaten maßstabsgerecht wiedergeben können auf beliebigen Druckern. Bei AutoCAD kann man ja auch einstellen, dass z.B. 1 m in der Realität auf dem Blatt als 5 cm erscheint, und da ist es ja auch piep-egal, welcher Drucker verwendet wird.
greets, Jan
ich bräuchte mal 'n Tipp, wie man die aktuell eingestellte Auflösung (horizontal und vertikal) eines Druckers in PB abfragen kann.
Grund: Ich möchte Koordinaten maßstabsgerecht wiedergeben können auf beliebigen Druckern. Bei AutoCAD kann man ja auch einstellen, dass z.B. 1 m in der Realität auf dem Blatt als 5 cm erscheint, und da ist es ja auch piep-egal, welcher Drucker verwendet wird.
greets, Jan
Zuletzt geändert von JayCool am 24.01.2008 09:37, insgesamt 1-mal geändert.
Ich hab´s hier als Modul (funktionsbezogenes, eigenständiges .PBI),
da musstes dir mal raussuchen... (die includierten .PBI´s darf ich wg.
Einspruch vom Chef nicht rausgeben...)...
Viel erfolg
und hier der ebenfalls wesentliche Drucker-Requester:
Gruss Siggi
da musstes dir mal raussuchen... (die includierten .PBI´s darf ich wg.
Einspruch vom Chef nicht rausgeben...)...
Viel erfolg
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


Bist Du auch noch mit einem Fünfzeiler zufrieden?JayCool hat geschrieben: Und ich dachte, das könnte man in Form eines Dreizeilers abhaken

Code: Alles auswählen
PrinterDC.L = DefaultPrinter()
If PrinterDC
Debug "Horizontale Auflösung = " + Str(GetDeviceCaps_(PrinterDC, #LOGPIXELSX)) + " DPI"
Debug "Vertikale Auflösung = " + Str(GetDeviceCaps_(PrinterDC, #LOGPIXELSY)) + " DPI"
EndIf
- Fluid Byte
- Beiträge: 3110
- Registriert: 27.09.2006 22:06
- Wohnort: Berlin, Mitte
So, Zweizeiler! 

Code: Alles auswählen
DPIX = GetDeviceCaps_(DefaultPrinter(),#LOGPIXELSX) : DPIY = GetDeviceCaps_(DefaultPrinter(),#LOGPIXELSY)
If DefaultPrinter() : Debug "H-Res. = " + Str(DPIX) + " DPI" : Debug "V-Res. = " + Str(DPIY) + " DPI" : EndIf
Windows 10 Pro, 64-Bit / Outtakes | Derek
Wenn Du die Doppelpunkte für die Verkettung der Anweisungen herausnimmst, hast Du sogar 6 Zeilen!Fluid Byte hat geschrieben: So, Zweizeiler!

Nach Deiner Vorgehensweise paßt meine Lösung übrigens sogar in nur eine Zeile:

Code: Alles auswählen
PrinterDC.L = DefaultPrinter() : If PrinterDC : Debug "Horizontale Auflösung = " + Str(GetDeviceCaps_(PrinterDC, #LOGPIXELSX)) + " DPI" : Debug "Vertikale Auflösung = " + Str(GetDeviceCaps_(PrinterDC, #LOGPIXELSY)) + " DPI" : EndIf
- Fluid Byte
- Beiträge: 3110
- Registriert: 27.09.2006 22:06
- Wohnort: Berlin, Mitte
Hi, und vielen Dank erstmal für die Lösungsvorschläge.
Ich hab' jetzt aber noch'n kleines Problem:
Ich würd' gerne einen x-beliebigen Drucker verwenden, und nicht den Default-Printer.
Wenn ich aber bei dem folgenden Code
das 'DefaultPrinter()' durch 'PrintRequester()' ersetze, dann gibt der mir als Auflösung horizontal und vertikal jeweils 0 DPI aus.
Da ich aber an mehreren verschiedenen Rechnern arbeite, und an einem davon als Standard-Drucker 'AdobePDF' eingestellt ist, und ich nicht jedesmal die Systemsteuerung bemühen möchte, um den Standarddrucker zu ändern, bin ich nochmal auf Euer Feedback angewiesen.
Gruß, Jan
Ich hab' jetzt aber noch'n kleines Problem:
Ich würd' gerne einen x-beliebigen Drucker verwenden, und nicht den Default-Printer.
Wenn ich aber bei dem folgenden Code
Code: Alles auswählen
PrinterDC.L = DefaultPrinter()
If PrinterDC
Debug "Horizontale Auflösung = " + Str(GetDeviceCaps_(PrinterDC, #LOGPIXELSX)) + " DPI"
Debug "Vertikale Auflösung = " + Str(GetDeviceCaps_(PrinterDC, #LOGPIXELSY)) + " DPI"
EndIf
Da ich aber an mehreren verschiedenen Rechnern arbeite, und an einem davon als Standard-Drucker 'AdobePDF' eingestellt ist, und ich nicht jedesmal die Systemsteuerung bemühen möchte, um den Standarddrucker zu ändern, bin ich nochmal auf Euer Feedback angewiesen.
Gruß, Jan
Diese Lösung sollte auf allen Windows-Versionen ab Win95 funktionieren (erfolgreich getestet unter WinNT SP6 und WinXP SP2; vielleicht könnte es jemand auch einmal unter Vista testenJayCool hat geschrieben: Ich hab' jetzt aber noch'n kleines Problem:
Ich würd' gerne einen x-beliebigen Drucker verwenden, und nicht den Default-Printer.

Code: Alles auswählen
EnableExplicit
NewList Printer.S()
Procedure.L GetInstalledPrinters()
Shared Printer.S()
Protected *Buffer
Protected BufferSize.L
Protected *Printer
Protected PrinterName.S
ClearList(Printer())
BufferSize = 8192
*Buffer = AllocateMemory(BufferSize)
*Printer = *Buffer
If GetProfileString_("Devices", 0, "", *Buffer, BufferSize)
PrinterName = PeekS(*Printer)
While Trim(PrinterName) <> ""
AddElement(Printer())
Printer() = Trim(PrinterName)
*Printer = *Printer + Len(PrinterName) + 1
PrinterName = PeekS(*Printer)
Wend
EndIf
FreeMemory(*Buffer)
ProcedureReturn CountList(Printer())
EndProcedure
Define DriverName.S
Define Info.S
Define WindowsVersion.L
Define PrinterDC.L
Define SelectedPrinter.S
Define WindowEvent.L
If OpenWindow(0, 0, 0, 160, 70, "Drucker-Auswahl", #PB_Window_ScreenCentered | #PB_Window_SystemMenu)
If CreateGadgetList(WindowID(0))
ComboBoxGadget(0, 10, 10, 140, 100)
ButtonGadget(1, 20, 40, 120, 20, "Auflösung anzeigen")
If GetInstalledPrinters() = 0
End
Else
ForEach Printer()
AddGadgetItem(0, -1, Printer())
Next
EndIf
SetGadgetState(0, 0)
Repeat
WindowEvent = WaitWindowEvent()
Select WindowEvent
Case #PB_Event_CloseWindow
End
Case #PB_Event_Gadget
If EventGadget() = 1
If EventType() = #PB_EventType_LeftClick
SelectedPrinter = GetGadgetText(0)
Break
EndIf
EndIf
EndSelect
ForEver
CloseWindow(0)
WindowsVersion = OSVersion()
If WindowsVersion <> #PB_OS_Windows_95 And WindowsVersion <> #PB_OS_Windows_98
DriverName = "WinSpool"
EndIf
PrinterDC = CreateDC_(@"WinSpool", @SelectedPrinter, 0, 0)
If PrinterDC
Info = "Drucker: " + SelectedPrinter + #CR$ + #CR$
Info + "Horizontale Auflösung = " + Str(GetDeviceCaps_(PrinterDC, #LOGPIXELSX)) + " DPI" + #CR$
Info + "Vertikale Auflösung = " + Str(GetDeviceCaps_(PrinterDC, #LOGPIXELSY)) + " DPI"
DeleteDC_(PrinterDC)
MessageRequester("Drucker-Auflösung", Info, #MB_ICONINFORMATION)
EndIf
EndIf
EndIf

Zuletzt geändert von Shardik am 24.01.2008 09:47, insgesamt 1-mal geändert.