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

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
scholly
Beiträge: 793
Registriert: 04.11.2005 21:30
Wohnort: Düsseldorf

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

Beitrag 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
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)
Benutzeravatar
Shardik
Beiträge: 746
Registriert: 25.01.2005 12:19

Beitrag 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
Zuletzt geändert von Shardik am 25.09.2007 11:35, insgesamt 1-mal geändert.
Benutzeravatar
scholly
Beiträge: 793
Registriert: 04.11.2005 21:30
Wohnort: Düsseldorf

Beitrag 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
Ich bin blutiger PB-Anfänger.
seit 17.12.08: PB 4.3 unter XP Home(SP3)
Benutzeravatar
roherter
Beiträge: 1407
Registriert: 10.04.2005 18:58
Kontaktdaten:

Beitrag von roherter »

Also mit BMP's geht über Loadimage!
Purebasic 5.0 32bit und 64 bit

I'm back from hell
Benutzeravatar
scholly
Beiträge: 793
Registriert: 04.11.2005 21:30
Wohnort: Düsseldorf

Beitrag 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
Ich bin blutiger PB-Anfänger.
seit 17.12.08: PB 4.3 unter XP Home(SP3)
Benutzeravatar
gnozal
Beiträge: 219
Registriert: 04.12.2004 13:01
Wohnort: Frankreich (67)
Kontaktdaten:

Beitrag 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 
  ...
For free libraries and tools, visit my web site (also home of jaPBe V3 and PureFORM).
Benutzeravatar
scholly
Beiträge: 793
Registriert: 04.11.2005 21:30
Wohnort: Düsseldorf

Beitrag 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
Ich bin blutiger PB-Anfänger.
seit 17.12.08: PB 4.3 unter XP Home(SP3)
Benutzeravatar
Shardik
Beiträge: 746
Registriert: 25.01.2005 12:19

Beitrag 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
Benutzeravatar
scholly
Beiträge: 793
Registriert: 04.11.2005 21:30
Wohnort: Düsseldorf

Beitrag 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
Ich bin blutiger PB-Anfänger.
seit 17.12.08: PB 4.3 unter XP Home(SP3)
Benutzeravatar
Shardik
Beiträge: 746
Registriert: 25.01.2005 12:19

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