Dzwonisz pod numer LoadIcon
. To zwraca tak zwane ikony wspólne. Zostało to wyjaśnione w dokumentacji dla DestroyIcon
. Jedną z konsekwencji bycia wspólną ikoną jest to, że nie musisz dzwonić pod numer DestroyIcon
.
Konieczne jest jedynie, aby zadzwonić DestroyIcon dla ikon i kursorów stworzony z następującymi funkcjami: CreateIconFromResourceEx (jeśli nazywa bez flagi LR_SHARED), CreateIconIndirect i CopyIcon. Nie używaj tej funkcji do niszczenia udostępnionej ikony. Ikona udostępniona jest ważna jako , o ile moduł, z którego został załadowany, pozostaje w pamięci. Poniższe funkcje uzyskują wspólną ikonę.
- Loadlcon
- LoadImage (jeśli użyć flagi LR_SHARED)
- CopyImage (jeśli używasz LR_COPYRETURNORG flagi i parametr hImage jest wspólna ikona)
- CreateIconFromResource
- CreateIconFromResourceEx (jeśli użyć flagi LR_SHARED)
Tak, jak to się ma do kodu? Cóż, kiedy piszesz
TrayIcon.Icon.Handle := LoadIcon(hInstance,'icon1');
jesteś przypisywanie do majątku TIcon
obiektu Handle
. Jeśli ten obiekt TIcon
zawiera już ikonę, ikona zostanie zniszczona przed zastąpieniem przez nową ikonę. To dlatego, że TIcon
ma własność uchwytów ikon. Wszystko to oznacza, że linia kodu powyżej powoduje wywołanie DestroyIcon
dla udostępnionej ikony. To właśnie MSDN mówi, aby nie robić, ale w rzeczywistości okazuje się być łagodny. Nie ma się czym martwić.
Teraz, nawet jeśli używasz funkcji zwracającej niewspółużytkowane ikony, np. CreateIconIndirect
wtedy twój kod nie wyciekłby uchwytów ikon. Dzieje się tak, ponieważ klasa TIcon
przejmuje własność uchwytu ikony.
Ale ponieważ używasz wspólnych ikon, nie ma możliwości wycieku tych uchwytów.Obiekty, których nie można zniszczyć, nie mogą wyciec!
Niektóre więcej punktów:
- Ja osobiście nie nazwałbym
LoadIcon
kółko tak. Nazwałbym go dwukrotnie przy uruchomieniu programu i pamiętam współdzielone ikony. Następnie użyłbym tych uchwytów, aby przypisać do TrayIcon.Icon.Handle
.
- Po wywołaniu
LoadIcon
nie masz dużej kontroli nad wielkością zwróconej ikony. Myślę, że jest możliwe, że otrzymasz dużą ikonę zamiast małej ikony. I trzeba będzie przeskalować do małego rozmiaru ikony przed wyświetleniem. Tworząc ikony obszaru powiadomień, należy upewnić się, że są one o rozmiarach SM_CXSMICON
według rozmiaru: SM_CXSMICON
.
Nie wiem, ale wiem, jak powiedzieć. Uruchom go na 10 minut z uruchomionym Process Explorer (www.sysinternals.com), a wyświetli się, jeśli masz wyciek, czy nie. –
Nie otrzymałem punktu za użycie ** wątku ** do animacji TrayIcon. Znam animowane TrayIcons z właściwością ImageList i Animate ustawioną na True –
Przykład TrayIcon z Emba http://docwiki.embarcadero.com/CodeExamples/XE3/en/TTrayIcon_(Delphi) –