Im ListIconGadget zeichnen

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
rolaf
Beiträge: 3843
Registriert: 10.03.2005 14:01

Re: Im ListIconGadget zeichnen

Beitrag 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
:::: WIN 10 :: PB 5.73 :: (x64) ::::
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Im ListIconGadget zeichnen

Beitrag 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:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: Im ListIconGadget zeichnen

Beitrag 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)
Zuletzt geändert von Nino am 16.03.2012 19:02, insgesamt 1-mal geändert.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Im ListIconGadget zeichnen

Beitrag 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.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Frabbing
Beiträge: 160
Registriert: 15.02.2007 21:31
Kontaktdaten:

Re: Im ListIconGadget zeichnen

Beitrag von Frabbing »

Geht auch mit Ascii/Ansi mit Chr(127), sieht sogar noch besser aus:

Bild
Gruß, Frank
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: Im ListIconGadget zeichnen

Beitrag 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
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Im ListIconGadget zeichnen

Beitrag von ts-soft »

:allright:
Das funktioniert mit XP, 7, mit und ohne Style, ASCII, Unicode oder Merkel.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
BSP
Beiträge: 203
Registriert: 01.02.2009 14:04

Re: Im ListIconGadget zeichnen

Beitrag 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. :)
PB 5.31 (x86) & (x64) Win10
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: Im ListIconGadget zeichnen

Beitrag 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.
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: Im ListIconGadget zeichnen

Beitrag 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
Antworten