Ergebnis 1 bis 3 von 3

Thema: Von HANDLE zu long casting nötig, warum? [C++ / WinAPI]

Baum-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1

    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:
    Code:
    HANDLE LoadImage(
    
        HINSTANCE hinst, 	// handle of the instance that contains the image
        LPCTSTR lpszName,	// name or identifier of image
        UINT uType,	// type of image
        int cxDesired,	// desired width
        int cyDesired,	// desired height
        UINT fuLoad	// load flags
       );
    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:
    Code:
    HANDLE himage = LoadImage(0, "test.bmp", IMAGE_BITMAP, 40, 40, LR_LOADFROMFILE);
    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:
    Code:
    BM_SETIMAGE  
    wParam = (WPARAM) fImageType;       // image-type flag 
    lParam = (LPARAM) (HANDLE) hImage;  // handle of the image
    Mein Code sieht dann so aus:
    Code:
    SendMessage(hbutton_button_save, BM_SETIMAGE, IMAGE_BITMAP, (long)himage);
    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.

    mfg.

    Sunny

    Geändert von Ineluki (09.12.2004 um 01:49 Uhr)

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •