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 [NonVCL] Großes statt kleinem Programmicon in Titelleiste (https://www.delphipraxis.net/77259-%5Bnonvcl%5D-grosses-statt-kleinem-programmicon-titelleiste.html)

Daniel Schuhmann 16. Sep 2006 23:48


[NonVCL] Großes statt kleinem Programmicon in Titelleiste
 
Liste der Anhänge anzeigen (Anzahl: 1)
Servus!

Ich habe mal wieder ein kleines Problemchen :xmas:

Wenn man ein NonVCL-Programm anhand der Dialogvorlage aus dem bekannten Tutorial :) beginnt, sieht das Laden des Anwendungsicons meist so aus:

Delphi-Quellcode:
  WM_INITDIALOG:
  begin
    SendMessage(hDlg, WM_SETICON, ICON_BIG,
      Integer(LoadIcon(hInstance, MAKEINTRESOURCE(100))));
    SendMessage(hDlg, WM_SETICON, ICON_SMALL,
      Integer(LoadIcon(hInstance, MAKEINTRESOURCE(100))));
    // [...]
  end;
Das PSDK sagt über WM_SETICON folgendes aus:
Zitat:

WM_SETICON Message

An application sends the WM_SETICON message to associate a new large or small icon with a window. The system displays the large icon in the ALT+TAB dialog box, and the small icon in the window caption.
So weit so gut. Das Problem ist nun, dass in der Titelleiste des Programms das große (32x32) Icon angezeigt wird. Besonders bei Icons mit wenigen Farben führt das dazu, dass es so zusammengestaucht wird, dass man kaum etwas vom Icon erkennen kann.
Bei VCL-Programmen funktioniert es jedoch so wie gewünscht, also muss der Fehler in der Programmierung und nicht im PSDK liegen.
Zur Verdeutlichung des Problems hab ich einen kleinen Screenshot hochgeladen. Im Explorer wird das richtige Icon (16x16) genommen, in der Titelleiste ist stattdessen die gestauchte 32x32-Version.

Vielleicht hat jemand eine Idee?

turboPASCAL 17. Sep 2006 09:54

Re: [NonVCL] Großes statt kleinem Programmicon in Titelleist
 
Nun kommt es darauf an wie die Icons in der Resourcedatei vorliegen.

Und ich würd's dann so machen:

Delphi-Quellcode:
var
  AppIcon: HICON;

//...

  WM_INITDIALOG:
  begin
    Icon := LoadIcon(hInstance, MAKEINTRESOURCE(100));

    if SendMessage(hDlg, WM_SETICON, ICON_SMALL, Integer(AppIcon)) = 0 then
      SendMessage(hDlg, WM_SETICON, ICON_BIG, Integer(AppIcon));

    DestroyIcon(Icon);
    // [...]
  end;

Flocke 17. Sep 2006 10:00

Re: [NonVCL] Großes statt kleinem Programmicon in Titelleist
 
Der Befehl
Delphi-Quellcode:
LoadIcon(hInstance, MAKEINTRESOURCE(100))
lädt beides mal das 32x32-Icon aus deiner Ressource (die Standardauflösung).

Benutze für das kleine Icon die Funktion
Delphi-Quellcode:
LoadImage(hInstance, MAKEINTRESOURCE(100), IMAGE_ICON, 16, 16, 0)
um das 16x16-Icon zu laden. Alternativ die 16 noch durch GetSystemMetrics(SM_CXSMICON / SM_CYSMICON) ersetzen.

Daniel Schuhmann 17. Sep 2006 12:10

Re: [NonVCL] Großes statt kleinem Programmicon in Titelleist
 
Liste der Anhänge anzeigen (Anzahl: 1)
@Flocke: Wunderbar, funktioniert einwandfrei, vielen herzlichen Dank!


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:17 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