[Delphi] Icon in een RC_DATA resource uitlezen

Pagina: 1
Acties:
  • 105 views sinds 30-01-2008
  • Reageer

  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 01:25

Tomatoman

Fulltime prutser

Topicstarter
Tot nu toe maakt mijn applicatie op de volgende manier runtime een icon in een TImage aan:
Delphi:
1
2
3
4
5
6
7
FImage := TImage.Create(Self);
FImage.Parent := Self;
with FImage do
begin
  AutoSize := True;
  Picture.Icon.Handle := LoadIcon(HInstance, IconID);
end;
waarbij IconID een getal is dat een resource van het type ICON identificeert.

Op zicht werk dat prima, maar het probleem is dat alle ICON resources ook zichtbaar zijn als je een shortcut naar de applicatie maakt en bij de shortcuteigenschappen kiest voor 'Ander pictogram'. Dan is niet alleen de icon van de applicatie zichtbaar, maar ook die andere icons:
Afbeeldingslocatie: http://home.planet.nl/~gerre120/linked/shortcut_icons.jpg

Je ziet dat naast de default icon ook vier andere icons zichtbaar zijn. En dat wil ik niet. Nu kan ik heel eenvoudig die vier icons opslaan als resources van het type RC_DATA, maar hoe laad ik ze dan uit de resource? LoadIcon 'ziet' geen resources van het type RC_DATA. Heeft iemand een suggestie?

Een goede grap mag vrienden kosten.


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

LoadResource? :)

Professionele website nodig?


  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 01:25

Tomatoman

Fulltime prutser

Topicstarter
Dan krijg ik een handle naar een resource. Met LockResource kan ik vervolgens een pointer naar de resource data krijgen, maar ik weet niet zo best wat ik daarmee moet. Het enige wat ik wil hebben, is een icon handle. Maar misschien leiden er wel meer wegen naar Rome :).

Een goede grap mag vrienden kosten.


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Icon kun je on-the-fly ook construeren uit 2 bitmaps en 3 variabelen *hinthint* :)

Professionele website nodig?


Verwijderd

cool hints!!!! 4 woorden? .....1e woord klinkt als? biet?....read??! ja!?! 2e woord? klinkt als duh? the? 3e woord? ..... Hela! geen obscene gebaren maken wil je?! ... 4e woord 1e lettergreep...klote? ballen? man? ..MAN! rest het woord? man pols? man klok? man nu al? ...

CreateIconFromResource ?

[ Voor 7% gewijzigd door Verwijderd op 11-06-2003 00:35 ]


  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 01:25

Tomatoman

Fulltime prutser

Topicstarter
CreateIconFromResource kende ik nog niet. Naar aanleiding daarvan heb ik nu de volgende code:
Delphi:
6
7
8
9
10
11
12
13
14
15
16
17
18
19
{retrieve a handle to the icon resource}
ResHandle := FindResource(HInstance, MakeIntResource(GetIconID), RT_RCDATA);
IconBits := LoadResource(HInstance, ResHandle);
IconBitsPtr := LockResource(IconBits);

{find the icon that fits the current display device}
ResID := LookupIconIDFromDirectory(IconBitsPtr, True);
ResHandle := FindResource(HInstance, MakeIntResource(ResID), RT_ICON);
IconBits := LoadResource(HInstance, ResHandle);
IconBitsPtr := LockResource(IconBits);

{create a new icon from the correct icon resource information}
Picture.Icon.Handle := CreateIconFromResource(IconBitsPtr,
  SizeOfResource(HInstance, ResHandle), True, $30000);
Alles gaat goed tot regel 13. Daar krijgt ResHandle de waarde 0, waardoor de rest van de code niet veel zin meer heeft. Als ik de resource terugverander in het type ICON en in regel 7 de waarde RT_RCDATA vervang door RT_GROUP_ICON geeft regel 13 geen problemen meer :/. Help!

[ Voor 3% gewijzigd door Tomatoman op 11-06-2003 01:52 ]

Een goede grap mag vrienden kosten.


  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 01:25

Tomatoman

Fulltime prutser

Topicstarter
En dit werkt ook al niet:
Delphi:
6
7
8
9
10
11
12
13
14
15
16
17
{retrieve a handle to the icon resource}
ResHandle := FindResource(GetIconLib, MakeIntResource(GetIconID), RT_RCDATA);
IconBitsPtr := LockResource(LoadResource(GetIconLib, ResHandle));

MemStream := TMemoryStream.Create;
try
  MemStream.Write(IconBitsPtr, SizeOfResource(GetIconLib, ResHandle));
  MemStream.Position := 0;
  Picture.Icon.LoadFromStream(MemStream);
finally
  MemStream.Free;
end;
Dat geeft namelijk een EInvalidGraphic exception met de tekst' Icon image is not valid.'

Een goede grap mag vrienden kosten.


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Zet eens een breakpoint op regel 12, check de hexdump van IconBitsPtr en vergelijk die me de hexdump van de originele .ico file?

P&W FAQ - Leer **** debuggen!! ;)

Professionele website nodig?


Verwijderd

kijk maar ffe op me wenbsite
http://www.delphihackerspages.nl/FIE.htm

.modbreak: spam verwijderd. deze link is volgens mij wel nuttig maar je website als geheel promoten mag je via je profile bij 'mijn homepage' doen :)

[ Voor 52% gewijzigd door curry684 op 11-06-2003 13:07 ]


  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 01:25

Tomatoman

Fulltime prutser

Topicstarter
curry684 schreef op 11 June 2003 @ 10:04:
Zet eens een breakpoint op regel 12, check de hexdump van IconBitsPtr en vergelijk die me de hexdump van de originele .ico file?

P&W FAQ - Leer **** debuggen!! ;)
Er zijn mensen die wél debuggen en daarvan ben ik er een. Natuurlijk had ik dit al gecheckt en natuurlijk wijst IconBitsPtr naar precies dezelfde geheugeninhoud als de originele .ico file :).
Bedankt, je hebt me met TResourceStream op het goede spoor gezet. Het eindresultaat werkt!
Delphi:
6
7
8
9
10
11
12
13
14
15
16
17
if GetIconLib = 0 then
  Picture.Icon.Handle := LoadIcon(0, GetIconID)
else
begin
  ResStream := TResourceStream.CreateFromID(GetIconLib,
    Integer(GetIconID), RT_RCDATA);
  try
    Picture.Icon.LoadFromStream(ResStream);
  finally
    ResStream.Free;
  end;
end;

Een goede grap mag vrienden kosten.


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

tomatoman: er stond een grote knipoog bij, ik ken je langer als vandaag :) wilde vooral even zeker weten dat je dat had gechecked ;)

Professionele website nodig?

Pagina: 1