Seite 1 von 1

Vorgaben im PB Printrequester ändern, Wie ?

Verfasst: 22.07.2007 21:25
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

Verfasst: 23.07.2007 00:12
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

Vorgaben im PrintDlg im Eigenschaften Fenster ändern ?

Verfasst: 24.07.2007 14:17
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


Verfasst: 25.07.2007 21:25
von dysti
Was willst du letztendlich tatsächlich ausdrucken?
Listen oder was?

Verfasst: 25.07.2007 22:41
von hjbremer
Listen + Etiketten