Vorgaben im PB Printrequester ändern, Wie ?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Vorgaben im PB Printrequester ändern, Wie ?

Beitrag von hjbremer »

Wie kann ich die Vorgaben im PB Printrequester ändern ? Besonders die Druckqualität.

Alles was ich beim Suchen gefunden habe benutzt PrintDlg_ und anschließend API Befehle zum drucken.
Ich möchte aber die PB Befehle benutzen.
Irgendwie bekomme ich es nicht auf die Reihe !!!

Geht das überhaupt ? Und wenn ja Wie ?

danke im voraus
Purebasic 5.70 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Beitrag von Falko »

>>> Ich möchte aber die PB Befehle benutzen.

Also wenn du nur die PB eigenen Funktionen benutzt,
dann kommst du auch mit PB4 nicht weit :mrgreen:
PB-Standarthilfe hat geschrieben:DefaultPrinter
NewPrinterPage
PrintRequester
PrinterOutput
PrinterPageHeight
PrinterPageWidth
StartPrinting
StopPrinting
Vielleicht ist es aber genehmigt, libs zu nutzen, womit APIs
indirekt über PB-gestrickte Befehle gemacht werden können.

Schau mal unter www.winbahn.de bei Jens vorbei.
Dort ist eine JH-Printerlib
Oder direktlink
http://www.winbahn.de/Programme/PureBas ... er_400.ZIP

Gruß Falko
Bild
Win11 Pro 64-Bit, PB_6.11b1
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Vorgaben im PrintDlg im Eigenschaften Fenster ändern ?

Beitrag von hjbremer »

Da das anscheinend nicht machbar ist, habe ich meine Druckfunktion auf API Befehle umgeschrieben.

Wenn ich den Dialog aufrufe und mit OK bestätige ist die Druckqualität wie die voreingestellte. Im Beispiel unten DRAFT. Nur leider, wenn ich das Eigenschaften Fenster im Dialog öffne ist die Voreinstellung normal. :? Drücke ich ok dann wird auch NORMAL gedruckt und umgedreht.

1.Hat das was mit den TEMPLATE Flags und Parametern in der Dialogstruktur zu tun ? Kann nirgends eine verständliche Erklärung finden.

2.Kann mir einer den Grund für das unterschiedliche Aussehen der Dialogbox nennen. Je nachdem welcher Handle übergeben wird.

3.In der MSDN steht, das PRINTDLG eine PrinterDC zurück geben kann, nur hab ich das nicht so ganz verstanden mit den diversen Flags. Geht es denn auch ohne CREATEDC_ ?

4.Und wenn schon mal jemand sich den Code anschaut, ist da irgendwo ein böser Fehler drin ? Besonders bei den Sachen mit FreeMemory, DeleteObject, DeleteDC bin ich noch unsicher.

Code: Alles auswählen

; teilweise aus dem Code Archiv
;
; bearbeitet von HJ Bremer

Declare DrawTextOutline(dc,x,y,*text,lg) 
Declare DrawTextKasten (dc,startsp,startze,breite,hoehe)

Declare.s getdefaultprinter() 
Declare   MyPrintDialog(hwnd,*pd.PRINTDLG,*DevModeCopy.DEVMODE) 

;Test Text 
text.s = "Dies ist ein Test und funktioniert, bis auf eine Sache."

;nur zum Testen
hwnd=OpenWindow(#PB_Any, 100, 100, 600, 500, "PureBasic") 

;Standard printer information 
  prnName$ = getdefaultprinter() 
  
  prnHdl = 0 
  OpenPrinter_(prnName$,@prnHdl,0) 
  
  buffersize=DocumentProperties_(0,prnHdl,prnName$,0,0,0) 
  *DevBufferIn=AllocateMemory(buffersize) ;
  *DevBufferOut=AllocateMemory(buffersize) 
  DocumentProperties_(0,prnHdl,prnName$,*DevBufferOut,*DevBufferIn,#DM_OUT_BUFFER|#DM_IN_BUFFER) 
  ClosePrinter_(prnHdl) 
  
  *prnPara.DEVMODE=*DevBufferOut
  
  *prnPara\dmOrientation = 1                ;2=Set to Landscape mode 
  *prnPara\dmPrintQuality= #DMRES_DRAFT     ;  Setze Druckqualität !!!
  
  ;*prnPara\dmPrintQuality= #DMRES_MEDIUM
  
  MyPrintdialog(0,pd.printdlg,*prnPara.devmode) 
  ;oder = ich weiß nicht warum die Dialogbox anders ist
  ;MyPrintdialog(WindowID(hwnd),pd.printdlg,*prnPara.devmode) 
  
  prnDC.l = CreateDC_("WINSPOOL",prnName$,0,*prnPara) 
  
  FreeMemory(*DevBufferIn)
  FreeMemory(*DevBufferOut)

;Fonts
  HorRes = GetDeviceCaps_(prnDC,#HORZRES)   
  breite = GetDeviceCaps_(prnDC,#HORZSIZE)  
   dotmm = HorRes/breite   ;dot pro mm Horizontal = Faktor für Drawtext
                           ;in der Regel ist Horizontale+Vertikale Auflösung gleich
   
  fonthhx.d=dotmm/(10/2.56) ;zur Anpassung an verschiedene dmPrintQuality, 1cm=10/2,56 inch oder auch = dotmm / 3,8
                            ;Typ Double, sonst kommt es zu Verschiebungen beim Etikettendruck (Rundungsfehler)
    
  font0=LoadFont(0, "Arial", 5*fonthhx.d)
  font1=LoadFont(1, "Arial",10*fonthhx.d)
  font2=LoadFont(2, "Arial",15*fonthhx.d)

;für StartDoc_ = Jobinfo = entspricht StartPrinting ()
  DocInf.DOCINFO 
  DocInf\cbSize = SizeOf(DOCINFO) 
  DocInf\lpszDocName = @"Mein Druckjob" 
  DocInf\lpszOutput = #Null 

For j = 1 To 1  ; For - Next nur zum Testen

  If StartDoc_(prnDC,@DocInf) > 0 
      
      If StartPage_(prnDC) > 0 ;entspricht StartDrawing()
      
        ;Angaben in mm, sp=60 mm, ze=7 mm 
        ;Linker Rand und oberer Rand nicht berechnet, geht mit GetDeviceCaps_
        sp=dotmm*60
        ze=dotmm*7
        lg=Len(text)
        SelectObject_(prnDC, font0) 
        TextOut_(prnDC,sp,ze,@text,lg) 
  
        sp=dotmm*60
        ze=dotmm*11
        lg=Len(text)
        SelectObject_(prnDC, font1) 
        TextOut_(prnDC,sp,ze,@text,lg) 
        
        sp=dotmm*60
        ze=dotmm*20
        lg=Len(text)
        SelectObject_(prnDC, font2) 
        DrawTextOutline(prnDC,sp,ze,@text,lg) 
        
        ;ein Kasten
        sp=dotmm*60
        ze=dotmm*40
        br=dotmm*20
        hh=dotmm*10
        DrawTextKasten (prnDC,sp,ze,br,hh)
  
        ;eine Linie
        sp=dotmm*60
        ze=dotmm*65
        br=dotmm*20
        hh=dotmm*0
        DrawTextKasten (prnDC,sp,ze,br,hh)
  
        EndPage_(prnDC) 
        EndDoc_(prnDC) 
      
      EndIf 
  EndIf

Next

DeleteDC_(prnDC) ;laut MSDN 

End

Procedure.s getdefaultprinter() 

    Protected prnname$=Space(255) 
    Protected printbuff=255 
    
    ;prnName$ = Space(260) 
    ;GetPrivateProfileString_("WINDOWS","DEVICE","", @prnName$, 260, "Win.Ini") 
    ;prnName$ = StringField(prnName$, 1,",") 
    
    ;oder
    
    OpenLibrary(1,"winspool.drv") 
       CallFunction(1,"GetDefaultPrinterA",@prnname$,@printbuff) 
       CloseLibrary(1) 
       
       ProcedureReturn prnname$ 
   
EndProcedure 

Procedure MyPrintDialog(hwnd,*pd.PRINTDLG,*DevModeCopy.DEVMODE) 
   
    Protected MyMemory=AllocateMemory(SizeOf(DEVMODE)) 
    Protected result
      
    *pd.PRINTDLG
    
    
    *pd\lStructSize = SizeOf(PRINTDLG) 
    *pd\hwndOwner = hwnd 
    *pd\hDevMode = MyMemory
    
    *pd\flags=#PD_DISABLEPRINTTOFILE|#PD_NOPAGENUMS|#PD_NOSELECTION		
    
    result=CopyMemory(*DevModeCopy.DEVMODE,MyMemory,SizeOf(DEVMODE)) 
        
    ResultDLG =PrintDlg_(*pd) 
    
    result=CopyMemory(MyMemory,*DevModeCopy.DEVMODE,SizeOf(DEVMODE)) 
    
    FreeMemory(MyMemory) 
    
    ProcedureReturn ResultDLG 
  
EndProcedure 

 
Procedure DrawTextOutline(dc,x,y,*text,lg) 

    Protected oldspacing = GetTextCharacterExtra_(dc)

    Protected st=1                 ;outlinestärke

    SetTextCharacterExtra_(dc,3)

    SetTextColor_(dc,#Black) 
    SetBkMode_(dc,#TRANSPARENT)
    TextOut_(dc,x,y,*text,lg)       ; normal 
    TextOut_(dc,x-st,y,*text,lg)    ; normal links 
    TextOut_(dc,x+st,y,*text,lg)    ; normal rechts 
    TextOut_(dc,x,y-st,*text,lg)    ; oben 
    TextOut_(dc,x,y+st,*text,lg)    ; unten 
    TextOut_(dc,x-st,y-st,*text,lg) ; links oben 
    TextOut_(dc,x+st,y-st,*text,lg) ; rechts oben 
    TextOut_(dc,x-st,y+st,*text,lg) ; links unten 
    TextOut_(dc,x+st,y+st,*text,lg) ; rechts unten 
    SetTextColor_(dc,#White) 
    TextOut_(dc,x,y,*text,lg) 
    SetBkMode_(dc,#OPAQUE)
    SetTextColor_(dc,0)     

    SetTextCharacterExtra_(dc,oldspacing)

EndProcedure

Procedure DrawTextKasten (dc,sp,ze,breite,hoehe)

    Protected sp2 = sp + breite
    Protected ze2 = ze + hoehe

    Protected pen=CreatePen_(#PS_SOLID,1,#Black)  
    Protected hPenOld=SelectObject_(dc,pen) 
     
    ;1. waagerechte 
     MoveToEx_(dc,sp,  ze, 0)
     LineTo_  (dc,sp2, ze) 
     
    ;2. waagerechte     
     MoveToEx_(dc,sp,  ze2, 0)
     LineTo_  (dc,sp2, ze2) 
     
    ;1. senkrechte
     MoveToEx_(dc,sp, ze, 0)
     LineTo_  (dc,sp, ze2) 
     
    ;2. senkrechte
     MoveToEx_(dc,sp2, ze,0)
     LineTo_  (dc,sp2, ze2) 
     
     DeleteObject_(pen) 
     DeleteObject_(hPenOld) 
    
EndProcedure

Purebasic 5.70 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Benutzeravatar
dysti
Beiträge: 656
Registriert: 10.02.2006 18:34
Wohnort: Schlicktown

Beitrag von dysti »

Was willst du letztendlich tatsächlich ausdrucken?
Listen oder was?
PB5 / Spiderbasic / WB14 / Win7 / Win8.1 / Win10 / Debian 9
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Beitrag von hjbremer »

Listen + Etiketten
Purebasic 5.70 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Antworten