Auflösung des Druckers abfragen? [gelöst]

Anfängerfragen zum Programmieren mit PureBasic.
JayCool
Beiträge: 54
Registriert: 02.08.2007 20:03

Auflösung des Druckers abfragen? [gelöst]

Beitrag von JayCool »

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
Zuletzt geändert von JayCool am 24.01.2008 09:37, insgesamt 1-mal geändert.
sibru
Beiträge: 265
Registriert: 15.09.2004 18:11
Wohnort: hamburg

Beitrag von sibru »

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

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   
   
und hier der ebenfalls wesentliche Drucker-Requester:

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 
Gruss Siggi
Bild Bild
JayCool
Beiträge: 54
Registriert: 02.08.2007 20:03

Beitrag von JayCool »

:cry:
Und ich dachte, das könnte man in Form eines Dreizeilers abhaken
:roll:
Benutzeravatar
Shardik
Beiträge: 746
Registriert: 25.01.2005 12:19

Beitrag von Shardik »

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

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
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Beitrag von Fluid Byte »

So, Zweizeiler! Bild

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
Benutzeravatar
Shardik
Beiträge: 746
Registriert: 25.01.2005 12:19

Beitrag von Shardik »

Fluid Byte hat geschrieben: So, Zweizeiler!
Wenn Du die Doppelpunkte für die Verkettung der Anweisungen herausnimmst, hast Du sogar 6 Zeilen! :lol: Und besonders übersichtlich ist die Lösung auch nicht und der Drucker-DC wird gleich dreimal ermittelt ...
Nach Deiner Vorgehensweise paßt meine Lösung übrigens sogar in nur eine Zeile: :twisted:

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
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Beitrag von Fluid Byte »

Verdammt er hat die Doppelpunkte gesehen! Bild
Windows 10 Pro, 64-Bit / Outtakes | Derek
JayCool
Beiträge: 54
Registriert: 02.08.2007 20:03

Beitrag von JayCool »

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

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 
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
Benutzeravatar
Shardik
Beiträge: 746
Registriert: 25.01.2005 12:19

Beitrag von Shardik »

JayCool hat geschrieben: Ich hab' jetzt aber noch'n kleines Problem:
Ich würd' gerne einen x-beliebigen Drucker verwenden, und nicht den Default-Printer.
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 testen :wink: ). Sie ermittelt die installierten Drucker und zeigt diese in einer ComboBox an. Nach Auswahl eines Druckers wird dessen aktuelle Auflösung angezeigt:

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
Update: Dieses Programm läuft ohne Änderung auch unter Win95A, Win95C, Win98SE und Win2000 Server. :allright:
Zuletzt geändert von Shardik am 24.01.2008 09:47, insgesamt 1-mal geändert.
JayCool
Beiträge: 54
Registriert: 02.08.2007 20:03

Beitrag von JayCool »

Hi Shardik,

vielen Dank für Deine Bemühungen!
Ich hab' leider kein Vista, deshalb kann ich das Programm auch nicht dort testen.

Gruß, Jan
Antworten