Besonders die Einstellungen im PrintRequester sind nicht verfügbar. Dabei würde es doch schon reichen die RadioButtons für "alles Drucken" oder "Markiert" abzufragen.
Die im Forum etc verfügbaren Codes sind alle recht aufwändig, da diese oft die Voreinstellungen ändern wollen. Sie funktionieren nicht immer und verstehen tut Sie der normale HobbyUser wie ich es bin auch nicht so recht.
Hier mal der Versuch einen simplen eigenen Printrequester für Windows zu schreiben.
Voreinstellungen + Abfragen gibt es nur für die RadioButtons im Seitenbereich und für Ausgabe in Datei.
Und man kann keine Drawing-PB Befehle benutzen. Nur Windows-Api. Dies gilt ab PB 4.4
Ersatz für PrintRequester
Code: Alles auswählen
Procedure.i Prn_PrintRequester(*pd.PRINTDLG)
Protected ok = 0
*pd\lStructSize = SizeOf(PRINTDLG)
*pd\hwndOwner = WindowID(GetActiveWindow()) ;oder null
*pd\hDevMode = 0
*pd\hDevNames = 0
*pd\nMinPage = 1 ;wenn definiert = Startseite,
;kann auch Vorgabe sein
;wenn aber nMaxPage fehlt, kein PrintDlg
*pd\nMaxPage = -1 ;nicht definiert = keine Seitenangabe
;*pd\nFromPage = 3 ;wenn definiert, erscheinen diese
;*pd\nToPage = 5 ;Werte in der Editbox
;kann auch Vorgabe sein
*pd\Flags | #PD_RETURNDC ;muß sein !!!!!
;*pd\Flags | #PD_PRINTSETUP
;folgendes kann auch Vorgaben sein
;*pd\Flags | #PD_HIDEPRINTTOFILE ;Checkbox in Datei drucken ist weg
;*pd\flags | #PD_NOPAGENUMS ;RadioButton Seiten ist weg
;*pd\flags | #PD_NOSELECTION ;RadioButton Markierung ist weg
;den RadioButton Aktuelle Seite gibt es nur mit PrinDlgEx
;PrinDlgEx macht allerdings viel mehr Arbeit
ok = PrintDlg_(*pd)
If ok: ok = *pd\hDC: EndIf
ProcedureReturn ok
EndProcedure
Procedure.i Prn_StartPrinting(*pd.PRINTDLG, jobname$)
Protected ok = 0
Protected szOutput = 0
;in eine Datei drucken ist praktisch, wenn man
;den Windows Standard Generic / Text only Treiber
;installiert hat. Dann kann man sich das Ergebnis
;sehr schön mit Wordpad ansehen.
If *pd\flags & #PD_PRINTTOFILE ;kann auch weggelassen werden
szOutput = @"Test.txt" ;dann kommt ein Fenster
EndIf ;um den Dateinamen einzugeben
DocInfo.DOCINFO
DocInfo\cbSize = SizeOf(DOCINFO)
DocInfo\lpszDocName = @jobname$
DocInfo\lpszOutput = szOutput
ok = StartDoc_(*pd\hDC, @DocInfo)
If ok < 1: ok = 0: EndIf
ProcedureReturn ok
EndProcedure
Procedure.i Prn_StopPrinting(dc)
EndDoc_(dc)
DeleteObject_(dc)
DeleteDC_(dc)
EndProcedure
Code: Alles auswählen
; Demo Prozeduren---------------------------------------------
Structure GetDeviceCaps
prnhorzres.i
prnhorzsize.i
prnhorzdotmm.f
prnhorzoffmm.f
prnvertres.i
prnvertsize.i
prnvertdotmm.f
prnvertoffmm.f
wndhorzres.i
wndhorzsize.i
wndhorzdotmm.f
wndvertres.i
wndvertsize.i
wndvertdotmm.f
faktorH.f
faktorV.f
EndStructure
Procedure.i Prn_GetDeviceCaps(dc, *gdc.GetDeviceCaps)
;Bereich in mm
*gdc\prnhorzsize = GetDeviceCaps_(dc, #HORZSIZE)
*gdc\prnvertsize = GetDeviceCaps_(dc, #VERTSIZE)
;Anzahl Dots, #PHYSICALWIDTH wäre genauer, aber vergrößert alles
*gdc\prnhorzres = GetDeviceCaps_(dc, #HORZRES) ;#PHYSICALWIDTH
*gdc\prnvertres = GetDeviceCaps_(dc, #VERTRES) ;#PHYSICALHEIGHT
;dot pro mm
*gdc\prnhorzdotmm = *gdc\prnhorzres / *gdc\prnhorzsize
*gdc\prnvertdotmm = *gdc\prnvertres / *gdc\prnvertsize
;nicht druckbarer Rand in mm, etwas zu klein wegen #HORZRES #VERTRES
*gdc\prnhorzoffmm = GetDeviceCaps_(dc, #PHYSICALOFFSETX) / *gdc\prnhorzdotmm
*gdc\prnvertoffmm = GetDeviceCaps_(dc, #PHYSICALOFFSETY) / *gdc\prnvertdotmm
dc = GetWindowDC_(0)
;Bereich in mm
*gdc\wndhorzsize = GetDeviceCaps_(dc, #HORZSIZE)
*gdc\wndvertsize = GetDeviceCaps_(dc, #VERTSIZE)
;Anzahl Dots
*gdc\wndhorzres = GetDeviceCaps_(dc, #HORZRES)
*gdc\wndvertres = GetDeviceCaps_(dc, #VERTRES)
;dot pro mm
*gdc\wndhorzdotmm = *gdc\wndhorzres / *gdc\wndhorzsize
*gdc\wndvertdotmm = *gdc\wndvertres / *gdc\wndvertsize
;dies ist der Umrechnungswert Window to Printer Auflösung
*gdc\faktorH = *gdc\prnhorzdotmm / *gdc\wndhorzdotmm
*gdc\faktorV = *gdc\prnvertdotmm / *gdc\wndvertdotmm
ReleaseDC_(0, dc)
EndProcedure
Procedure.i Prn_GetFontHoehe(fontid)
Protected lg.LOGFONT
Protected pixely = GetDeviceCaps_(GetDC_(0), #LOGPIXELSY)
Protected retvalue = GetObject_(fontid, SizeOf(LOGFONT), lg)
Protected fonthoehe = -MulDiv_(lg\lfHeight, 72, pixely)
ProcedureReturn fonthoehe
EndProcedure
Procedure.s Prn_GetFontName(fontid)
Protected lg.LOGFONT
GetObject_(fontid, SizeOf(LOGFONT), lg)
ProcedureReturn PeekS(@lg\lfFaceName)
EndProcedure
; Demo---------------------------------------------------
Procedure Drucken(pbnr)
;falls Fontname + Höhe unbekannt
fontid = GetGadgetFont(pbnr)
prnfont$ = Prn_GetFontName(fontid)
prnfonthh = Prn_GetFontHoehe(fontid)
printdlg.printdlg
dc = Prn_PrintRequester(printdlg)
If Not dc: ProcedureReturn: EndIf
;Druckername holen, wozu auch immer
*dn.DEVNAMES = GlobalLock_(printdlg\hDevNames)
prnname$ = PeekS(*dn + *dn\wDeviceOffset)
GlobalUnlock_(printdlg\hDevNames)
Prn_StartPrinting(printdlg, "Druckjobname")
Prn_GetDeviceCaps(dc, caps.GetDeviceCaps)
prnfontnr = LoadFont(#PB_Any, prnfont$, prnfonthh * caps\faktorV)
randoben = 20 - caps\prnvertoffmm ;in mm 20 - nichtdruckbarer Bereich
randlinks = 10 - caps\prnhorzoffmm ;in mm
zeilenabstand = 2 ;in mm
zeilenabstand = zeilenabstand * caps\prnvertdotmm
zeilenhoehe = prnfonthh * caps\faktorV
x = (caps\prnvertsize - randoben - randoben) * caps\prnvertdotmm
zeilenproseite = x / (zeilenabstand + zeilenhoehe)
zeilengesamt = CountGadgetItems(pbnr)
;RadioButton Markierung gedrückt ?
selflag = printdlg\flags & #PD_SELECTION
If selflag
zeilengesamt = SendMessage_(GadgetID(pbnr), #LVM_GETSELECTEDCOUNT, 0, 0)
istart = -1 ;Startwert für #LVM_GETNEXTITEM
EndIf
If Not zeilengesamt: ProcedureReturn: EndIf
;Anzahl Seiten für Message und Ausdruck
seitenanzahl = zeilengesamt / zeilenproseite
If zeilengesamt % zeilenproseite: seitenanzahl + 1: EndIf
seitevon = 1: seitebis = seitenanzahl
;RadioButton Seiten gedrückt ?
If printdlg\flags & #PD_PAGENUMS
seitevon = printdlg\nFromPage
seitebis = printdlg\nToPage
EndIf
lfdnr = (seitevon - 1) * zeilenproseite
;es geht los
SetBkMode_(dc, #TRANSPARENT)
SetTextAlign_(dc, #TA_TOP)
SelectObject_(dc, FontID(prnfontnr))
startspalte = randlinks * caps\prnhorzdotmm
startzeile = randoben * caps\prnvertdotmm
StartPage_(dc)
For seite = seitevon To seitebis
x = startspalte
y = startzeile
For j = 1 To zeilenproseite
If lfdnr < zeilengesamt
If selflag
nextitem = SendMessage_(GadgetID(pbnr), #LVM_GETNEXTITEM, istart, #LVNI_SELECTED)
istart = nextitem ;für nächstes Item
text$ = GetGadgetItemText(pbnr, nextitem)
Else
text$ = GetGadgetItemText(pbnr, lfdnr)
EndIf
lfdnr + 1
TextOut_(dc, x, y, @text$, Len(text$))
y + zeilenabstand + zeilenhoehe ;oder zeilenhoehe mit GetTextMetrics() ermitteln
EndIf
Next
EndPage_(dc)
Next
Prn_StopPrinting(dc)
If IsFont(prnfontnr): FreeFont(prnfontnr): EndIf
EndProcedure
; -------------------------------------------------------
Enumeration
#but0
#lvg1
EndEnumeration
font1 = LoadFont(#PB_Any, "Arial", 9)
OpenWindow(#PB_Any, 100, 100, 600, 500, "DruckTest")
flags = #PB_ListIcon_MultiSelect
flags | #PB_ListIcon_FullRowSelect
flags | #PB_ListIcon_AlwaysShowSelection
ListIconGadget(#lvg1, 10, 10, 500, 400, "0", 400, flags)
SetGadgetFont(#lvg1, FontID(font1))
AddGadgetItem(#lvg1, 0, "1 qqggmarkieren Sie ein paar Zeilen")
AddGadgetItem(#lvg1, 1, "2 ÖÜÖÜdrücken Sie den Button drucken")
AddGadgetItem(#lvg1, 2, "3 und im Printrequester unten links")
AddGadgetItem(#lvg1, 3, "4 den RadioButton Markierung")
AddGadgetItem(#lvg1, 4, "5 dann werden nur die markierten Zeilen gedruckt")
For j = 5 To 90
AddGadgetItem(#lvg1, j, Str(j+1))
Next
ButtonGadget(#but0, 10, 450, 99, 25, "Drucken")
Repeat: event = WaitWindowEvent(1)
If Event = #PB_Event_Gadget Or Event = #PB_Event_Menu
welcherButton = EventGadget()
Select welcherButton
Case #but0: Drucken(#lvg1)
EndSelect
EndIf
Until event = #PB_Event_CloseWindow
End
;allgemeiner Hinweis
; wer auf 1/10 mm genau drucken will/muß
; der muß alle Variablen die mit vertikalen
; und horizontalen Maßen zu tun haben, auf Float setzen
; z.B. zeilenabstand, zeilenhoehe, sp, ze, x, y etc
; außerdem die korrekten Werte für Zeilenhöhe etc herausfinden
;falls Fontname + Höhe unbekannt; nur für Editorgadget drucken
; If GadgetType(pbnr) = #PB_GadgetType_Editor ; !!!
; cf.CHARFORMAT
; cf\cbSize = SizeOf(CHARFORMAT)
; cf\dwMask = #CFM_SIZE |#CFM_FACE
; SendMessage_(GadgetID(pbnr), #EM_GETCHARFORMAT, 0, cf)
; prnfont$ = PeekS(@cf\szFaceName)
; prnfonthh = cf\yHeight / 20
; Else
; fontid = GetGadgetFont(pbnr)
; prnfont$ = Prn_GetFontName(fontid)
; prnfonthh = Prn_GetFontHoehe(fontid)
; EndIf