Seite 1 von 2

[gelöst] TreeGadget mit Icons > 16x16 ?

Verfasst: 23.09.2007 20:48
von scholly
moin, moin...

Gibts eine einfache Möglichkeit, in einem Treegadget Icons größer als 16x16 zu nutzen (32x32 reicht mir wahrscheinlich aus) ?

mDv... scholly

Verfasst: 24.09.2007 12:18
von Shardik
Ich habe einmal schnell ein erst gestern im englischen Forum veröffentlichtes Beispiel von Sparkie für größere Icons in einem ListIconGadget (http://www.purebasic.fr/english/viewtop ... 57&start=2) für das TreeGadget modifiziert:

Code: Alles auswählen

;...New icon size 
iconW = 64 
iconH = 64 

;...Create some images for this example 
zeroImg = CreateImage(0, iconW, iconH) 
StartDrawing(ImageOutput(0)) 
Box(0, 0, iconW, iconH, RGB(0, 0, 0)) 
StopDrawing() 

greenImg = CreateImage(1, iconW, iconH) 
StartDrawing(ImageOutput(1)) 
Box(0, 0, iconW, iconH, RGB(0, 255, 0)) 
StopDrawing() 

blueImg = CreateImage(2, iconW, iconH) 
StartDrawing(ImageOutput(2)) 
Box(0, 0, iconW, iconH, RGB(0, 0, 255)) 
StopDrawing() 

redImg = CreateImage(3, iconW, iconH) 
StartDrawing(ImageOutput(3)) 
Box(0, 0, iconW, iconH, RGB(255, 0, 0)) 
StopDrawing() 

;...Create our newly sized image list 
newIL = ImageList_Create_(iconW, iconH, #ILC_COLOR32|#ILC_MASK, 0, 20) 

;...Add our images 
ImageList_Add_(newIL, ImageID(0), 0) 
ImageList_Add_(newIL, ImageID(1), 0) 
ImageList_Add_(newIL, ImageID(2), 0) 
ImageList_Add_(newIL, ImageID(3), 0) 

If OpenWindow(0, 0, 0, 700, 500, "TreeGadget mit großen Icons",  #PB_Window_SystemMenu | #PB_Window_ScreenCentered) And CreateGadgetList(WindowID(0)) 
  TreeGadget(0, 10, 10, 680, 480) 

  AddGadgetItem (0, -1, "Node 1", greenImg, 0)
  FreeImage(1) 
  AddGadgetItem (0, -1, "Node 2", blueImg, 0)
  FreeImage(2) 
  AddGadgetItem(0, -1, "Sub-Item 1", redImg, 1)
  FreeImage(3) 
  AddGadgetItem(0, -1, "Sub-Item 2", 0, 1)
  FreeImage(0) 
        
  ;...Get handle to current TreeGadget normal image list 
  oldIL = SendMessage_(GadgetID(0), #TVM_GETIMAGELIST, #TVSIL_NORMAL, 0) 
  ;...Replace the old image list with our new one 
  SendMessage_(GadgetID(0), #TVM_SETIMAGELIST, #TVSIL_NORMAL, newIL) 
  ;...Destroy the old image list 
  ImageList_Destroy_(oldIL) 
  Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow 
EndIf 
End
2 Fehler berichtigt

Verfasst: 24.09.2007 21:24
von scholly
Danke für die "Übersetzung" :)

Leider bekomme ich es nicht hin, statt per CreateImage() zu zeichnen, Icons per LoadImage() zu nehmen:

Code: Alles auswählen

redImg = LoadImage(3, "32x32_3.ico")
zeroImg = LoadImage(2, "32x32_4.ico")
blueImg = LoadImage(0, "32x32_folder7.ico")
greenImg = LoadImage(1, "32x32_folder8.ico")
Alle 4 Icons sind 32x32 und 32bit.
Was mach ich flasch ?

gespannt... scholly

Verfasst: 24.09.2007 21:46
von roherter
Also mit BMP's geht über Loadimage!

Verfasst: 24.09.2007 23:33
von scholly
roherter hat geschrieben:Also mit BMP's geht über Loadimage!
Jo, hab ich jetzt auch hinbekommen:

Code: Alles auswählen

;...New icon size
iconW = 32
iconH = 32

;...load some images for this example

dummy = LoadImage(0, "32x32_1.bmp") ;irgendwo wird sonst das erste verschluckt

top1   = LoadImage(1, "32x32_folder7.bmp")
top2   = LoadImage(2, "32x32_folder8.bmp")
t2sub1 = LoadImage(3, "32x32_3.bmp")
t2sub2 = LoadImage(4, "32x32_4.bmp")

;...Create our newly sized image list
newIL = ImageList_Create_(iconW, iconH, #ILC_COLOR32|#ILC_MASK, 0, 20)

;...Add our images
ImageList_Add_(newIL, ImageID(0), 0)
ImageList_Add_(newIL, ImageID(1), 0)
ImageList_Add_(newIL, ImageID(2), 0)
ImageList_Add_(newIL, ImageID(3), 0)
ImageList_Add_(newIL, ImageID(4), 0)

If OpenWindow(0, 0, 0, 700, 500, "TreeGadget mit großen Icons",  #PB_Window_SystemMenu | #PB_Window_ScreenCentered) And CreateGadgetList(WindowID(0))
  TreeGadget(0, 10, 10, 680, 480)

  AddGadgetItem (0, -1, "Node 1", top1, 0)
  FreeImage(1)
  AddGadgetItem (0, -1, "Node 2", top2, 0)
  FreeImage(2)
  AddGadgetItem(0, -1, "Sub-Item 1", t2sub1, 1)
  FreeImage(3)
  AddGadgetItem(0, -1, "Sub-Item 2", t2sub2, 1)
  FreeImage(4)
  FreeImage(0)
       
  ;...Get handle to current TreeGadget normal image list
  oldIL = SendMessage_(GadgetID(0), #TVM_GETIMAGELIST, #TVSIL_NORMAL, 0)
  ;...Replace the old image list with our new one
  SendMessage_(GadgetID(0), #TVM_SETIMAGELIST, #TVSIL_NORMAL, newIL)
  ;...Destroy the old image list
  ImageList_Destroy_(oldIL)
  Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
End 
Es irritiert mich allerdings, daß es mit BMPs klappt und mit ICOs nicht.
Fürs ImageGadget klappts z.B. problemlos auch mit ICOs.

Egal... hauptsache tut.

Danke... scholly

Verfasst: 25.09.2007 17:02
von gnozal
scholly hat geschrieben:Es irritiert mich allerdings, daß es mit BMPs klappt und mit ICOs nicht.
Fürs ImageGadget klappts z.B. problemlos auch mit ICOs.
Try this code :

Code: Alles auswählen

  ...
  If GetObjectType_(hImg) = #OBJ_BITMAP
    ; *** Image is a BMP
    Result = ImageList_Add_(ImageList, hImg, 0) 
    Debug "Add bitmap"
    Debug Result
  Else 
    ; *** Image is an ICO
    Result = ImageList_ReplaceIcon_(ImageList, -1, hImg)
    Debug "Add icon"
    Debug Result
  EndIf 
  ...

Verfasst: 25.09.2007 17:55
von scholly
gnozal hat geschrieben:Try this code :
:praise:

Wenn die win32sdk.hlp ein ordentliches Inhaltsverzeichnis haben würde, hätte ich vielleicht eher die Chance gehabt, selber zum Erfolg zu kommen.

Selbstverständlich funktioniert es mit ImageList_ReplaceIcon_() - Ich hab dann noch etwas quergelesen und ImageList_AddIcon_() statt ImageList_Add_() tuts auch :)


:allright: danke... scholly

Verfasst: 26.09.2007 09:10
von Shardik
@gnozal,
Danke schön für Deinen Hinweis.

@scholly
Scholly hat geschrieben: Selbstverständlich funktioniert es mit ImageList_ReplaceIcon_() - Ich hab dann noch etwas quergelesen und ImageList_AddIcon_() statt ImageList_Add_() tuts auch
Win32 Programmer's Reference hat geschrieben: The ImageList_AddIcon macro adds an icon or cursor to an image list. ImageList_AddIcon calls the ImageList_ReplaceIcon function.
...
The ImageList_AddIcon macro is defined as follows:

#define ImageList_AddIcon(himl, hicon) ImageList_ReplaceIcon(himl, -1, hicon)
ImageList_AddIcon(himl, hicon) ist also ein Makro und macht nichts anderes als ImageList_ReplaceIcon(himl, -1, hicon) aufzurufen... :wink:

Ich habe für alle, die ein sofort funktionsfähiges Beispiel suchen, meinen obigen Code um die Anzeige eines Icon erweitert:

Code: Alles auswählen

;...New icon size 
iconW = 32 
iconH = 32 

;...Create some images for this example 
zeroImg = CreateImage(0, iconW, iconH) 
StartDrawing(ImageOutput(0)) 
Box(0, 0, iconW, iconH, RGB(0, 0, 0)) 
StopDrawing() 

greenImg = CreateImage(1, iconW, iconH) 
StartDrawing(ImageOutput(1)) 
Box(0, 0, iconW, iconH, RGB(0, 255, 0)) 
StopDrawing() 

blueImg = CreateImage(2, iconW, iconH) 
StartDrawing(ImageOutput(2)) 
Box(0, 0, iconW, iconH, RGB(0, 0, 255)) 
StopDrawing() 

redImg = CreateImage(3, iconW, iconH) 
StartDrawing(ImageOutput(3)) 
Box(0, 0, iconW, iconH, RGB(255, 0, 0)) 
StopDrawing()

IconImg = LoadImage(4, #PB_Compiler_Home + "Examples\Sources\Data\CDPlayer.Ico")

;...Create our newly sized image list 
newIL = ImageList_Create_(iconW, iconH, #ILC_COLOR32|#ILC_MASK, 0, 10)

;...Add our images 
ImageList_Add_(newIL, ImageID(0), 0) 
ImageList_Add_(newIL, ImageID(1), 0) 
ImageList_Add_(newIL, ImageID(2), 0) 
ImageList_Add_(newIL, ImageID(3), 0)
ImageList_ReplaceIcon_(newIL, -1, ImageID(4))

If OpenWindow(0, 0, 0, 700, 500, "TreeGadget mit großen Icons",  #PB_Window_SystemMenu | #PB_Window_ScreenCentered) And CreateGadgetList(WindowID(0)) 
  TreeGadget(0, 10, 10, 680, 480) 

  AddGadgetItem (0, -1, "Node 1", greenImg, 0) 
  FreeImage(1) 
  AddGadgetItem (0, -1, "Node 2", blueImg, 0) 
  FreeImage(2) 
  AddGadgetItem(0, -1, "Sub-Item 1", redImg, 1) 
  FreeImage(3) 
  AddGadgetItem(0, -1, "Sub-Item 2", IconImg, 1) 
  FreeImage(0) 

  SetGadgetItemState(0, 1, #PB_Tree_Expanded)
        
  ;...Get handle to current TreeGadget normal image list 
  oldIL = SendMessage_(GadgetID(0), #TVM_GETIMAGELIST, #TVSIL_NORMAL, 0) 
  ;...Replace the old image list with our new one 
  SendMessage_(GadgetID(0), #TVM_SETIMAGELIST, #TVSIL_NORMAL, newIL) 
  ;...Destroy the old image list 
  ImageList_Destroy_(oldIL) 

  Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow 
EndIf 
End

Verfasst: 26.09.2007 17:23
von scholly
Damit Andre das eventuell in das Codearchiv übernehmen kann, schlage ich vor, Du nimmst den zeroIMG-Teil raus, da er nicht benutzt wird.

Vielleicht magst Du noch 2 Varianten hinzufügen, die bei mir klappen

Code: Alles auswählen

XPicon  = ExtractIcon_(6,"c:\windows\system32\shell32.dll",183)
ImageList_ReplaceIcon_(newIL, -1, XPicon)
AddGadgetItem(0, -1, "Sub-Item 3 (Icon aus shell32.dll extrahiert)", XPicon,1)  

bmpImg  = LoadImage(5, #PB_Compiler_Home + "Examples\Sources - Advanced\Waponez II\Data\Bullet_3.bmp")
ImageList_Add_(newIL, ImageID(5),0)
AddGadgetItem(0, -1, "Node 3 (Icon ist ein .bmp)",bmpImg,0)
Das Bullet_3.bmp ist zwar 50x32, wird aber passend abgeschnitten und auch mit PB verteilt ;)

bis denne... scholly

Verfasst: 27.09.2007 11:54
von Shardik
Hallo scholly,

Danke für Deine Anregung. Ich habe meinen Beispiel-Code um Deine beiden Fälle erweitert, dabei noch einmal komplett überarbeitet und die Kommentare ins Deutsche übersetzt. Die zeroImg-Definition kann übrigens nicht herausgenommen werden, da das Beispiel sonst nicht korrekt läuft.

Code: Alles auswählen

#Tree = 0

; ----- Neue Icon-Größe
IconWidth = 32 
IconHeigth = 32 

; ----- Images für dieses Beispiel zeichnen
ZeroImage = CreateImage(0, IconWidth, IconHeigth) 
StartDrawing(ImageOutput(0)) 
Box(0, 0, IconWidth, IconHeigth, RGB(0, 0, 0)) 
StopDrawing()

GreenImage = CreateImage(1, IconWidth, IconHeigth) 
StartDrawing(ImageOutput(1)) 
Box(0, 0, IconWidth, IconHeigth, RGB(0, 255, 0)) 
StopDrawing() 

BlueImage = CreateImage(2, IconWidth, IconHeigth) 
StartDrawing(ImageOutput(2)) 
Box(0, 0, IconWidth, IconHeigth, RGB(0, 0, 255)) 
StopDrawing() 

; ----- Icon aus Ico-Datei laden
IconImage = LoadImage(3, #PB_Compiler_Home + "Examples\Sources\Data\CDPlayer.Ico")

; ----- Bild aus Bmp-Datei laden
BmpImage = LoadImage(4, #PB_Compiler_Home + "Examples\Sources - Advanced\Waponez II\Data\Bullet_3.Bmp")

; ----- Icon aus Shell32.dll extrahieren
Shell32IconImage = ExtractIcon_(0, "Shell32.dll", 10)

; ----- Neue Image-Liste anlegen 
NewImageList = ImageList_Create_(IconWidth, IconHeigth, #ILC_COLOR32 | #ILC_MASK, 0, 10)

; ----- Bilder und Icons in neuer Image-Liste eintragen 
ImageList_Add_(NewImageList, ImageID(0), 0) 
ImageList_Add_(NewImageList, ImageID(1), 0) 
ImageList_Add_(NewImageList, ImageID(2), 0) 
ImageList_ReplaceIcon_(NewImageList, -1, ImageID(3))
ImageList_Add_(NewImageList, ImageID(4), 0) 
ImageList_ReplaceIcon_(NewImageList, -1, Shell32IconImage) 

If OpenWindow(0, 0, 0, 700, 500, "TreeGadget mit großen Icons",  #PB_Window_SystemMenu | #PB_Window_ScreenCentered) And CreateGadgetList(WindowID(0)) 
  TreeGadget(#Tree, 10, 10, 680, 480) 

  AddGadgetItem (#Tree, -1, "Node 1", GreenImage, 0) 
  FreeImage(1) 
  AddGadgetItem (#Tree, -1, "Node 2", BlueImage, 0) 
  FreeImage(2) 
  AddGadgetItem(#Tree, -1, "Sub-Item 1 (Icon aus Ico-Datei)", IconImage, 1) 
  AddGadgetItem(#Tree, -1, "Sub-Item 2 (Grafik aus Bmp-Datei)", BmpImage, 1)
  AddGadgetItem(#Tree, -1, "Sub-Item 3 (Icon aus Shell32.dll)", Shell32IconImage,1)
  FreeImage(0) 

  ; ----- Untereinträge aufklappen lassen
  SetGadgetItemState(#Tree, 1, #PB_Tree_Expanded)
        
  ; ----- Handle zur aktuellen Image-Liste ermitteln 
  OldImageList = SendMessage_(GadgetID(#Tree), #TVM_GETIMAGELIST, #TVSIL_NORMAL, 0) 

  ; ----- Alte Image-Liste durch neue ersetzen 
  SendMessage_(GadgetID(#Tree), #TVM_SETIMAGELIST, #TVSIL_NORMAL, NewImageList) 

  ; ----- Alte Image-Liste löschen
  ImageList_Destroy_(OldImageList) 

  Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow 
EndIf 
End