[gelöst] TreeGadget mit Icons > 16x16 ?
[gelöst] TreeGadget mit Icons > 16x16 ?
moin, moin...
Gibts eine einfache Möglichkeit, in einem Treegadget Icons größer als 16x16 zu nutzen (32x32 reicht mir wahrscheinlich aus) ?
mDv... scholly
Gibts eine einfache Möglichkeit, in einem Treegadget Icons größer als 16x16 zu nutzen (32x32 reicht mir wahrscheinlich aus) ?
mDv... scholly
Zuletzt geändert von scholly am 17.05.2008 16:52, insgesamt 2-mal geändert.
Ich bin blutiger PB-Anfänger.
seit 17.12.08: PB 4.3 unter XP Home(SP3)
seit 17.12.08: PB 4.3 unter XP Home(SP3)
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:
2 Fehler berichtigt
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
Zuletzt geändert von Shardik am 25.09.2007 11:35, insgesamt 1-mal geändert.
Danke für die "Übersetzung" 
Leider bekomme ich es nicht hin, statt per CreateImage() zu zeichnen, Icons per LoadImage() zu nehmen:Alle 4 Icons sind 32x32 und 32bit.
Was mach ich flasch ?
gespannt... scholly

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")
Was mach ich flasch ?
gespannt... scholly
Ich bin blutiger PB-Anfänger.
seit 17.12.08: PB 4.3 unter XP Home(SP3)
seit 17.12.08: PB 4.3 unter XP Home(SP3)
Jo, hab ich jetzt auch hinbekommen:roherter hat geschrieben:Also mit BMP's geht über Loadimage!
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
Fürs ImageGadget klappts z.B. problemlos auch mit ICOs.
Egal... hauptsache tut.
Danke... scholly
Ich bin blutiger PB-Anfänger.
seit 17.12.08: PB 4.3 unter XP Home(SP3)
seit 17.12.08: PB 4.3 unter XP Home(SP3)
Try this code :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.
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
...
For free libraries and tools, visit my web site (also home of jaPBe V3 and PureFORM).
gnozal hat geschrieben:Try this code :

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


Ich bin blutiger PB-Anfänger.
seit 17.12.08: PB 4.3 unter XP Home(SP3)
seit 17.12.08: PB 4.3 unter XP Home(SP3)
@gnozal,
Danke schön für Deinen Hinweis.
@scholly
Ich habe für alle, die ein sofort funktionsfähiges Beispiel suchen, meinen obigen Code um die Anzeige eines Icon erweitert:
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
ImageList_AddIcon(himl, hicon) ist also ein Makro und macht nichts anderes als ImageList_ReplaceIcon(himl, -1, hicon) aufzurufen...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)

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
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
Das Bullet_3.bmp ist zwar 50x32, wird aber passend abgeschnitten und auch mit PB verteilt 
bis denne... scholly
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)

bis denne... scholly
Ich bin blutiger PB-Anfänger.
seit 17.12.08: PB 4.3 unter XP Home(SP3)
seit 17.12.08: PB 4.3 unter XP Home(SP3)
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.
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