ListIconGadget ausdrucken mit eigenem Printrequester

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

ListIconGadget ausdrucken mit eigenem Printrequester

Beitrag von hjbremer »

Gestern habe ich einen eigen simplen Printrequester vorgestellt.

Heute gibt es dazu eine etwas größere Anwendung. Für einige von uns mag es von Nachteil sein, das die PB 2D Drawing Befehle nicht mehr gehen, sondern nur noch Windows-Api Befehle. Seit 4.4 ist das aber nun mal so.
In dem Beispiel sind allerdings die wichtigsten Api-Befehle, die man für den Ausdruck von Texten benötigt, dabei.

Warum eigentlich einen eigenen Printrequester? Nun jedesmal sehe ich die Radiobuttons Alles, Markiert, Seiten und kann diese nicht benutzen :angry:

Das ganze sieht gewaltiger aus, als es ist, eigentlich recht simpel. :bluescreen:

Das ganze besteht aus 3 Teilen.
1. der eigene PrintRequester mit Start + Stopdrawing, der Ermittlung von Bildschirm + Druckerwerten, sowie 2 Fontprozeduren.

2. dem Teil welches ein ListIconGadget ausdruckt. Unterstützt wird der Ausdruck von normalen Standard-ListIconGadgets, also keine Ownerdraw via Callback, mit zusätzlichen Icons etc.
Soll aber nicht heißen, das solche nicht gedruckt werden, das passiert schon, nur was dabei rauskommt ist so eine Sache. Probleme gibt es auf jeden Fall mit unterschiedlichen Zeilenhöhen.

3. Ein Demo Programmteil

Das ganze einfach untereinander setzen im PB Editor, oder als Includes abspeichern und mit entsprechenden Include Anweisungen

Auch wenn viele Drucken nicht brauchen, ich denke gerade Anfänger die ihre Listen zu Papier bringen wollen, können das eine oder andere davon gebrauchen.
Die Umrechnerei von Windows -> Printer ist manchmal etwas verwirrend, dafür können aber die Ränder in mm angegeben werden. Je nach Drucker gibt es allerdings kleinere Differenzen.
Außerdem kann der Ausdruck über eine Variable vergrößert / verkleinert werden.

Viel Spaß damit. Verbesserungen sind erwünscht.

1.

Code: Alles auswählen

;ersetzt PrintRequester, 09.01.2010

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
  
  ;SetAbortProc_( *pd\hDC, @AbortProc()) ;???

  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(*pd.PRINTDLG)
  
  EndDoc_(*pd\hDC)
  DeleteObject_(*pd\hDC)
  DeleteDC_(*pd\hDC)  
  
  GlobalFree_(*pd\hDevMode)
  GlobalFree_(*pd\hDevNames)
   
EndProcedure

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 eventuell genauer, aber vergrößert alles
*gdc\prnhorzres  = GetDeviceCaps_(dc, #HORZRES)  
*gdc\prnvertres  = GetDeviceCaps_(dc, #VERTRES) 

;*gdc\prnhorzres  = GetDeviceCaps_(dc, #PHYSICALWIDTH)
;*gdc\prnvertres  = GetDeviceCaps_(dc, #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
2.

Code: Alles auswählen

;XIncludeFile "\Bremer\PureBasicPbi\Prn_PrintRequester.pbi"

;1.05

;EnableExplicit

Structure lvprndata
 colvon.i               ;ab Spalte 0
 colbis.i               ;bis Spalte oder -1 für die Letzte
 faktor.i               ;vergrößern/verkleinern z.B. 10 oder -10
 randoben.i             ;in mm, wird intern auf min 11 gesetzt
 randlinks.i            ;in mm, wird intern auf min 10 gesetzt
 randunten.i            ;in mm, wird intern auf min 5 gesetzt
 proseite.i             ;wenn null, wird errechnet
 caps.GetDeviceCaps     ;Structur siehe Prn_PrintRequester.pbi 
 seitennr.i             ;mit Seitennr. 1|0           
 seitennrbox.i          ;mit Rahmen für Seitennr. 1|0           
 message.i              ;bei jeder Seite fragen 1|0
 seitenanzahl.i 			;für Message
 aktuelleSeite.i 			;für Message
EndStructure

Procedure.i LvPrnGetCols(pbnr)

Protected head = SendMessage_(GadgetID(pbnr), #LVM_GETHEADER, 0, 0)
Protected cols = SendMessage_(head, #HDM_GETITEMCOUNT, 0, 0)

ProcedureReturn cols
EndProcedure
Procedure.s LvPrnGetItem(pbnr, nextitem)
  
Protected item$, j, k
Protected cols = LvPrnGetCols(pbnr)
Protected Dim OrderArray(cols)

If SendMessage_(GadgetID(pbnr), #LVM_GETCOLUMNORDERARRAY, cols, @OrderArray(0)) 

  For j = 0 To cols - 1
    k = orderarray(j)
    item$ + GetGadgetItemText(pbnr, nextitem, k) + #LF$
  Next

EndIf
  
ProcedureReturn item$
EndProcedure

Procedure.i LvPrnGetHeadbreite(pbid, subitem)

Protected rect.rect, br

SendMessage_(pbid, #HDM_GETITEMRECT, subitem, rect)                            
br = rect\right - rect\left
     
ProcedureReturn br
EndProcedure

Procedure.i LvPrnGetItemhoehe(pbid, item)

Protected subitem, rect.rect, hh

If item = -1
   subitem = 0        ;Zero-based index of the header 
   SendMessage_(pbid, #HDM_GETITEMRECT, subitem, rect)                            
Else
   subitem = 1        ;The one-based index of the subitem
   rect\top = subitem
   rect\left = #LVIR_LABEL
   SendMessage_(pbid, #LVM_GETSUBITEMRECT, item, rect) 
EndIf

hh = rect\bottom - rect\top
     
ProcedureReturn hh
EndProcedure

Procedure.i LvPrnMessage(msgnr, *lvprn.lvprndata)

Protected info$, ok
Protected flags = #MB_OKCANCEL|#MB_ICONQUESTION

Select msgnr
    Case 1: info$ = "Liste ist leer" + #LF$
            info$ + " oder" + #LF$
            info$ + "RadioButton Markierung gewählt, aber nichts markiert" + #LF$

    Case 2: info$ = "Druckbereich ist: " + Str(*lvprn\caps\prnvertsize)
            info$ + " anstatt 287/297 mm für A4" + #LF$ + #LF$
            info$ + "Drucker ev. auf falsches Papier eingestellt" + #LF$

    Case 3: info$ = "Druckbereich in mm: "
            info$ + Str(*lvprn\caps\prnvertsize) + " x "
            info$ + Str(*lvprn\caps\prnhorzsize) + #LF$ + #LF$ + #LF$
            info$ + Str(*lvprn\aktuelleseite)+ ". Seite von " 
            info$ + Str(*lvprn\seitenanzahl) + #LF$ + #LF$
            info$ + "Papier eingelegt ? oder Druck abbrechen"       
EndSelect 
   
ok = MessageRequester("Information", info$, flags)

ProcedureReturn ok
EndProcedure

Procedure LvPrn(pbnr, *lvprn.lvprndata = 0)

Protected lvprn.lvprndata
If Not *lvprn: *lvprn = @lvprn.lvprndata: EndIf

With *lvprn

;ACHTUNG: setzt voraus alle Zeilen gleich hoch, egal wie hoch

Protected printdlg.printdlg
Protected rect.rect, imgsize.size
Protected pbid = GadgetID(pbnr)
Protected hdid = SendMessage_(pbid, #LVM_GETHEADER, 0, 0)
Protected imglist = SendMessage_(pbid, #LVM_GETIMAGELIST, #LVSIL_STATE, 0) 
          ImageList_GetIconSize_(imglist, @imgsize\cx, @imgsize\cy)

Protected hv.f ;Hilfsvariable
Protected drkvertsize.f, drkvertres.f
Protected drkze.f, drksp.f, drkitemhoehe.f, drkItemabstand.f
Protected drkrandoben.f, drkrandunten.f, drkrandlinks.f
Protected subitembreite.f, subitemhoehe.f, subitemabstand.f

Protected ihh, ibr, isp, ize, inr
Protected drkanzgesamt, drkanzproseite
Protected seitevon, seitebis
Protected lfdnr, nextitem, istart
Protected fontid, fonthh, fontn$, fontnr
Protected col, nr, dc, subitem$, item$

Protected maxcols = LvPrnGetCols(pbnr) - 1 

If \colvon > maxcols: \colvon = maxcols: EndIf
If \colbis > maxcols: \colbis = maxcols: EndIf
If \colbis = 0:       \colbis = maxcols: EndIf
If \colbis < 0:       \colbis = maxcols: EndIf

; -------------------------------------------
   
;Druckerwahl   
dc = Prn_PrintRequester(printdlg.printdlg)  
If Not dc: ProcedureReturn: EndIf 

;Gesamtanzahl   
drkanzgesamt = CountGadgetItems(pbnr)
   
;RadioButton Markierung gedrückt ?
If printdlg\flags & #PD_SELECTION
   drkanzgesamt = SendMessage_(GadgetID(pbnr), #LVM_GETSELECTEDCOUNT, 0, 0)
   istart = -1    ;Startwert für #LVM_GETNEXTITEM
EndIf 
If Not drkanzgesamt
   LvPrnMessage(1, *lvprn)
   ProcedureReturn
EndIf

;Phys.DrkWerte holen
Prn_GetDeviceCaps(dc, \caps)
        
;wenn Drucker auf Legal steht, ist \prnvertsize größer 287/297 mm 
;dies wäre der Druckbereich für Canon BJC 240 + Kodak ESP 5 AiO
If \caps\prnvertsize > 297
   If LvPrnMessage(2, *lvprn) = 2: ProcedureReturn: EndIf 
EndIf   

;\faktor für verkleinern | vergrößern z.B -10% oder +10% (Parameter -10 | 10)
;\faktorV ist der Umrechnungswert Window to Printer Auflösung 
\caps\faktorV + ((\caps\faktorV / 100) * \faktor)    
\caps\faktorH + ((\caps\faktorH / 100) * \faktor)     

fontid = GetGadgetFont(pbnr)
fonthh = Prn_GetFontHoehe(fontid) ;:Debug fonthh
fontn$ = Prn_GetFontName(fontid)  ;:Debug fontn$   
fontnr = LoadFont(#PB_Any, fontn$, fonthh * \caps\faktorV)
fontid = FontID(fontnr)

;Abstand
drkItemabstand = 0.5 ;mm zusätzlicher Zeilenabstand
subItemabstand = 0.7 ;mm zusätzlicher Spaltenabstand

;Ränder in mm
drkrandoben = \randoben   ;intern zuweisen,  
drkrandunten = \randunten ;damit Original unverändert ist
drkrandlinks = \randlinks
If drkrandoben < 11: drkrandoben = 11: EndIf
If drkrandunten < 5: drkrandunten = 5: EndIf
If drkrandlinks < 10: drkrandlinks = 10: EndIf
drkrandoben - \caps\prnvertoffmm  ; - 1	;nicht druckbaren Bereich
drkrandlinks - \caps\prnhorzoffmm ;       ;abziehen

;oberer und unterer Rand abziehen in mm
drkvertsize = \caps\prnvertsize - drkrandoben - drkrandunten   

;es bleiben dots übrig
drkvertres  = drkvertsize * \caps\prnvertdotmm

;Header abziehen, Windots in Prndots umrechnen
hv = (LvPrnGetItemhoehe(hdid, -1) * \caps\faktorV) 
drkvertres - hv

;Höhe einer Zeile/Items zur Berechnung von drkanzproseite
hv = (LvPrnGetItemhoehe(pbid, 0) + drkItemabstand) * \caps\faktorV  
drkitemhoehe = hv

;Anzahl pro Seite
If \proseite
   drkanzproseite = \proseite
Else
   drkanzproseite = drkvertres / drkitemhoehe  
EndIf
        
;Anzahl Seiten für Message und Ausdruck 
\seitenanzahl = drkanzgesamt / drkanzproseite
If drkanzgesamt % drkanzproseite: \seitenanzahl + 1: EndIf   

;RadioButton Seiten gedrückt ?
If printdlg\flags & #PD_PAGENUMS
   seitevon = printdlg\nFromPage
   seitebis = printdlg\nToPage
EndIf

;Seitenangabe Check
If seitevon < 1:             seitevon = 1: EndIf
If seitevon > \seitenanzahl: seitevon = \seitenanzahl: EndIf
If seitebis < seitevon:      seitebis = \seitenanzahl: EndIf
If seitebis > \seitenanzahl: seitebis = \seitenanzahl: EndIf
If seitebis = -1:            seitebis = \seitenanzahl: EndIf

lfdnr = (seitevon - 1) * drkanzproseite

;oberer und linker Rand von mm in Window Dots umrechnen
drkrandoben * \caps\wndvertdotmm
drkrandlinks * \caps\wndhorzdotmm
        
;es geht los
If Prn_StartPrinting(printdlg, "LV-Job")
  
   StartPage_(dc)
      
   SelectObject_(dc, FontID)
   SetBkMode_(dc, #TRANSPARENT)
   SetTextAlign_(dc, #TA_TOP)   
                 
   For seite = seitevon To seitebis  
   
      \aktuelleSeite = seite

      If \message         
         If LvPrnMessage(3, *lvprn) = 2: Break: EndIf
      EndIf
     
      ;drkze ist Startpunkt einer Zeile auf der Seite
      drkze = drkrandoben
        
      ;Anzahl zu druckender Zeilen pro Seite + 1 für Überschrift 
      For nr = 1 To drkanzproseite + 1 
                           
         drksp = drkrandlinks
             
         If lfdnr < drkanzgesamt  ;wenn wahr nächster Datensatz
                 
            ;Itemnr holen
            If nr = 1
               nextitem = -1  ;Überschrift
            Else
               If printdlg\flags & #PD_SELECTION ;nur markierte Zeilen drucken
                  nextitem = SendMessage_(pbid, #LVM_GETNEXTITEM, istart, #LVNI_SELECTED) 
                  istart = nextitem    ;für nächstes Item
               Else      ;alles drucken
                  nextitem = lfdnr
               EndIf
               lfdnr + 1               ;für nächstes Item
            EndIf
                
            item$ = LvPrnGetItem(pbnr, nextitem)  

            ;Spalten
            For col = \colvon To \colbis  
                    
                subitem$ = StringField(item$, col + 1, #LF$)   

                ;Breite holen vom Header
                subitembreite = LvPrnGetHeadbreite(hdid, col)

                ;Höhe holen Header
                If nr = 1  
                   subitemhoehe   = LvPrnGetItemhoehe(hdid, -1)
                   ;SeitenNr.schreiben
                   If \seitennr 
                      rect\top    = 0
                      rect\left   = 0
                      rect\right  = \caps\prnhorzres - (20 * \caps\faktorH)
                      rect\bottom = (subitemhoehe - 2) * \caps\faktorV 
                      If \seitennrbox: DrawEdge_(dc, rect, 0, #BF_MIDDLE): EndIf
                      DrawText_(dc, "Seite " + Str(\aktuelleSeite), -1, rect, #DT_VCENTER|#DT_SINGLELINE|#DT_CENTER)                            
                   EndIf
                ;Höhe holen Item
                Else
                   subitemhoehe  = LvPrnGetItemhoehe(pbid, nextitem)
                EndIf
                                            
                ;SubItem Rahmen malen
                rect\top    = \caps\faktorV * drkze
                rect\left   = \caps\faktorH * drksp 
                rect\right  = \caps\faktorH * (drksp + subitembreite)
                rect\bottom = \caps\faktorV * (drkze + subitemhoehe) 
                DrawFocusRect_(dc, rect)
                     
                ;Header mit Hintergrund füllen 
                If nr = 1  
                   InflateRect_(rect, -2, -2)
                   DrawEdge_(dc, rect, 0, #BF_MIDDLE)
                   InflateRect_(rect, 2, 2)
                EndIf
                
                ;Start für Text oder icon in Spalte
                rect\left + (3 * \caps\faktorH) 
                
                ;Imagekasten malen
                If imglist
                   If col = 0 And nr > 1
                      ihh = (imgsize\cx - 2) * \caps\faktorV 
                      ibr = (imgsize\cy - 2) * \caps\faktorH 
                      isp = rect\left + 1  
                      ize = rect\top + ((rect\bottom - rect\top - ihh) / 2)
                      inr = 0
                      If GetGadgetItemState(pbnr,nextitem) & #PB_ListIcon_Checked: inr = 1: EndIf    
                      ImageList_DrawEx_(imglist, inr, dc, isp, ize, ibr, ihh, #White, 0, #ILD_NORMAL)                         
                      rect\left + (3 * \caps\faktorH) + ibr  
                   EndIf 
                EndIf
                   
                ;Text in Spalte                         
                DrawText_(dc, subitem$, -1, rect, #DT_VCENTER|#DT_SINGLELINE|#DT_END_ELLIPSIS)
                                           
                ;Start für nächste Spalte
                drksp + subitembreite
                drksp + subitemabstand   ;zusätzlicher Spaltenabstand
                                              
             Next                     
               
             ;Startpunkt für nächste Zeile  
             drkze + drkItemabstand + subitemhoehe 
                 
          EndIf 
             
       Next nr  ;Zeile
      
       EndPage_(dc)
          
   Next seite
 
   Prn_StopPrinting(printdlg)
EndIf
       
If IsFont(fontnr): FreeFont(fontnr): EndIf

EndWith
EndProcedure
[code]

3.
[code]
;XIncludeFile "\Bremer\PureBasicPbi\lvPrint2010b1.pbi"

Enumeration
 #but0
 #but1
 #but2
 #but3
 #lvg1
 #lvg2
 #lvg3
 #win1 
 #font
 #font1
EndEnumeration

LoadFont(#font, "Arial", 11)
LoadFont(#font1, "Arial", 9)

OpenWindow(#win1,0,0,900,480,"ListIcon Gadget",#PB_Window_SystemMenu|1) 
 
 ;RemoveKeyboardShortcut(#win1, #PB_Shortcut_Tab)      
 
  ButtonGadget(#but0, 10,420, 180,25,"lv 1 mit Parameter")
  ButtonGadget(#but1, 10,450, 180,25,"lv 1 ohne Parameter")
  ButtonGadget(#but2,310,450, 180,25,"lv 2 ohne Parameter")
  ButtonGadget(#but3,550,450, 180,25,"lv 3 ohne Parameter")
     
  lvflags = #PB_ListIcon_GridLines|#PB_ListIcon_FullRowSelect
  ;lvflags | #PB_ListIcon_CheckBoxes 
  lvflags | #PB_ListIcon_MultiSelect 
  lvflags | #PB_ListIcon_HeaderDragDrop 
  lvflags | #PB_ListIcon_AlwaysShowSelection 
  ListIconGadget(#lvg1,10,10,280,400,"Spalte 0",140,lvflags)
   AddGadgetColumn(#lvg1,1,"Spalte 1",55) 
   AddGadgetColumn(#lvg1,2,"Sp 2",85) 
  SetGadgetFont(#lvg1,FontID(#font))
  SetGadgetColor(#lvg1, #PB_Gadget_BackColor, #Yellow)
  
  lvflags = #PB_ListIcon_GridLines|#PB_ListIcon_FullRowSelect 
  lvflags | #PB_ListIcon_CheckBoxes 
  lvflags | #PB_ListIcon_MultiSelect
  lvflags | #PB_ListIcon_AlwaysShowSelection 
  ListIconGadget(#lvg2,300,10,220,400,"Spalte 0",180,lvflags)
   AddGadgetColumn(#lvg2,1,"Spalte 1",-1) 
   AddGadgetColumn(#lvg2,2,"Sp 2",85) 
  SetGadgetFont(#lvg2,FontID(#font1))
      
  ListIconGadget(#lvg3,530,10,220,400,"",0,lvflags|#LVS_NOCOLUMNHEADER) 
   AddGadgetColumn(#lvg3,1,"Spalte 1",55) 
     
  For i = 0 To 99
    nr$ = LSet(Str(i),3," ") 
    txt$ = "Text in Zeile "+nr$+" in Spalte 0" + #LF$ + Str(Random(111)) + #LF$ + "Hallo"
    AddGadgetItem(#lvg1, -1, txt$)           
    AddGadgetItem(#lvg2, -1, txt$)
    AddGadgetItem(#lvg3, -1, txt$)
  Next 
  
  ;Zeilen höher machen - ( aus RSBASIC Win Api Libary )
  SendMessage_(GadgetID(#lvg1),#LVM_SETIMAGELIST,#LVSIL_SMALL,ImageList_Create_(1,25,#ILC_COLORDDB,0,0))
  
;=====================================================

Repeat: event = WaitWindowEvent(1) 
    
  If Event = #PB_Event_Gadget Or Event = #PB_Event_Menu 
          
     welcherButton = EventGadget() ;:Debug welcherButton
  
     Select welcherButton
      
      Case #but0: lvprndata.lvprndata
                  lvprndata\colvon      	= 0	;ab Spalte 0
                  lvprndata\colbis      	= 1	;bis Spalte oder -1 für die Letzte
 						lvprndata\randoben		= 0	;in mm, wird intern auf min 11 gesetzt
 						lvprndata\randlinks     = 0   ;in mm, wird intern auf min 10 gesetzt
 						lvprndata\randunten     = 0   ;in mm, wird intern auf min 5 gesetzt
                  lvprndata\proseite    	= 10	;wenn null, wird errechnet
                  lvprndata\faktor      	= 5	;größer/kleiner z.B. 10 oder -10
                  lvprndata\message     	= 1	;bei jeder Seite fragen 1|0 
                  lvprndata\seitennr 	 	= 1	;mit Seitennr. 1|0
                  lvprndata\seitennrbox 	= 1	;mit Rahmen für Seitennr. 1|0
                  LvPrn(#lvg1, lvprndata)

      Case #but1: LvPrn(#lvg1)
      Case #but2: LvPrn(#lvg2)
      Case #but3: LvPrn(#lvg3)
           
     EndSelect
  
  EndIf

Until event = #PB_Event_CloseWindow 

End 
Edit 11.01.2010: Prn_StopPrinting() erweitert
Zuletzt geändert von hjbremer am 11.01.2010 18:43, insgesamt 1-mal geändert.
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
Hyper
Beiträge: 194
Registriert: 19.04.2005 19:14

Re: ListIconGadget ausdrucken mit eigenem Printrequester

Beitrag von Hyper »

Hallo hjbremer,

super genial! Danke - so etwas habe ich schon lange mal gebraucht. Werde es mir demnächst man genauer unter die Lupe nehmen!
PB 5.72
Benutzeravatar
BI2
Beiträge: 146
Registriert: 26.11.2006 19:07

Re: ListIconGadget ausdrucken mit eigenem Printrequester

Beitrag von BI2 »

hjbremer hat geschrieben:Heute gibt es dazu eine etwas größere Anwendung. Für einige von uns mag es von Nachteil sein, das die PB 2D Drawing Befehle nicht mehr gehen, sondern nur noch Windows-Api Befehle. Seit 4.4 ist das aber nun mal so.
Was meinst Du damit? Die 2D Drawing Befehle funktionieren doch.

Einzig nach StartDrawing muß ein

Code: Alles auswählen

BackColor($FFFFFF)
eingefügt werden, oder habe ich Dich jetzt falsch verstanden?

Gruß, BI2

Edit: Sonst gefällt mir Dein PrintRequester aber sehr gut :allright:
PB 5.7x (x64), LinuxMint 18.3 - Xfce (x64)

Einsteigerbuch: PureBasic - Eine Einführung in die Computer Programmierung
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Re: ListIconGadget ausdrucken mit eigenem Printrequester

Beitrag von hjbremer »

Das hDC welches der PrintDlg_() zurückliefert ist nicht das gleiche hDC welches von Startdrawing() zurückgegeben wird. Darum funktionieren die PB Befehle nicht mehr.

Generell funktionieren seit PB 4.4 einige Api Drawing Befehle mit dem dc von Startdrawing() nicht mehr korrekt. z.B. Selectobject_(dc, fontid)

Beispiel

Code: Alles auswählen

Prototype.i DrawShadowText(hDC.i, pszText.p-unicode, cch.l, *p.RECT, flags.l, crText.l, crShadow.l, ixOffset.l, iyOffset.l) 

libnr = OpenLibrary(#PB_Any, "ComCtl32.dll") 
If libnr 
 Global DrawShadowText_.DrawShadowText = GetFunction(libnr, "DrawShadowText") 
Else 
 MessageRequester("Fehler!","Kann ComCtl32.dll nicht öffnen !",#MB_ICONERROR) 
 End 
EndIf 

Procedure CreateFont(fonthh) 

   fontid = GetStockObject_(#ANSI_VAR_FONT)      ;Systemfont holen 
   GetObject_(fontid,SizeOf(LOGFONT),lg.LOGFONT) ;Eigenschaften holen 
   lg\lfHeight = fonthh                          ;Größe setzen 
    
   ProcedureReturn CreateFontIndirect_(lg)     ;Font create 

EndProcedure 


  br = 300: hh = 50 
  imgnr = CreateImage(#PB_Any, br, hh) 
  
  hDC = StartDrawing(ImageOutput(imgnr)) 
    
    farbe = #White 
    Box(0, 0, br, hh, farbe) 

    fonthh = 35 
    fontid = CreateFont(fonthh) 
    
    DrawingFont(fontid)    
    DrawingMode(#PB_2DDrawing_Transparent)
    
    ;SelectObject_(hdc, fontid)
    ;SetBkMode_(hdc,#TRANSPARENT) 
    
    SetTextAlign_(hDC, #TA_LEFT)  ;muß sein 
          
    r.RECT 
    r\left=0 
    r\top=10 
    r\right=br 
    r\bottom=hh 
    
    txt$ = "dies ist ein Test" 
    
    flags.l = #DT_CENTER 
    
    shadow_x.l = 4  ;kann auch negative Werte haben 
    shadow_y.l = 3 
    
    hoehe = DrawShadowText_(hDC, txt$, Len(txt$), r, flags, #Blue, #Gray, shadow_x, shadow_y) 
      
  StopDrawing() 
  
OpenWindow(0, 0, 0, 400, 300, "", #PB_Window_SystemMenu|#PB_Window_ScreenCentered) 
   
ButtonImageGadget(1, 50,50,br,hh,ImageID(imgnr)) 

Repeat 
Until WaitWindowEvent()=#PB_Event_CloseWindow 

End
Nimm DrawingFont(fontid) weg und dafür die SelectObject Zeile
Es wird nicht mehr der gewählte Font gesetzt, sondern ein Systmfont.

DrawShadowText_() funktioniert hingegen scheinbar
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