Von HANDLE zu long casting nötig, warum? [C++ / WinAPI]
Hallöchen,
derzeit versuche ich mich etwas in WinAPI, konkret zur Zeit in Images auf Button platzieren. Zum Einladen eines Images benutze ich folgende Funktion:
Dabei stellt sich mir gleich auch schon die erste Frage: Was ist das denn für ein Datentyp, welcher zurückgegeben wird? Müsste ja normalerweise, wie bei solchen Sachen immer, ein Handle zum erstellen Objekt, also zum Image sein. Oben steht nur HANDLE, also ist das der Typ, ja? (Komisch nur, sonst ist der immer recht speziefisch wie etwa HDC für Handle für DC oder HBITMAP für Handle für Bitmap, warum diesmal einfach nur HANDLE?)
Wie dem auch sei, der Code sieht dann so aus:
Das klappt auch soweit. Das Handle "himage" wird erstellt und verweist auf das eingeladene Image.
Wenn ich nun dieses Image einem button zuweisen will, erfolgt aber schon das nächste Problem:
Ich will eine Message an das Button-Window senden in der dem Button das Image zugewiesen wird. Per:
Mein Code sieht dann so aus:
Alles soweit klar, NUR, warum muss ich das Handle himage (letzter Parameter) vorher in den long typ conventieren? Normalerweise müsste ich doch einfach das Handle angeben können, welches erwartet wird - also das Handle zum Image. Nur "himage" geht aber nicht. Ebenso wenn ich "(HANDLE)himage" schreibe um himage in den Typ HANDLE zu wandeln, welcher Typ es aber eigentlich schon ist (beim Einladen des Images oben ja so gewählt).
Und in der Beschreibung von BM_SETIMAGE() steht ja auch, dass dort der Typ "HANDLE" erwartet wird sowie das handle zum Image. (lParam = (LPARAM) (HANDLE) hImage; // handle of the image)
Also wieso ist eine Convertierung zu long nötig damit es geht? Ich bin da nur durch Zufall drauf gestoßen weil mir der Compiler die Fehlermeldung ausgabe, dass ich versuchte, von void* zu long int zu convertieren. Also hab ich einfach mal in long gecastet und siehe da, es geht. Die Frage ist nur, wieso ist der Typ hier Long und warum wird kein (HANDLE) oder nur das handle ohne casting angenommen? Immerhin wird ja genau der Typ (HANDLE) gefordert welcher oben so erstellt wurde. Dennoch will er plötzlich einen long-handle haben. (Hängt das vielleicht damit zusammen dass der 2te Parameter eine Message ein Long-Parameter ist und deshalb in LONG-Convertiert werden muss? Ist nur so ein Gedanken der mir gerade durch den Kopf schießt).
Wäre denn wenn sich ein kundiger WinAPI Programmierer meiner annehmen könnte und mir erklären würde warum das nun long sein muss und kein normales handle ohne casting akzeptiert wird.