… oder sollte man sagen: Nicht so wie erwartet.
In einer der Micosoft Newsgroup fand sich eine Anfrage, die sich um folgenden Code drehte:
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
Das Problem des Posters war, dass er sich Mühe mit dem Layout eine kleines Icons gegeben hat, aber leider immer nur ein verkleinertes 32×32 Icon verwendet wurde.
Das Problem liegt an der Verwendung von LoadIcon! LoadIcon lädt immer das Standard-Format 32×32. Bzw. in dem Format, dass durch das System als Standard-Icon-Größe vorgegeben wird.
Um es richtig zu machen, muss man das Icon wirklich in der gewünschten Größe laden. Dazu verwendet man die Funktion LoadImage. Eine kleine Helper Routine LoadIconEx kann dann wie folgt aussehen:
HICON LoadIconEx(PCTSTR pszIconName, bool bLargeIcon)
{
HINSTANCE hInstance = ::AfxFindResourceHandle(pszIconName,RT_GROUP_ICON);
return reinterpret_cast<HICON>(::LoadImage(
hInstance,
pszIconName,
IMAGE_ICON,
GetSystemMetrics(bLargeIcon ? SM_CXICON : SM_CXSMICON),
GetSystemMetrics(bLargeIcon ? SM_CYICON : SM_CYSMICON),
0));
}
. Man muss explizit AfxEndThread gar nicht aufrufen. Man sollte einfach alle Threadfunktionen einfach durch return verlassen. Der Thread wird dann entsprechend der Funktion, die man beim Start gewählt hat auch terminiert. Dann bleibt – auch bei einer Änderung der Umgebung , ob nun mit oder ohne MFC.