HowTo? LoadImage()......?
-
Hallo,
ich beschäftige mich gerade schrittweise mit der WinAPI32 in C++. Das Ganze mache ich in Dev C++. Zwar legt mir die IDE hier den gesamten Grundaufbau für ein leeres Fenster vor, aber dann kommt's:
Ich möchte das kleine Icon oben links in dem Fensterbalken ändern. Is ja einfach -sollte man denken. Ja klar, wenn ma es weiß.Die IDE legt mir hier
wincl.hIcon = LoadIcon (NULL, MAKEINTRESOURCE(ID_ICON));
vor. In verschiedenen Foren - u.a. auch hier - und auf MSDN wird darauf hingewiesen, dass man lieber LoadImage() verwenden solle. Soweit ich verstanden habe, muss man für die Verwendung von LoadIcon() eine Resource erstellen. Dies habe ich in DEV C++ NICHT geschafft. Die Verwendung von LoadImage() führt derzeit immer zu einem Fehler.
WNDCLASSEX wincl; /* Data structure for the windowclass */ ..... /* Use default icon and mouse-pointer */ HICON hIcon = LoadImage(NULL, "NT7s.ico", IMAGE_ICON, 24, 24, LR_LOADFROMFILE); wincl.hIcon = hIcon; .....
Fehler: invalid conversion from 'void' to HICON'
Ich vermute mal, dass die Funktion ein Handle zurückgibt, wenn das Icon geladen wurde, wenn sie dias Icon nicht laden kann, gibt sie was anderes zurück- vermutlichh NULL, was dann zum Fehler führt. Die .ico-Datei liegt im selben Ordner wie die Projektdatei und die .cpp-Datei. Natürlich könnte ich casten, wie ich es schon so manches mal gesehen habe, bloß würde das Icon dann doch noch immer inicht geladen.
Wer hilft mir? Entweder mit LoadImage() oder mit einer Step-by_Step-Anleitung für die Erstellung und Einbindung einer Resource?
Jens
-
Relative Pfade sind tödlich.
Dein Current-Working-Directory ist eben nicht das Programmverzeichnis, oder sagen wir ist es oft nicht!Ansonsten GetLastError verwenden.
-
Hallo Martin Richter,
vielen Dank für die schnelle Antwort. Sie ist jedoch so ausführlich, dass ich leider nicht viel damit anfangen kann. Vielleicht sollte ich erwähnen, dass ich es auch schon mit dem vollständigen Pfad zur Ikon-Datei versucht habe..... mit dem selben Ergebnis.
Fehlermeldung der Dev C++ IDE:
In functio 'int WinMain(HINSTANCE__*,HINSTANCE__*,CHAR*, int)' invalid conversion from 'void' to 'HICON__*' [Build Error] [../Kapitel2/main.o] Error 1
Ansonsten GetLastError verwenden.
Auch dies ist so eine Brotkrümelhilfe, von der ich schon vielfach gelesen habe. Allerdings habe ich keine zusammenhängende Erklärung gefunden. Geht es etwas ausführlicher?
Was macht LoadImage() anders als LoadIcon()? Wird das Icon erst zur Ausführung geladen, oder ist es dann im Exe-file integriert? Fragen über Fragen...
Jens
-
HICON hIcon = (HICON) LoadImage(NULL, "NT7s.ico", IMAGE_ICON, 24, 24, LR_LOADFROMFILE);
-
Hallo Jochen Kalmbach,
ja, das hat funktioniert. Frage: Warum muss ich die Rückgabe casten? Ich nahm an - so auch die Erklärung bei MSDN - dass die Funktion ein Handle zurückliefert.
Jens
-
LoadImage kann verschiedene Dingeladen.. Icons, Bitmaps usw. deshalb muss man hier (leider) casten... es liefert nur ein "HANDLE" zurück und kein HICON oder HIMAGE, CURSOR.
Ist natürlich sehr unschön, aber so ist das echte Leben auch...Immerhin passt es ja dass Du HICON zusammen mit IMAGE:ICON verwendest...
Siehe auch die Doku:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms648045
-
Hallo Jochen,
das mit HICON hab ich irgendwo gelesen. Mit dem Cast kann ich es auch direkt machen.
Also liefert die Funktion zwar ein Handle, aber es ist vom Typ 'HANDLE' und nicht 'HICON'. Da MS die Verwendung von LoadImage anstelle von LoadIcon und LoadCursor empfiehlt, muss ich das Handle jedesmal von universell 'HANDLE' auf den gewünschten Typ Handle casten. Ok, dann kam meine Verwirrung bloß daher, dass ich es in einigen Beiträgen auch ohne Cast gesehen habe.....
Danke,
Jens