[delphi/win32] LoadImage en DrawIconEx met 32-bit icoontje

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

  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 15-05 14:44

_Thanatos_

Ja, en kaal

Topicstarter
Ik heb een programma waarin ik in een resource een 32-bit icoontje heb gestopt, met een slpha-channel dus. Nu wil ik dat icoontje op een bitmap tekenen, maar ik zie dat alpha-channel niet meer terug. Hij pakt de 24-bit versie van het icoontje:
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
procedure LoadIcon(const Name: string; Dest: TBitmap);
var
   Icon: HIcon;
begin
Icon := LoadImage(HInstance, PChar(Name), IMAGE_ICON, 16, 16,
                  LR_DEFAULTCOLOR);
try
  Dest.Canvas.Brush.Color := clBtnFace;
  Dest.Canvas.FillRect(Rect(0, 0, Dest.Width, Dest.Height));
  DrawIconEx(Dest.Canvas.Handle, 0, 0, Icon, 16, 16, 0, 0, DI_NORMAL);
finally
  DestroyIcon(Icon);
 end;
end;

Ik heb op Google alleen maar mensen gevonden die het niet snappen, die zeggen "een bitmap ondersteunt geen alpha channel!", maar dat is natuurlijk niet van toepassing nu.

Het gekke is ook dat als ik dat icoontje in design-time in een TImage laad, dan zie ik het alpha-channel wél. Maar hoe krijg ik het alpha-channel nou in runtime?

[ Voor 3% gewijzigd door _Thanatos_ op 17-07-2004 16:58 ]

日本!🎌


  • alienfruit
  • Registratie: Maart 2003
  • Laatst online: 22-05 23:32

alienfruit

the alien you never expected

Ik zou zeggen duik eens in de broncode de Picture dialog en/of TImage :)

  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 15-05 14:44

_Thanatos_

Ja, en kaal

Topicstarter
Kan ik het daarmee oplossen? Want ik zie niet waar daar anders is. TImage gebruikt Canvas.StretchDraw om te tekenen, welke op zijn beurt TGraphic.Draw aanroept (en dus TIcon.Draw) en die roept weer DrawIconEx aan. Met dezelfde parameters als die ik gebruik.

Dus misschien gaat het bij LoadImage al fout. Is daar iets aan te doen?

日本!🎌


  • alienfruit
  • Registratie: Maart 2003
  • Laatst online: 22-05 23:32

alienfruit

the alien you never expected

Wat als je eerste en Imagelist aanmaakt vervolgens daar je icon inlaad en vervolgens dit gebruikt om op je TImage te tekenen?

  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 15-05 14:44

_Thanatos_

Ja, en kaal

Topicstarter
Dat maakt niets uit, maar was het ook niet zo dat imagelists geen alpha-channel ondersteunen? Anyway, nu weet ik nog steeds niet of het nou mis gaat bij het laden of bij het tekenen van het icoontje...

/edit
ook als ik een imagelist via winAPI aanmaak met ILC_COLOR32, dan werkt het alpha-channel nog steeds niet...

/edit2
Als ik het icoontje vanuit een bestand laadt, weer met LoadImage maar dan met de flag LR_LOADFROMFILE erbij, dan zie ik opeens wel keurignetjes het alphachannel! Maar het gekke is dat het aan de resource die ik ervan maak, het niet kan liggen, want als ik met Resource Hacker ga kijken, zie ik dat de 32-bits versie keurignetjes meegelinkt wordt, onder de juiste naam.

[ Voor 69% gewijzigd door _Thanatos_ op 17-07-2004 19:56 ]

日本!🎌


  • alienfruit
  • Registratie: Maart 2003
  • Laatst online: 22-05 23:32

alienfruit

the alien you never expected

Yeah right :+ Leuk, waarschijnlijk gaat er dan toch iets niet helemaal goed bij het laden van je icoon van ede resource. Laat hij hem in Resource Hacker dus wel netjes zien? Dan kan het dus inderdaad een laad probleem zijn, ik gebruik atltijd png-tjes :)

[ Voor 36% gewijzigd door alienfruit op 17-07-2004 20:20 ]


  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 15-05 14:44

_Thanatos_

Ja, en kaal

Topicstarter
Ik heb nog wat andere testjes gedaan...

• LoadIcon doet het ook niet, niet alleen omdat je dan de afmetingen niet kan opgeven, maar ook omdat je een vaag wit randje om de icoontjes krijgt.
• TResourceStream geeft een grootte van 34 bytes, en is daardoor compleet onbruikbaar (SizeOfResource geeft dat terug), waardoor ook LoadResource gelijk onbruikbaar wordt.
• LoadImage gebruiken en expliciet de ID van het 32-bits icoontje opgeven, resulteert in een leeg icoontje.

Mozes, come on zeg, dit moet toch kunnen werken :?

日本!🎌


  • BoomSmurf
  • Registratie: Maart 2003
  • Laatst online: 13-06-2025

BoomSmurf

Am-Ende!

Ik heb dit een paar maanden geleden nog gedaan. Was nogal een gedoe :D Je moet RGB en A toch in een 32bit bitmap gooien en dan de AlphaBlend functie gebruiken (zie MSDN).... IIRC. Als ik er aan denk zal ik morgen even de code zoeken. Ik gebruikte het niet op dezelfde manier als jij nu doet maar misschien helpt het.

[ Voor 16% gewijzigd door BoomSmurf op 18-07-2004 00:08 ]


  • NaliXL
  • Registratie: Maart 2002
  • Laatst online: 01-05 19:30
Misschien je icoontje in je resource-file opgeven als RCDATA? Dan weet je zeker dat 'ie hetzelfde is als 't originele bestand.

Genoeg is meer dan veel, en tart den overvloed


  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 15-05 14:44

_Thanatos_

Ja, en kaal

Topicstarter
Mja, het alpha-blended icoontje zal natuurlijk sowieso alleen in XP te zien zijn. Ik heb er dus toch maar PNG van gemaakt. Die heeft ook een alpha-channel en die werkt op alle systemen. Het .res-bestandje is nu ook een stuk kleiner :)

日本!🎌

Pagina: 1