Bitamp einlesen und ausgeben.



  • Hier fehlt ein MAKEINTRESOURCE:

    hbmpPicture = LoadBitmap(hInst,BitmapSrc);
    

    ➡

    hbmpPicture = LoadBitmap(hInst,MAKEINTRESOURCE(BitmapSrc));
    

    PS: Du musst geladene Bitmaps auch wieder löschen bzw einen Speicherkontext wieder entfernen (siehe Beispielcode von mit, oben).



  • H, Danke aber ich möchte gerne wissen was an meinem Script falsch ist langsam werd ich wütend 😡 😡 😡 😡 😡 😡 😡 😡 😡 😡



  • Sry, hab gar nich geshen dass es noch ne 2. Seite hat Sry.



  • Funktioniert immer noch nicht ich bin echt am verzweifeln !!!!!!!!!!!!!!!!!!!!!!!!

    int LoadBitmapEx(char *BitmapSrc,int x,int y,HINSTANCE hInst,HWND hWnd)
    {
    	HBITMAP hbmpPicture;
    	HDC dcScreen;
    	HDC dcPicture;
    	BITMAP bmInfo;
    
    	hbmpPicture = LoadBitmap(hInst,MAKEINTRESOURCE(BitmapSrc));
    
    	GetObject(hbmpPicture,sizeof(BITMAP),&bmInfo);
    
    	dcScreen = GetDC(hWnd);
        dcPicture = CreateCompatibleDC(dcScreen);
    
    	SelectObject(dcPicture,hbmpPicture);
    
    	BitBlt(dcScreen,x,y,171,171,dcPicture,0,0,SRCCOPY);
    
    	DeleteDC(dcPicture);
    	DeleteObject(hbmpPicture);
    	ReleaseDC(hWnd,dcScreen);
    
    	return(0);
    
    }
    


  • Wie/Wo rufst du denn die Funktion auf ?
    Zeig mal den Codeabschnitt...

    PS: Das GetObject ist hier natürlich überflüssig... :p



  • Also die Funktion ist kacke. In WM_PAINT würdest du jedes mal das Bitmap neuladen und woanders zeichnet man nicht.



  • //--------------------------------------------------------------------------------------------------------
    
    	RegisterClassEx(&windowinfo);
    
    	HWND mainWnd = CreateWindowEx(NULL,"Fish","Passoword Fish",WS_OVERLAPPEDWINDOW | WS_VISIBLE,0,0,400,400,NULL,NULL,hinst,NULL);
    	HWND button     = CreateWindowEx(NULL,"Button","Ping", WS_CHILD | BS_PUSHBUTTON,10,10,150,50,mainWnd,NULL,hinst,NULL);
    
    	LoadBitmapEx("c:\\windows.bmp",10,10,hinst,mainWnd);
    
    	while(GetMessage(&msg,NULL,0,0))
    	{
    		TranslateMessage(&msg);
    		DispatchMessage(&msg);
    	}
    
    	return(0);
    


  • BlackScreen kann es sein das du ein 14 jähriges CS spielendes Kiddy bist? 😡



  • Wiso nein wie kommst du drauf ich nerve mich nur weil ich an diesem mit schon den ganzen tag dransitze und nie funktioniert es 😡



  • loadbitmapex schrieb:

    Also die Funktion ist kacke. In WM_PAINT würdest du jedes mal das Bitmap neuladen und woanders zeichnet man nicht.

    Jo da hast Du Recht:
    Man könnte der Funktion ja auch ein (statisches) Handle zu einer Bitmap übergeben, die unter WM_CREATE geladen und unter WM_DESTROY gelöscht wird.

    @BlackScreen:
    Man unterscheidet zwischen Bitmaps die als Resource in einem Modul abgelegt sind und solche die als Dateien auf einem Datenträger gespeichert sind.
    Resourcen-Bitmap werden über die Funktion LoadBitmap unter Angabe des korrekten Instanz-Handles und der ID der Bitmap. Bitmap-Dateien werden über die Funktion LoadImage geladen (man kann damit allerdings auch Resourcen-Bitmaps laden).

    Weiterhin werden Zeichenaktionen immer unter der Nachricht WM_PAINT in der entsprechenden WndProc deines Zielfensters abgehandelt. Dazu gehören selbstverstänldich auch 'Blittings'.

    Ich denke es wäre sinnvoll, wenn Du Dir (nochmal?) ein Tutorial bzgl. WinAPI anguckst. Hier ein Beispiel: http://www.win-api.de/ . Weitere findest Du zu Hauf bei Google.



  • Schon, aber ich kann die Funktion LoadImage() nicht so gerbauche wie du es in deinem Beispiel gezeigt hast, denn bein mit bekomm ich ein Handle als Rückgabe und kein HBITMAP, wie kann ich den aus dem Handle ein HBITMAP machen einfach draulos casten 😮



  • BlackScreen schrieb:

    Schon, aber ich kann die Funktion LoadImage() nicht so gerbauche wie du es in deinem Beispiel gezeigt hast, denn bein mit bekomm ich ein Handle als Rückgabe und kein HBITMAP, wie kann ich den aus dem Handle ein HBITMAP machen einfach draulos casten 😮

    Jo, einfach casten. Du bekommst ein Handle zurück da man mit der Funktion eigentlich auch noch andere Image-Typen laden kann.

    EDIT: schneller :p ...



  • BlackScreen schrieb:

    Schon, aber ich kann die Funktion LoadImage() nicht so gerbauche wie du es in deinem Beispiel gezeigt hast, denn bein mit bekomm ich ein Handle als Rückgabe und kein HBITMAP, wie kann ich den aus dem Handle ein HBITMAP machen einfach draulos casten 😮

    Jap.



  • das glaubt dir am samstag keiner



  • Juhu es Funktionier.

    Aber ich habe leider noch nicht so genau den unterschied zwichen

    LoadBitmap

    und

    LoadImage

    verstanden könnte dass jemand für dummier erklären.

    Sry dass ich vorhin mal ein bisschen wütende wurde(Ihr wisst sicher wie dass ist wenn etwas einfach nich klappten will) 😉



  • Siehe Funktionsbeschreibung in der MSDN:
    ➡ LoadImage ➡ "Loads an icon, cursor, animated cursor, or bitmap."
    ➡ LoadBitmap ➡ "The LoadBitmap function loads the specified bitmap resource from a module's executable file. [...]"



  • Hi, ich bin noch nicht so fit in English, bin erst in der 8. Klasse(In der Schweitz
    sind dass 2 Jahre English) 😉

    Könntest du das vieleicht krutz und Simpel auf Deutsch erklären.

    PS: Habe noch meinen Quelltext auskommentiert. Stimmt das so ?

    int LoadBitmapEx(char *BitmapSrc,int x,int y,HINSTANCE hInst,HWND hWnd)
    {
    	HBITMAP hbmpPicture;  //HANDLE auf ein Bitmap
    	HDC dcScreen;             //Device Context dcScreen
    	HDC dcPicture;             //Decice Context dcPicture        
    
    	hbmpPicture = (HBITMAP)LoadImage(NULL, BitmapSrc, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_DEFAULTSIZE | LR_DEFAULTCOLOR); 
    
        dcScreen = GetDC(hWnd);                                       //Device Context vom Fenster holen :)
        dcPicture = CreateCompatibleDC(dcScreen);             //dcPicture mit den Selben Daten vom DeviceContext vom Desktop füllen.
    
        SelectObject(dcPicture,hbmpPicture);                        //Zum Device Context dcPicture Objekt HBITMAP hizufügen
    
    	BitBlt(dcScreen,x,y,171,171,dcPicture,0,0,SRCCOPY);   //die Bits von dcPicture nach dcScreen Hinzufügen.
    
    	DeleteDC(dcPicture);                                                 //Devide Context dc Picture löschen
    	DeleteObject(hbmpPicture);                                        //Object hbmpPictute löschen.
    	ReleaseDC(hWnd,dcScreen);                                      //DC auf Fenster wieder Freigeben.
    
    	return(0);
    
    }
    


  • BlackScreen schrieb:

    Hi, ich bin noch nicht so fit in English, bin erst in der 8. Klasse(In der Schweitz
    sind dass 2 Jahre English) 😉

    Könntest du das vieleicht krutz und Simpel auf Deutsch erklären.

    Also zum Programmieren ist Englisch eigentlich Handwerkszeug. Naja also das heißt auf jeden Fall:
    ➡ LoadImage -> "Loads an icon, cursor, animated cursor, or bitmap."
    Die Funktion lädt ein Icon, einen Cursor, einen animierten Cursor oder eine Bitmap.
    ➡ LoadBitmap -> "The LoadBitmap function loads the specified bitmap resource from a module's executable file.
    Die Funktion lädt eine Bitmap-Resource aus einer ausführbaren Datei (*.exe).

    BlackScreen schrieb:

    PS: Habe noch meinen Quelltext auskommentiert. Stimmt das so ?

    Nein, noch nicht ganz 😃 .
    Du musst erst die alte Bitmap (Return-Wert casten und in HBITMAP-Variable sichern!), die mit dem Aufruf von SelectObject sozusagen rausgeworfen wird, wieder einsetzen. Danach musst Du die geladene Bitmap (hbmpPicture) löschen und deinen Speicherkontext (dcPicture) entfernen.

    PS: Du hast Deinen Code kommentiert; hättest Du ihn (vollständig) auskommentiert, würde jetzt komplett in Kommentaren (//) stehen 😉 .



  • Du musst erst die alte Bitmap (Return-Wert casten und in HBITMAP-Variable sichern!), die mit dem Aufruf von SelectObject sozusagen rausgeworfen wird, wieder einsetzen. Danach musst Du die geladene Bitmap (hbmpPicture) löschen und deinen Speicherkontext (dcPicture) entfernen.

    Das versthe ich noch nicht ganz^^.

    An welchen stellen meines Quelltextes Stimmt mein Kommentar noch nicht ??



  • BlackScreen schrieb:

    An welchen stellen meines Quelltextes Stimmt mein Kommentar noch nicht ??

    Ich hab das nicht auf deine Kommentare bezogen, sondern auf deinen Quellcode direkt. Der ist hier falsch:

    DeleteDC(dcPicture); // Devide Context dc Picture löschen
        DeleteObject(hbmpPicture); // Object hbmpPictute löschen.
        ReleaseDC(hWnd,dcScreen); // DC auf Fenster wieder Freigeben.
    

    So muss es aussehen:

    // Header: <Windows.h> und <ShlWApi.h>
    // Zusätzliche Library: ShlWApi.lib
    bool LoadBitmapEx(PTCHAR pszBitmapSrc,int x,int y,HWND hWnd)
    {
        if(pszBitmapSrc== NULL || !PathFileExists(pszBitmapSrc))
            return (false);
        HBITMAP hbmpPicture;  // HANDLE auf ein Bitmap
        HDC dcScreen;         // Device Context dcScreen
        HDC dcPicture;        // Decice Context dcPicture        
    
        hbmpPicture = (HBITMAP)LoadImage(NULL, pszBitmapSrc, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_DEFAULTSIZE | LR_DEFAULTCOLOR);
        if(hbmpPicture == NULL) // ungültige Datei
           return (false);
    
        dcScreen = GetDC(hWnd); // Device Context vom Fenster holen
        dcPicture = CreateCompatibleDC(dcScreen); // dcPicture mit den Selben Daten vom DeviceContext vom Desktop füllen.
    
        HBITMAP hbmpPrev = (HBITMAP)SelectObject(dcPicture,hbmpPicture); // Zum Device Context dcPicture Objekt HBITMAP hizufügen
    
        BitBlt(dcScreen,x,y,171,171,dcPicture,0,0,SRCCOPY); // die Bits von dcPicture nach dcScreen Hinzufügen.
    
        DeleteObject(SelectObject(dcPicture, hbmpPrev)); // Object hbmpPictute löschen.
        DeleteDC(dcPicture); // Devide Context dc Picture löschen
        ReleaseDC(hWnd,dcScreen); // DC auf Fenster wieder Freigeben.
        return (true);
    }
    

    Wie du siehst hab ich die Funktion noch etwas optimiert 😉 .
    Sie gibt true zurück wennd er Aufruf erfolgreich war, andernfalls false.


Anmelden zum Antworten