Seite 1 von 1

ListIcon-Spaltenbreiten optimieren

Verfasst: 04.11.2007 20:48
von sibru
Die folgende Funktion dient zur Optimierung von ListIcon-SpaltenBreiten:
alle Spalten werden auf die minimal benötigte Breite (=längster Text in
einer Spalte) gesetzt...

Das Ganze als PB3.90-Code:

Code: Alles auswählen

;PureBasic-QuellCode "Spalten_Optimize" mit allen ModulBody´s
;erstellt durch Programm "PB_Mod2Body", Vers. 7A13a am 04.11.2007, 13:50

;Modul      Spalten_Optimize Version 1.1 vom 05.12.2005
;
;Funktion:  optimiert die SpaltenBreiten eines ListIcon´s entsprechend Inhalt
;           Die einzelnen Spalten eines ListIcon´s werden entsprechend dem
;           längstem Inhalt unter Berücksichtigung des aktuellen Font´s des
;           ListIcon´s ausgerichtet.
;           Z.Zt. ist das Ganze noch sehr großzügig: da gibt´s Ungenauigkeiten
;           in den API´s (anscheinden Font-abhängig...), so dass hier sicher=
;           heitshalber ´n bischen mehr Spaltenbreite als anscheinend nötig be=
;           nutzt wird...
;
;           Im Windows-DateiManager ist diese Funktion via [Strg]+[-] aufruf=
;           bar, Diese TastenKombination ist auch in allen Alstersoft-Prg´s zu
;           implementieren (ggf. weitere Tasten möglich, Details siehe Arbeits=
;           anweisung 5B21c {von Dirk !!!})
;           PreWinCtrlLoop:
;           AddKeyboardShortcut(#Win,#PB_Shortcut_Control|#PB_Shortcut_Add,fnc)
;                        (PB-Fehler: #PB_Shortcut_Add meint die Taste [-] !!!)
;           in WinCtrlLoop:
;             EventID = WaitWindowEvent()
;             Select EventID
;                Case #PB_Event_Menu
;                   Case Fnc ;Spalten optimieren
;                      Spalten_Optimize(#TabNr,1)
;
;Aufruf:    Spalten_Optimize(#ListIcon_GadNr, TitelBreit.l)
;           #ListIcon_GadNr = #Gadget-Nr eines ListIcon´s
;           TitelBreit      = Flag: auch TitelText-Breiten berücksichtigen ?
;                             (0=nö, <>0=ja)
;
;#jaPBeExt exit
;
#SpOp_Debug = 0
;==========  Begin Modul "C:\ALSTERSOFT\PUREBASIC\MODULE\GADGET\LISTICON\LI_HITTEST_DEF.PBI"  ==========
#LVM_SUBITEMHITTEST = #LVM_FIRST+57
Structure LVHITTESTINFO 
   pt.POINT 
   flags.l 
   iItem.l 
   iSubItem.l 
EndStructure 
;==========  Ende Modul "C:\ALSTERSOFT\PUREBASIC\MODULE\GADGET\LISTICON\LI_HITTEST_DEF.PBI"  ==========
Procedure Spalten_Optimize(SO_GadNr, SO_HeadBreit)
   Protected TabID, pInfo.LVHITTESTINFO, TextSize.SIZE, SpaltData.LV_COLUMN, FontID, DC, Text$, LastSpalt, Spalte, Zeile, breit
   TabID = GadgetID(SO_GadNr)
   If #SpOp_Debug : Debug "SpaltOptimize: GadNr="+Str(SO_GadNr)+", ID="+Str(TabID) : EndIf
   If TabID
      FontID = SendMessage_(TabID,#WM_GETFONT,0,0)         ;FontHdl des ListIcon´s holen
      If #SpOp_Debug : Debug "SpaltOptimize: FontID="+Str(FontID) : EndIf
      DC = GetDC_(TabID)                                   ;device context holen
      If FontID : SelectObject_(DC,FontID) : EndIf         ;Font aktivieren für WinFnc GetTextExtentPoint...
      Spalte = 0                                           ;begin mit 1. Spalte (=ListIcon-Index 0)
      Repeat                                               ;alle Spalten durchgehen...
         breit = SendMessage_(TabID, #LVM_GETCOLUMNWIDTH,Spalte,0) ; aktuelle SpaltenBreite holen (=Spalte vorhanden ?)
         If breit>GetSystemMetrics_(#SM_CXSCREEN) : breit = 0 : EndIf ;manchmal kommt hier Blödsinn an...
         If breit                                          ;Spalte vorhanden ?
            If #SpOp_Debug : Debug "SpaltOptimize: found "+Str(Spalte+1)+". Spalten" : EndIf
            breit = 0                                        ;using now as maxBreit
            If SO_HeadBreit                                ;auch Spalten-Überschriften einbeziehen
               Text$ = Space(256)
               SpaltData\mask = #LVCF_TEXT
               SpaltData\pszText = @Text$
               SpaltData\cchTextMax = Len(Text$)
               SendMessage_(TabID,#LVM_GETCOLUMN,Spalte,@SpaltData) ;hole SpaltenÜberschrift
               If Text$>"" : Text$+"  "                    ;Ausgleich Unexaktheit
                  If GetTextExtentPoint32_(DC,Text$,Len(Text$),@TextSize) ;hole TextLen [Pixel] der SpaltenÜberschrift
                     breit = TextSize\cx*1.2                 ;noch´n Ausgleich Unexaktheit
                     If #SpOp_Debug : Debug "SpaltOptimize: "+Str(Spalte+1)+". Spalte, Titel: "+Text$+" --> "+Str(TextSize\cx)+" (max="+Str(breit)+")" : EndIf
                  EndIf
               EndIf
            EndIf
            For Zeile = 0 To CountGadgetItems(SO_GadNr)-1    ;nun alle Zeilen durchgehen
               Text$ = GetGadgetItemText(SO_GadNr,Zeile,Spalte)+"   " ;hole Zellen-Text (auch hier: add spaces wg Ausgleich Unexaktheit)
               If Text$>""
                  If GetTextExtentPoint32_(DC,Text$,Len(Text$),@TextSize) ;hole TextLen [Pixel] des ZellenTextes
                     breit = Max(breit,TextSize\cx)          ;maximale Breite bestimmen
                     If #SpOp_Debug : Debug "SpaltOptimize: "+Str(Spalte+1)+". Spalte, "+Str(Zeile+1)+". Zeile: "+Text$+" --> "+Str(TextSize\cx)+" (max="+Str(breit)+")" : EndIf
                  EndIf
               EndIf
            Next
            If #SpOp_Debug : Debug "SpaltOptimize: "+Str(Spalte+1)+". Spalte: set Breite="+Str(breit) : EndIf
            SendMessage_(TabID, #LVM_SETCOLUMNWIDTH,Spalte,breit) ;SpaltenBreite setzen
            Spalte+1
         EndIf
      Until breit = 0
      HideGadget(SO_GadNr,1)                               ;repaint ListIcon
      HideGadget(SO_GadNr,0)
      ReleaseDC_(TabID,DC)
   EndIf
EndProcedure

Re: ListIcon-Spaltenbreiten optimieren

Verfasst: 04.11.2007 21:09
von Kiffi

Verfasst: 04.11.2007 21:44
von Thomas
Etwas kürzer ^^ :mrgreen:

Verfasst: 05.11.2007 13:32
von Shardik
Kiffi und Thomas,

ihr solltet euch den Code von sibru vielleicht einmal etwas genauer ansehen! Er paßt die Spaltenbreite an den längsten Texteintrag _irgendeiner_ Spalte an und nicht nur an die Breite der Titelspalte, wie das zitierte Beispiel von Karl. Ansonsten hatte ich zwei ähnliche Beispiele, die ebenfalls den benutzten Font berücksichtigen, schon einmal im englischen Forum veröffentlicht (das erste Beispiel demonstriert übrigens die Auswirkung von #LVSCW_AUTOSIZE und #LVSCW_AUTOSIZE_USEHEADER):
http://www.purebasic.fr/english/viewtop ... 75&start=8
http://www.purebasic.fr/english/viewtopic.php?t=26076