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