bilder in anwendungsbereich



  • wie kann ich ganz normale bilder in den anwenderbereich eines windowsprogrammes einfügen? Alternativ dazu vielleicht noch mit der pixelgröße.

    Freundliche Grüße
    Opaliene



  • Also wenn ich dich richig verstehe willst du ein Bild (*.bmp) anstatt einer Füllfarbe in den Client-Bereich deines Fesnter bringen, richtig ?

    ...das geht so:

    Du kannst die Bitmap unter WM_PAINT ins Client blitten:

    (Ich gehe davon aus das du die Bitmap aus einer Datei holst die unter dem Pfad C:\\demo.bmp zu finden, wenn nicht; über ne Resource musst du die LoadImage Funktion durch folgende Funktion ersetzen:

    LoadBitmap(hInst, MAKEINTRESOURCE(BITMAP_RESOURCE_ID));
    // hInst ist die Programm-Instanz, entweder als globale Variable
    // oder über GetModuleHandle(NULL) ermitteln.
    

    )

    case WM_PAINT:
        PAINTSTRUCT ps;
        HDC         hdcBmpMem;
        HBITMAP     hbmpOldBits,
                    hbmpBkgnd;
        RECT        rcClient;
        BITMAP      bmInfo
    
        BeginPaint(hWnd, &ps);
        // Speicherkontext für die Bitmap erstellen:
        hdcBmpMem = CreateCompatibleDC(ps.hdc);
        // Bitmap ins Programm laden:
        hbmpBkgnd = LoadImage(NULL, TEXT("C:\\demo.bmp"), // Hier liegt die Bitmap
                              IMAGE_BITMAP, 0, 0,
                              LR_LOADSIZE | LR_DEFAULTCOLOR | LR_LOADFROMFILE);
        // Bitmap Infos ermitteln:
        GetObject(hbmpBkgnd, sizeof(BITMAP), &bmInfo);
        // Bitmap in den Speicherkontext einsetzen:
        hbmpOldBits = (HBITMAP)SelectObject(hdcBmpMem, hbmpBkgnD);
        // Client Area ermitteln:
        GetClientRect(hWnd, &rcClient);
        // und auf den Bildschirm blitten bzw strechten:
        StrechtBlt(ps.hdc, 0, 0, rcClient.right, rcClient.bottom, hdcBmpMem, 0, 0,
                   bmInfo.bmWidth, bmInfo.bmHeight, SRCCOPY);
        // Hier weitere Zeichenaktionen möglich
        //
        // ...
        //
        // GDI-Clean Up:
        DeleteObject(SelectObject(hdcBmpMem, hbmpOldBits);
        DeleteDC(hdcBmpMem);
        EndPaint(hWnd, &ps);
        break;
    

    Hoffe ich konnte helfen... 😉

    PS: Kann sein dasn Tippfehler drin ist, habs nit getestet! 🤡

    MfG CodeFinder



  • (Ich gehe davon aus das du die Bitmap aus einer Datei holst die unter dem Pfad C:\\demo.bmp zu finden, wenn nicht; über ne Resource musst du die LoadImage Funktion durch folgende Funktion ersetzen:

    C/C++ Code:
    LoadBitmap(hInst, MAKEINTRESOURCE(BITMAP_RESOURCE_ID));
    // hInst ist die Programm-Instanz, entweder als globale Variable
    // oder über GetModuleHandle(NULL) ermitteln.
    C/C++ Code:
    LoadBitmap(hInst, MAKEINTRESOURCE(BITMAP_RESOURCE_ID));
    // hInst ist die Programm-Instanz, entweder als globale Variable
    // oder über GetModuleHandle(NULL) ermitteln.

    )

    Dies verstehe ich nicht so ganz, was du damit meinst..



  • Hi erstmal 😉

    Also du musst die Bildinformationen ja irgend woher bekommen...

    Da bieten sich 2 Möglichkeiten an:

    1. du bindest eine externe Bitmapdatei als Resource ein,

    oder

    2. du lädst die Bitmapdatei während der Programmlaufzeit, dann muss diese sich jedoch immer im angegebenen Pfad befinden.

    mit

    LoadBitmap(g_hInst, MAKEINTRESOURCE(ID));
    

    lädst du die Datei aus deiner Executable (dem sg. Modul) heraus. Diese bindest du unter Visual C++ so ein:
    Einfügen ->
    Resource ->
    Bitmap in der Liste auswählen ->
    Importieren ->
    Bitmapdatei auswählen ->
    Script.rc und resource.h abspeichern (imProjektverzeichnis) ->
    beide Dateiem dem Projekt hinzufügen ->
    resource.h includieren und fertig!!! 😉
    (jetzt kannst du LoadBitmap() wie unten gezeigt anwenden)

    und mit

    LoadImage(NULL, TEXT("C:\\demo.bmp"), IMAGE_BITMAP, 0, 0,
              LR_DEFAULTSIZE | LR_DEFAULTCOLOR | LR_LOADFROMFILE);
    

    lädst du während das Programm läuft eine Bitmap die unter dem Pfad C:\demo.bmp abgespeichert ist (welche dann angezeigt wird)...

    PS: Wenn es diese Bitmap nicht gibt, der Pfad also bspw. nicht stimmt, dürfte das Fenster(bzw. der Anwendungbereich) vollständig schwarz gefärbt werden.
    Um das zu verhindern, kannst du den Return-Wert von LoadBitmap() bzw LoadImage() überprüfen, zB. so:

    HBITMAP hbmpBkgnd;
    if((hbmpBkgnd = LoadBitmap(g_hInst, MAKEINTRESOURCE(ID))) == NULL)
    {
        // Fehler!
    }
    else
    {
        // alles ok, hbmpBkgnd ist jetzt ein gültiger Handle zu deiner Bitmap
    }
    

    falls weitere Fragen da sind, frag mich ruhig 😉 🙂

    MfG CodeFinder



  • so wie ich das sehe hast du gesagt entweder so oder so, aber du kombinierst es ja..

    kann ich es auf einfachem wege wie mit einem icon machen oder muss ich einfach per resource ein handle zur datei erstellen?

    und der code zur laufzeit hat hier einen fehler:

    hbmpBkgnd = LoadImage(NULL, TEXT("x.bmp"), // Hier liegt die Bitmap
    IMAGE_BITMAP, 0, 0,
    LR_DEFAULTSIZE | LR_DEFAULTCOLOR | LR_LOADFROMFILE);

    invalid conversation von void* zu HBITMAP__*

    heißt übrigens defaultsize soviel ich weiß..

    sry wenn ich nerve 🙄



  • also erstmal: du nervst NICHT!! 😉

    1]
    das ist richtig: ENTWEDER als Resource ODER als externe Datei dynamisch laden
    🙂

    2]

    heißt übrigens defaultsize soviel ich weiß..

    bezüglich des ersten Beispiels hast du Recht, hab mich vertippt, (bei den weitere Beispielen ist es dann richtig wie man sieht)...

    3]

    invalid conversation von void* zu HBITMAP__*

    also hab nur n bissl was vergessen:

    Der Ergebnistyp der Funktion LoadImage() ist HANDLE, HANDLE ist als void* definiert, also ein typenloser Zeiger, das ist bei HBITMAP auch der Fall, der Compiler wünscht hier nur ne expliziete Typenumwandlung also so (sry das ichs vergessen hab 🙄 ):

    (nochmal der ganze Code für WM_PAINT)

    case WM_PAINT:
        PAINTSTRUCT ps;
        HDC         hdcBmpMem;
        HBITMAP     hbmpOldBits,
                    hbmpBkgnd;
        RECT        rcClient;
        BITMAP      bmInfo
    
        BeginPaint(hWnd, &ps);
        // Speicherkontext für die Bitmap erstellen:
        hdcBmpMem = CreateCompatibleDC(ps.hdc);
        // Bitmap ins Programm laden:
        hbmpBkgnd = (HBITMAP)LoadImage(NULL, TEXT("C:\\demo.bmp"), // Hier liegt die Bitmap
                              IMAGE_BITMAP, 0, 0,
                              LR_LOADSIZE | LR_DEFAULTCOLOR | LR_LOADFROMFILE);
        // Bitmap Infos ermitteln:
        GetObject(hbmpBkgnd, sizeof(BITMAP), &bmInfo);
        // Bitmap in den Speicherkontext einsetzen:
        hbmpOldBits = (HBITMAP)SelectObject(hdcBmpMem, hbmpBkgnD);
        // Client Area ermitteln:
        GetClientRect(hWnd, &rcClient);
        // und auf den Bildschirm blitten bzw strechten:
        StrechtBlt(ps.hdc, 0, 0, rcClient.right, rcClient.bottom, hdcBmpMem, 0, 0,
                   bmInfo.bmWidth, bmInfo.bmHeight, SRCCOPY);
        // Hier weitere Zeichenaktionen möglich
        //
        // ...
        //
        // GDI-Clean Up:
        DeleteObject(SelectObject(hdcBmpMem, hbmpOldBits);
        DeleteDC(hdcBmpMem);
        EndPaint(hWnd, &ps);
        break;
    

    Welchen Compiler benutzt du eigentlich ?

    Ach und...: Weißt du was ne HINSTANCE ist, hab vergessen das zu erklähren ? 🤡

    MfG CodeFinder



  • soviel ich weiß ein handle zum fenster oder?



  • ne nit ganz, jedes Programm(!) also nicht Fenster bekommt einen ID-Handle, das is die HINSTANCE also:

    Handle to an Instance
    Handle zu einer Instanz

    Wenn du eine Resource laden wills muss die entsprechende Funktion ja die Daten aus irgend einem Modul (=EXE oder DLL) herbekommen und identifiziert wird diese Quelle eben mit der HINSTANCE

    MfG CodeFinder


Anmelden zum Antworten