Om het kort te houden: ik ben voor een IDE een menu aan het maken. Gebruikers kunnen daar items aan toevoegen die zijn gekoppeld aan externe executables. Nu leek het me wel handig om een icoontje aan die items toe te voegen, puur ter herkenning:
CODE MIST STUKJES, MAAR DAT IS PUUR OM DE BOEL EEN BEETJE RELEVANT TE HOUDEN
Een puik stukje Arrow Code zeg ik maar (er ontbreken een stuk of 3~4 indents uit dit knipsels).
Goed. Simpelgezegd voegt dit item voor elk bestaande toolitem een TMenuItem toe, stelt die in (weggelaten) en gaat daarna naar een icon zoeken. Kijkt dan hoeveel icons er in de exe zitten, dan het kleinste (16x16) icon opzoeken in de lijst van verzamelde icons, en die in een globale ImageList opslaan. Bij het opslaan wordt de index van het zojuist opgeslagen item ook opgeslagen in de ImageIndex van een menuitem.
Dit zou allemaal moeten werken, maar doet het om wat voor reden dan ook niet. Het menuitem toont simpelweg geen icon. Hier wat ik alvast heb kunnen constateren:
CODE MIST STUKJES, MAAR DAT IS PUUR OM DE BOEL EEN BEETJE RELEVANT TE HOUDEN
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
| if fToolList.Count > 0 then begin // Pass all menu items for I:=0 to pred(fToolList.Count) do begin Item:= TMenuItem.Create(fMenu); // If it doesn't have an icon already if not fToolList.Items[I].HasIcon then begin Icon:=TIcon.Create; try if FileExists(S) then begin // Er moet een variabele meegegeven worden LargeIcons := nil; SmallIcons := nil; // Lijst opbouwen die alle icons bevat numicons:=ExtractIconEx(PChar(S),-1,LargeIcons^,SmallIcons^,0); if numicons > 0 then begin // Pluk de kleinste eruit GetMem(SmallIcons,sizeof(HICON)*numicons); ExtractIconEx(PChar(S),0,LargeIcons^,SmallIcons^,numicons); Inc(SmallIcons,numicons-1); Icon.Handle:=SmallIcons^; // Check if we got hold of something Icon.savetofile('C:\Users\Johan Mes\Desktop\icon' + inttostr(I) + '.ico'); // Add the icon to the image lists if it exists if Icon.Handle <> 0 then begin // Add it to every theme fToolList.Items[I].IcoNumNewLook:=dmMain.MenuImages_NewLook.AddIcon(Icon); fToolList.Items[I].IcoNumBlue:=dmMain.MenuImages_Blue.AddIcon(Icon); fToolList.Items[I].IcoNumGnome:=dmMain.MenuImages_Gnome.AddIcon(Icon); fToolList.Items[I].HasIcon:=True; // Save random prestored icon to see what format it uses - laat in gedachte weg dmMain.MenuImages_NewLook.GetIcon(1,Icon); Icon.savetofile('C:\Users\Johan Mes\Desktop\testiconfromlib' + inttostr(1) + '.ico'); // Setting the image index to 'not -1' should do the trick if devData.Theme=DEV_GNOME_THEME then Item.ImageIndex:=fToolList.Items[I].IcoNumGnome else if devData.Theme=DEV_BLUE_THEME then Item.ImageIndex:=fToolList.Items[I].IcoNumBlue else Item.ImageIndex:=fToolList.Items[I].IcoNumNewLook; MessageBox(application.Handle,PChar('Icon belonging to ' + S + ' exists. Added as index ' + inttostr(Item.ImageIndex) + '!'),PChar('bericht'),MB_OK); end; end; FreeMem(SmallIcons,sizeof(HICON)*numicons); // gevaarlijk, maar van later zorg end; finally Icon.Free; end; end; fMenu.Add(Item); end; end; |
Een puik stukje Arrow Code zeg ik maar (er ontbreken een stuk of 3~4 indents uit dit knipsels).
Goed. Simpelgezegd voegt dit item voor elk bestaande toolitem een TMenuItem toe, stelt die in (weggelaten) en gaat daarna naar een icon zoeken. Kijkt dan hoeveel icons er in de exe zitten, dan het kleinste (16x16) icon opzoeken in de lijst van verzamelde icons, en die in een globale ImageList opslaan. Bij het opslaan wordt de index van het zojuist opgeslagen item ook opgeslagen in de ImageIndex van een menuitem.
Dit zou allemaal moeten werken, maar doet het om wat voor reden dan ook niet. Het menuitem toont simpelweg geen icon. Hier wat ik alvast heb kunnen constateren:
- De items die al in de dmMain.MenuImages stonden zijn origineel opgeslagen als 16x16 24bpp.
- De messagebox toont de goeie informatie. De icons worden netjes aan het eind zonder fouten toegevoegd.
- Item.ImageIndex een waarde geven van de vooraf geladen icons levert wel een plaatje op.
- Item.ImageIndex een waarde geven van een zojuist geladen icon levert geen plaatje op.
- Beide soorten icons saven levert bij beide een 16x16 32bpp-plaatje op (de savetofile-calls).
- De MessageBox verschijnt altijd als een icon gevonden wordt.
- Uiteraard ben ik weer iets stoms vergeten. Dat is altijd zo.