Seite 3 von 4

Re: Im ListIconGadget zeichnen

Verfasst: 16.03.2012 16:55
von rolaf
ts-soft hat geschrieben:XP-Style aktivieren! Sollte dann auch unter dem klassischem Stil funktionieren.
Das sollte ja nun wirklich per Default an sein, ohne diesen Style kann man doch
keine Programme weitergeben, da werden die Benutzer aber bitter böse :mrgreen:
Ist an TiiSi. :roll:

Wer XP nur virtuell nutzt dürfte als Tester für XP ohnehin ungeeignet sein. ;)
(Kleine Retur-Kutsche mußte jetzt sein, halte mich bitte nicht für blöde.)

Letztlich ist es mir auch wurst wie einer seine Balken erzeugt/anzeigt. Kompliziert schließt, wie man hier wieder sehen kann, einige Nutzer aus. Soll jeder selbst entscheiden... punktum

Re: Im ListIconGadget zeichnen

Verfasst: 16.03.2012 17:26
von ts-soft
Ich habe noch nie den klassischen Stil angehabt, kann es also nicht testen,
dachte aber, durch den Stil würde es trotzdem funktionieren, nur das es
nicht so "hübsch" ist.

Hab mich also geirrt, bzw. hast Du mir was beigebracht :wink:

Re: Im ListIconGadget zeichnen

Verfasst: 16.03.2012 18:23
von Nino
rolaf hat geschrieben:Danilo, das war nix, egal ob mit oder ohne Unicode und UTF8 es wird genau das angezeigt
ts-soft hat geschrieben:XP-Style aktivieren!
Jo, dann ist das Hellblau schöner eingerahmt. :mrgreen:

Bild

PB 4.60 unter Win XP SP3 x86 (egal ob im Unicode-Modus compiliert oder nicht)

Re: Im ListIconGadget zeichnen

Verfasst: 16.03.2012 19:00
von ts-soft
Hab mir jetzt das ganze mal unter XP angeguckt, da sind wirklich keine Balken :lol:
Naja, dann ist es wohl nicht ganz so nützlich, wie gedacht.

Re: Im ListIconGadget zeichnen

Verfasst: 16.03.2012 20:23
von Frabbing
Geht auch mit Ascii/Ansi mit Chr(127), sieht sogar noch besser aus:

Bild

Re: Im ListIconGadget zeichnen

Verfasst: 16.03.2012 21:13
von Danilo
rolaf hat geschrieben:Danilo, das war nix
Tut mir leid, probier' doch mal mit dem klassischen #WM_DRAWITEM:

Code: Alles auswählen

;
; by Danilo, March 2012, PB4.60
;
; http://forums.purebasic.com/german/viewtopic.php?f=3&t=25336
;
EnableExplicit

Define EventID
Define i, font
font = LoadFont(#PB_Any, "Lucida Sans Unicode", 10)

Procedure WinCallback(hWnd, Msg, wParam, lParam)
  Protected gadget

  If Msg = #WM_DRAWITEM
    Protected *di.DRAWITEMSTRUCT = lParam
    If *di And *di\CtlType = #ODT_LISTVIEW
      With *di
        gadget = \CtlID

        If IsGadget(gadget) And GadgetType(gadget)=#PB_GadgetType_ListIcon
          Protected text.s    = GetGadgetItemText(gadget,\itemID,0)                    ; text holen
          Protected width0    = GetGadgetItemAttribute(gadget,0,#PB_ListIcon_ColumnWidth)   ; breite von column 0 holen
          Protected width1.f  = GetGadgetItemAttribute(gadget,0,#PB_ListIcon_ColumnWidth,1) ; breite von column 1 holen
          Protected brush     = CreateSolidBrush_(RGB($00,$00,$FF))                    ; pinsel mit farbe für die balken erstellen
          Protected brushsel  = CreateSolidBrush_(RGB($FF,$FF,$00))                    ; pinsel mit farbe für selektierte items
          Protected background= CreateSolidBrush_(RGB($C2,$D4,$EF))                    ; hintergrundfarbe setzen
          Protected percent.f = width1/100*ValF(text)                                  ; balkenlaenge in prozent ausrechnen
          Protected oldBrush,oldPen,bbrush

          If GetGadgetItemState(gadget,\itemID)=#PB_ListIcon_Selected
            bbrush = brushsel                                                          ; hintergrund fuer ausgewaehlte items
          Else
            bbrush = background                                                        ; hintergrund fuer normale items
          EndIf
          oldBrush = SelectObject_(\hDC,bbrush)
          oldPen   = SelectObject_(\hDC,GetStockObject_(#NULL_PEN))
          Rectangle_(\hDC,0,\rcItem\top,\rcItem\right+1,\rcItem\bottom+1)              ; hintergrund zeichnen
          SelectObject_(\hDC,oldBrush)
          SelectObject_(\hDC,oldPen)

          ; optional: den text umranden
              ;oldBrush = SelectObject_(\hdc,GetStockObject_(#HOLLOW_BRUSH))                   ; innenfarbe durchsichtig
              ;oldPen   = SelectObject_(\hdc,GetStockObject_(#BLACK_PEN))                      ; umrandung schwarz
              ;Rectangle_(\hdc,\rcItem\left,\rcItem\top,\rcItem\left+width0,\rcItem\bottom+1)                 ; text umranden
              ;Rectangle_(\hdc,\rcItem\left+width0-1,\rcItem\top,\rcItem\left+width0+width1,\rcItem\bottom+1) ; balken umranden
              ;SelectObject_(\hDC,oldBrush)
              ;SelectObject_(\hDC,oldPen)

          ; text in column 0 zeichnen
          SetTextColor_(\hdc,RGB($00,$00,$00))                                         ; textfarbe setzen
          TextOut_(\hdc,\rcItem\left+5,\rcItem\top+1,@text,Len(text))

          ; balken mit dem pinsel in column 1 zeichen
          oldBrush = SelectObject_(\hdc,brush)
          oldPen   = SelectObject_(\hdc,GetStockObject_(#NULL_PEN))
          Rectangle_(\hdc,\rcItem\left+width0,\rcItem\top+1,\rcItem\left+width0+percent,\rcItem\bottom)       ; normale balken
          ;RoundRect_(\hdc,\rcItem\left+width0,\rcItem\top+2,\rcItem\left+width0+percent,\rcItem\bottom,12,12) ; alternativ: abgerundete balken ohne AntiAliasing
          SelectObject_(\hDC,oldBrush)
          SelectObject_(\hDC,oldPen)

          ; pinsel loeschen
          DeleteObject_(brush)
          DeleteObject_(brushsel)
          DeleteObject_(background)
        EndIf
      EndWith
    EndIf
    ProcedureReturn #True
  EndIf
  ProcedureReturn #PB_ProcessPureBasicEvents 
EndProcedure 

RandomSeed(3)

If OpenWindow(0,0,0,650,400,"Window",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  SetWindowCallback(@WinCallback())
 
  ListIconGadget(2,10,10,WindowWidth(0)-20,WindowHeight(0)-20,"Zahl",50,#LVS_OWNERDRAWFIXED|#PB_ListIcon_MultiSelect) ; ListIconGadget mit Flag #LVS_OWNERDRAWFIXED
  AddGadgetColumn(2,1,"Balken",550)
  SetGadgetFont(2, FontID(font))
  
  SetGadgetColor(2,#PB_Gadget_BackColor,RGB($C2,$D4,$EF))
 
  For i=0 To 199
    AddGadgetItem(2,-1,Str(Random(100)))
  Next
 
  Repeat
    EventID=WaitWindowEvent()
    If EventID = #PB_Event_CloseWindow
      End
    EndIf
  ForEver
EndIf

Re: Im ListIconGadget zeichnen

Verfasst: 16.03.2012 21:24
von ts-soft
:allright:
Das funktioniert mit XP, 7, mit und ohne Style, ASCII, Unicode oder Merkel.

Re: Im ListIconGadget zeichnen

Verfasst: 16.03.2012 23:00
von BSP
@Danilo.
Auch von mir:
:allright: Spitze. Vielen Dank.

Bernd

PS. Und dann auch diese Formel:
percent.f = width1/100*ValF(text)
Bin echt begeistert.
Wenn ich da immer sehe, was ich mir so zurecht doktere.
Und dabei ist es doch manchmal sooo einfach. :)

Re: Im ListIconGadget zeichnen

Verfasst: 17.03.2012 10:13
von Danilo
Nochmal wegen dem ersten Code: Der sollte auch auf XP laufen, allerdings benötigt er
die Comctl32.dll (Common Controls) in der Version 6.0.
Standard ist auf XP Version 5.82, aber auch die Version 6.0 ist da verfügbar.

Ich weiß nicht ob es bei PB möglich ist das integrierte *.exe.manifest zu bearbeiten,
aber extern kann man es auch testen. Kompilieren in Balken.exe (ohne XP Skin) und dann
in das gleiche Verzeichnis die Datei "Balken.exe.manifest" mit dem gleichen Inhalt wie die
vom PB Visual Designer:

Code: Alles auswählen

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 

<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> 
    <assemblyIdentity 
        version="1.0.0.0" 
        processorArchitecture="X86" 
        name="Balken"
        type="win32" 
    /> 

    <description>ListIconGadget mit selbst gezeichneten Balken</description> 

    <dependency> 
        <dependentAssembly> 
            <assemblyIdentity 
                type="win32" 
                name="Microsoft.Windows.Common-Controls" 
                version="6.0.0.0" 
                processorArchitecture="X86" 
                publicKeyToken="6595b64144ccf1df" 
                language="*" 
            /> 
        </dependentAssembly> 
    </dependency> 
</assembly>
Damit sollte es dann normalerweise gehen, wenn die Common-Controls in der Version 6.0 geladen werden.

Re: Im ListIconGadget zeichnen

Verfasst: 17.03.2012 11:01
von Nino
Hallo,

das führt hier
PB 4.60 unter Win XP SP3 x86 (egal ob im Unicode-Modus compiliert oder nicht)
zum selben Ergebnis wie vorher. "Balken.exe.manifest" habe ich als UTF-8-Datei gespeichert, ich hoffe das ist das richtige Format dafür.

Von der comctl32.dll habe ich hier 8 Exemplare. :?

Code: Alles auswählen

c:\WINDOWS\system32\comctl32.dll
c:\Programme\CyberLink\PowerDirector\comctl32.dll
c:\I386\ASMS\6000\MSFT\WINDOWS\COMMON\CONTROLS\COMCTL32.DLL
c:\WINDOWS\WinSxS\x86_Microsoft.Windows.Common-Controls_6595b64144ccf1df_6.0.0.0_x-ww_1382d70a\comctl32.dll
c:\WINDOWS\WinSxS\x86_Microsoft.Windows.Common-Controls_6595b64144ccf1df_6.0.2600.2180_x-ww_a84f1ff9\comctl32.dll
c:\WINDOWS\WinSxS\x86_Microsoft.Windows.Common-Controls_6595b64144ccf1df_6.0.2600.2982_x-ww_ac3f9c03\comctl32.dll
c:\WINDOWS\WinSxS\x86_Microsoft.Windows.Common-Controls_6595b64144ccf1df_6.0.2600.5512_x-ww_35d4ce83\comctl32.dll
c:\WINDOWS\WinSxS\x86_Microsoft.Windows.Common-Controls_6595b64144ccf1df_6.0.2600.6028_x-ww_61e65202\comctl32.dll
Die beiden ersten sind Version 5.8x, die anderen sind Version 6.0x.
Das entscheidende Exemplar ist wahrscheinlich das im Verzeichnis C:\WINDOWS\system32\, oder?
Kann man nicht dort die neueste Version hinkopieren, und dann die anderen löschen? :mrgreen:

Grüße, Nino