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
Vorgaben im PB Printrequester ändern, Wie ?
- hjbremer
- Beiträge: 822
- Registriert: 27.02.2006 22:30
- Computerausstattung: von gestern
- Wohnort: Neumünster
Vorgaben im PB Printrequester ändern, Wie ?
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
Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
- 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:
>>> 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
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
Also wenn du nur die PB eigenen Funktionen benutzt,
dann kommst du auch mit PB4 nicht weit

Vielleicht ist es aber genehmigt, libs zu nutzen, womit APIsPB-Standarthilfe hat geschrieben:DefaultPrinter
NewPrinterPage
PrintRequester
PrinterOutput
PrinterPageHeight
PrinterPageWidth
StartPrinting
StopPrinting
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
- hjbremer
- Beiträge: 822
- Registriert: 27.02.2006 22:30
- Computerausstattung: von gestern
- Wohnort: Neumünster
Vorgaben im PrintDlg im Eigenschaften Fenster ändern ?
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.
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.

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
Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer