falsches Icon in Titelzeile

01/11/2007 - 10:53 von JoDomoWorx | Report spam
Es geht um eine Dialogbasierte MFC-Anwendung (unter Visual Studio 2005). Der
Wizard macht von sich aus bereits folgende Eintràge:

m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
[...]
SetIcon(m_hIcon, TRUE); // Großes Symbol verwenden
SetIcon(m_hIcon, FALSE); // Kleines Symbol verwenden

Dabei ist IDR_MAINFRAME über die Ressourcen mit <AppName>.ico verknüpft und
enthàlt MFC-Bildchen. Ich habe alle gelöscht und meine eigenen neu erstellt,
in 2, 16 und 256 Farben, mit 16, 32 und 48 Pixeln Kantenlànge, also 9 Stück.
Das funktioniert für das Dateisymbol der kompilierten Anwendung im Explorer,
groß wie klein, und für das große Symbol in der autogenerierten
About-Info-Box.

Das Problem: In der Titelzeile wird nicht mein 16-Pixel-Bild gezeigt,
sondern eins der größeren kleinskaliert, und sieht natürlich sch... aus.

Ich hab bereits einen Workaround: Wenn ich IDR_MAINFRAME kopiere, in der
Kopie (IDR_SMALL <-> Icon1.ico) alle 32- und 48-Pixel-Versionen lösche, ein
weiteres HICON-Objekt erstelle und dieses als kleines Symbol angebe, dann
erscheint das richtige kleine Bild in der Titelzeile und das richtige große
in der Info-Box. Aber dann ist die große Version des Dateisymbols im Explorer
eine großskalierte Version des kleinen Icons, was natürlich auch bescheiden
aussieht! Der Code:

HICON m_hIcon[2];
[...]
m_hIcon[0] = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
m_hIcon[1] = AfxGetApp()->LoadIcon(IDR_SMALL);
[...]
SetIcon(m_hIcon[0], TRUE); // Großes Symbol verwenden
SetIcon(m_hIcon[1], FALSE); // Kleines Symbol verwenden

Es ist übrigens unabhàngig davon, in welcher Reihenfolge die beiden Icons in
m_hIcon stehen.

Eine Idee: Im "frisch" erzeugten IDR_MAINFRAME gibt es die MFC-Bildchen auch
mit 16-bit Farbtiefe. Nach dem Löschen bekomme ich nie mehr die Möglichkeit,
diese Farbtiefe einzustellen, warum auch immer. Evtl. ist das der Grund,
warum aus meinem IDR_MAINFRAME die 16-Pixel-Versionen für die Titelzeile
ignoriert werden? Schließlich làuft mein Windows-Desktop mit 16-bit
Farbtiefe. Aber wie soll man das dann richtig machen?
 

Lesen sie die antworten

#1 Martin Richter [MVP]
01/11/2007 - 12:30 | Warnen spam
Hallo JoDomoWorx!

Besser ist die Gruppe microsoft.public.de.vc wenn es um nativen C++ Code
geht.

Das Problem: In der Titelzeile wird nicht mein 16-Pixel-Bild gezeigt,
sondern eins der größeren kleinskaliert, und sieht natürlich sch... aus.



[snip]


HICON m_hIcon[2];
[...]
m_hIcon[0] = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
m_hIcon[1] = AfxGetApp()->LoadIcon(IDR_SMALL);
[...]
SetIcon(m_hIcon[0], TRUE); // Großes Symbol verwenden
SetIcon(m_hIcon[1], FALSE); // Kleines Symbol verwenden




Dein Problem liegt an der Verwendung von LoadIcon!
LoadIcon làdt immer das Standard-Format 32x32.
Lies die Doku!

Bau Dir eine eigene Routine mit LoadImage.

HICON LoadIconEx(PCTSTR pszIconName, bool bLargeIcon)
{
HINSTANCE hInstance ::AfxFindResourceHandle(pszIconName,RT_GROUP_ICON);
return (HICON)::LoadImage(hInstance,pszIconName,IMAGE_ICON,
GetSystemMetrics(bLargeIcon ? SM_CXICON : SM_CXSMICON),
GetSystemMetrics(bLargeIcon ? SM_CYICON : SM_CYSMICON),
0);
}


Martin Richter [MVP] WWJD http://blog.m-ri.de
"A well-written program is its own heaven; a poorly written
program is its own hell!" The Tao of Programming
FAQ: http://www.mpdvc.de Samples: http://www.codeproject.com

Ähnliche fragen