Probleme mit dem Sysmenü Icon
-
Ich versuche im moment eine Anwendung mit einem eigenen Icon auszustatten, hierbei ahbe ich allerdings Probleme mit dem Systemmenü Icon.
Meine Ausgangsposition is Win7 x64, Visual Studio 2010 und das SDK 7.1, das Programm ist 64-Bit der Fehler tritt jedoch auch auf 32-Bit auf, ein anderer Windows7 Rechner hat den Fehler genauso gehabt.
Nun zum Problem. Ich habe das Icon erstellt und als Recource eingebunden, die exe hat auch das korrekte neue Icon bekommen. Nun habe ich in der WNDCLASSEX Struktur für icon und iconsm jeweils das Icon laden lassen. Das Icon in der Taskleiste stimmt (sowohl bei kleinen als auch bei großen Symbolen), das Icon im Systemmenü ist jedoch immernoch das standard application Icon. Da iconsm ja sowohl das Icon fürs systemmenü als auch für die Taskleiste (bei kleinen Symbolen) ist weiß ich das es richtig geladen wurde, es wird nur nicht angezeigt. Wenn ich jedoch statt meines Icons in iconsm ein standard Icon laden lasse, zB IDI_ERROR wird es sowohl in der Taskleiste als auch im Systemmenü geändert.
Meine Frage ist nun, was ist da los? Habe ich etwas übersehen? Gibt es für das Sysmenü spezielle Vorgaben für das Icon?
Eine weitere Frage die ich noch hätte, wenn man bei icon und iconsm NULL angibt soltle ja ein standard System Icon geladen werden, ist das (sofern vorhanden) immer das Icon in der exe mit der geringsten ID und wenn nciht vorhanden IDI_APPLICATION?
-
Zeig deine Eintragungen in WNDCLASS(EX) her! So oder so ähnlich sollte das aussehen, wenn das Icon über eine Resource bestimmt wird:
...
wndclass.hIcon = LoadIcon(hInstance,MAKEINTRESOURCE(IDI_ICON)),
...
-
WNDCLASSEX windowClass; windowClass.cbSize = sizeof(WNDCLASSEX); windowClass.style = CS_OWNDC | CS_HREDRAW | CS_VREDRAW; windowClass.lpfnWndProc = windowProc; windowClass.cbClsExtra = 0; windowClass.cbWndExtra = 0; windowClass.hInstance = _hInstance; windowClass.hIcon = LoadIcon(_hInstance, "icon.ico"); windowClass.hCursor = LoadCursor(NULL, IDC_ARROW); windowClass.hbrBackground = reinterpret_cast<HBRUSH>(GetStockObject(BLACK_BRUSH)); windowClass.lpszMenuName = NULL; windowClass.lpszClassName = _windowName.c_str(); windowClass.hIconSm = LoadIcon(_hInstance, "icon.ico");
Da MAKEINTRESOURCE die ID ja auch nur in den Namensstring umwandelt verwende ich den zzt direkt. Und wie gesagt das Taskleisten Icon das auch von iconsm kommt ist korrekt.
-
"icon.ico" wird auch eingebunden und ist im Resourcenskript (*.rc) zu finden?
-
Ja, sonst würde es an den anderen Stellen ja garnicht zu sehen sein.
EDIT:
Es läuft jetzt, es musste doch MAKEINTRESOURCE hin, dachte eig der wandelt den namen nur in den String um. An eienr Stelle war noch ein übergabefehler der HINSTANCE, das man mit dem Fehler trotzdem ein fast korrektes Fenster bekommen hat finde ich schon komisch.
-
Hättest dir einfach mal das Makro-Define angucken können. Du kannst ned einfach den Dateinamen verwenden:
http://stackoverflow.com/questions/3610565/why-does-makeintresource-work