Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi WinAPI: Icon nach CreateWindowEx noch ändern (https://www.delphipraxis.net/136708-winapi-icon-nach-createwindowex-noch-aendern.html)

implementation 6. Jul 2009 16:32


WinAPI: Icon nach CreateWindowEx noch ändern
 
Mein Programm erstellt mit CreateWindowEx ein Fenster.
Ich möchte diesem Fenster nachträglich ein anderes Icon zuweisen.
Wie mache ich das?

turboPASCAL 6. Jul 2009 16:39

Re: WinAPI: Icon nach CreateWindowEx noch ändern
 
Ein Beispiel:

Delphi-Quellcode:
 
var hAppIcon: HICON;    
begin
  // ...

  hAppIcon:= LoadImage(hInstance, MAKEINTRESOURCE(1), IMAGE_ICON, 0, 0, 0);

  if SendMessage(hAppHnd, WM_SETICON, ICON_SMALL, INTEGER(hAppIcon) ) = 0 then
    SendMessage(hAppHnd, WM_SETICON, ICON_BIG, INTEGER(hAppIcon) );

  DestroyIcon(Icon);

  // ...
end

implementation 6. Jul 2009 17:00

Re: WinAPI: Icon nach CreateWindowEx noch ändern
 
kann ich mit LoadImage auch Icons aus Dateien lesen, und wenn ja, wie?

[EDIT]
schon gefunden: LoadImage(hInstance,Dateiname,IMAGE_ICON,0,0,LR_LO ADFROMFILE);
es funzt auch
danke!!!!!!!!!!!!

turboPASCAL 6. Jul 2009 17:14

Re: WinAPI: Icon nach CreateWindowEx noch ändern
 
Ja, kann man.

// Edit: hat sich ja erledigt...

isilive 11. Okt 2009 01:45

Re: WinAPI: Icon nach CreateWindowEx noch ändern
 
Ich ändere in meinem Programm auch mehrfach das Icon in der Taskleiste (abhängig von einer Variable).

Delphi-Quellcode:
var   HMainIcon: HICON;
begin
  //...
  hMainIcon:= LoadImage (hInstance , name , IMAGE_ICON,16,16,LR_LOADFROMFILE);
  //..
end
Übrigens kann man mit dem 4. und 5. Parameter bestimmen welches Icon geladen wird, da eine .ico Datei oft mehrere Grössen beinhaltet (48x48, 32x32, 16x16).

Angenommen das Trayicon würde sich sehr oft ändern, dann wäre ein dauerndes 'Loadfromfile' aber Irsinn, oder?!

Kann ich die Icons irgendwie in die .exe mitreinpacken bzw. in eine Ressourcendatei reinpacken?


PS: Ich nutze keine Komponente, sondern hab mir die Prozeduren mühsam zusammengestöpselt. :coder: Am Schluss sah es so ähnlich aus wie Luckies Eintrag in der Codelib :stupid:

turboPASCAL 11. Okt 2009 04:46

Re: WinAPI: Icon nach CreateWindowEx noch ändern
 
Delphi-Quellcode:
Kann ich die Icons irgendwie in die .exe mitreinpacken bzw. in eine Ressourcendatei reinpacken?
Ja, natürlich kann man Icons in die Exe packen, über eine Resourcedatei.

Wie viele, oft oder schnell möchtest du denn die Icons ändern ?
Es gibt da mehrere Möglichkeiten zB. mit einer Imagelist (auch für NonVCL).

isilive 11. Okt 2009 12:15

Re: WinAPI: Icon nach CreateWindowEx noch ändern
 
Die Icons werden in unregelmässigen Abständen geändert.
Je nach Stellung einer TTrackbar ändert sich das Icon in der TNA.
Es gibt 6 Stück davon xx0-5.ico und die werden jetzt halt per Loadfromfile geladen.

Delphi-Quellcode:
procedure TForm1.ChangeTrayIcon(a:integer);
var name:pwidechar;
begin
  name := PChar('sound'+inttostr(a)+'.ico');
  hMainIcon:= LoadImage (hInstance , name , IMAGE_ICON,16,16,LR_LOADFROMFILE); //laden
  NID.hIcon              := HMainIcon;                                       // und zuweisen
  Shell_NotifyIcon(NIM_MODIFY, @NID);                                         // Modify melden
end;
Wie packe ich die jetzt eleganter (bzw. in die exe) rein?

turboPASCAL 11. Okt 2009 12:19

Re: WinAPI: Icon nach CreateWindowEx noch ändern
 
Da du mit der VCL arbeitest nutze doch Hier im Forum suchenCoolTrayIcon.

isilive 11. Okt 2009 12:29

Re: WinAPI: Icon nach CreateWindowEx noch ändern
 
Das möchte ich jetzt nicht, weil ich jetzt eh schon alles schritt für schritt, diskret in Prozeduren reingepackt habe. Es funzt auch sehr gut. Ich möchte nur noch die Icons mit-reinpacken. Am besten über eine Imagelist oder? Aber die Frage - für die es wahrscheinlich eine sehr einfache Antwort gibt - lautet:

Wie kriege ich statt dieser Zeile das Bild aus der Imagelist auf das Iconhandle?

Delphi-Quellcode:
  hMainIcon:= LoadImage (hInstance , name , IMAGE_ICON,16,16,LR_LOADFROMFILE);

isilive 11. Okt 2009 19:29

Re: WinAPI: Icon nach CreateWindowEx noch ändern
 
Ich habs gelöst! :coder: :cheers:
Der Weg führt über ein temporäres TIcon.

Icon aus Imagelist holen und zuweisen:

Delphi-Quellcode:
procedure TForm1.ChangeTrayIcon(a:integer);
var Icon1:ticon;
begin
  Icon1 := TIcon.Create;                                  //Icon erstellen
  imagelist1.GetIcon(a,Icon1);                            //Icon aus der Imagelist holen
  //hMainIcon := Icon1.Handle;                           //  auch möglich
  //NID.hIcon            := HMainIcon;                   //  auch möglich
  NID.hIcon              := Icon1.Handle;                //Icon zuweisen
  Shell_NotifyIcon(NIM_MODIFY, @NID);
  Icon1.Free;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:36 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz