Bitmap aus Ressource in die Konsole



  • Hallo,

    Ich möchte ein Bild aus einer Ressource-Datei in das Konsolenfenster laden.

    Hier erstmal der Code, wie es ohne Ressourcen geht:

    int LoadBmp2Console(char *szBitmap, int PosX, int PosY)
    {
        HBITMAP hBitmap = (HBITMAP)LoadImage(NULL,szBitmap,
        IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
        if (!hBitmap) return 1;
    
        BITMAP bmp;
        GetObject(hBitmap,sizeof(bmp),&bmp);
    
        HWND hwnd = FindWindow("ConsoleWindowClass",NULL);
        if (!hwnd) return 2;
    
        HDC hDC = GetDC(hwnd);
        if (!hDC) return 3;
    
        HDC hBitmapDC = CreateCompatibleDC(hDC);
        if (!hBitmapDC) return 4;
    
        SelectObject(hBitmapDC,hBitmap);
    
        BitBlt(hDC,PosX,PosY,381,128,hBitmapDC,0,0,SRCCOPY);
    
        DeleteObject(hBitmap);
        ReleaseDC(hwnd,hBitmapDC);
        ReleaseDC(hwnd,hDC);
        return 0;
    }
    

    Aufruf:

    LoadBmp2Console("devil.bmp",270,10);
    

    Jetzt will ich aber wie gesagt meine Bitmap aus einer Ressource laden und dann im Konsolefenster anzeigen lassen.
    Aber wie?

    Ich hab schon vieles versucht mit LoadFromResourceName(), LoadBitmap(), etc.

    Wär nett, wenn mir einer den Code oben so verändern könnte, dass es geht.
    Nehmen wir einfach an der Name meiner Ressource heisst RES_LAKE.

    Danke!



  • Du musst die Zeile:

    HBITMAP hBitmap = (HBITMAP)LoadImage(NULL,szBitmap, 
        IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
    

    so ändern, dass das Bild nicht aus einer Datei geladen wird.
    Ungefähr so:

    HBITMAP hBitmap = (HBITMAP)LoadImage(GetModuleHandle( NULL ),MAKEINTRESOURCE(RES_LAKE), IMAGE_BITMAP,0,0,0);
    


  • mal ne frage...

    kann man irgendwie auch jpg files einbauen ? und ? was genau sind ressourcen ?

    Mfg Baltur



  • Hallo,

    WinAPI: .rc,.res

    MFG winexec*



  • @Airdamn: Danke schonmal!

    Wie müsste denn dann der Aufruf und die Parameter lauten?
    Denn irgendwie krieg ich's immernoch nicht hin.

    Ich kann es ohne Probleme komplilieren, aber es ist kein Bild zu sehen 😕

    @winexec*: Das ist mir schon klar, ich hab ja auch schon vieles versucht.
    Die .rc Datei hab ich längst..

    Falls du damit meinst, dass es ins WinAPI Forum gehört - bitte verschieben



  • Achso sry *g*
    Das bezog sich auf das Posting von Baltur



  • Hallo,

    Bitmaps sind AFAIK in der Console nicht darstellbar. Dazu brauchst du schon den Grafikmodus oder ein Fenster.

    Für den Grafikmodus findest du hier und in der Assembler-FAQ Beiträge.

    MFG winexec*



  • Hm? Ich hatte doch schon längst nen Bitmap in meiner Konsole dargestellt!

    Das ist nicht das Problem..

    Ich krieg es aber nicht hin es aus einer Ressource zu laden und darzustellen.



  • Hallo,

    Nicht ganz mitbekommen:

    Guck dir einmal das an:

    http://www.codeproject.com/bitmap/cximage.asp

    MFG winexec*



  • Sind gute Tipps, aber die verwirren mich nur noch mehr.

    Was ich wollte ist das, was Airdamn gemacht hat.

    Also einfach nur meinen im ersten Beitrag geposteten Code so verändern, dass es geht.

    Scheint auch zu funktionieren, aber vielleicht mach ich was im Aufruf falsch bzw geb ich die falschen Parameter an..

    Also wär nett, wenn mir einer die Funktion LoadBmp2Console() so verändern könnte,
    dass es geht und mir dann noch sagt, wie ich es richtig aufrufe.

    Wenn Airdamn's Beispiel stimmte, brauch ich nur noch wissen welchen Parameter ich durch char *szBitmap ersetzen muss und wie dann der Funktionsaufruf aussieht.



  • hast Du denn, wie ich geschrieben hab, die Zeile mit der anderen ersetzt?
    Eigentlich solltest Du die 1:1 übernehmen können, wenn Deine Bitmap-Ressource RES_LAKE heißt. Kannst auch debuggen und gucken welchen Wert hBitmap bekommt nach dem laden...

    EDIT: Ach ja, jpgs sollten auch gehen...ich glaub ich der einer FAQ wird ein JPG in ein HBITMAP geladen mithilfe von IPicture...



  • Airdamn schrieb:

    hast Du denn, wie ich geschrieben hab, die Zeile mit der anderen ersetzt?

    Jop, ausser dass ich RES_LAKE in Anführungszeichen setzen musste.
    Hat auch keine Probleme dabei gegeben, aber wie rufe ich die Funktion jetzt auf?

    Hab es so versucht:

    LoadBmp2Console("RES_LAKE",270,10);
    

    Lässt sich ohne Fehlermeldungen komplilieren, aber es ist kein Bild zu sehen 😕

    resource.rc

    RES_LAKE    BITMAP  "devil.bmp"
    

    [die füg ich natürlich dem projekt hinzu und eine devil.bmp existiert auch im selben verzeichnis]

    main.cpp

    #include <windows.h>
    #include <iostream>
    using namespace std;
    
    int LoadBmp2Console(char *,int,int);
    
    int main()
    {
        LoadBmp2Console("RES_LAKE",270,10);
        getchar();
    }
    
    int LoadBmp2Console(char *szBitmap, int PosX, int PosY)
    {
        HBITMAP hBitmap = (HBITMAP)LoadImage(GetModuleHandle( NULL ),MAKEINTRESOURCE("RES_LAKE"), IMAGE_BITMAP,0,0,0);
        if (!hBitmap) return 1;
    
        BITMAP bmp;
        GetObject(hBitmap,sizeof(bmp),&bmp);
    
        HWND hwnd = FindWindow("ConsoleWindowClass",NULL);
        if (!hwnd) return 2;
    
        HDC hDC = GetDC(hwnd);
        if (!hDC) return 3;
    
        HDC hBitmapDC = CreateCompatibleDC(hDC);
        if (!hBitmapDC) return 4;
    
        SelectObject(hBitmapDC,hBitmap);
    
        BitBlt(hDC,PosX,PosY,381,128,hBitmapDC,0,0,SRCCOPY);
    
        DeleteObject(hBitmap);
        ReleaseDC(hwnd,hBitmapDC);
        ReleaseDC(hwnd,hDC);
        return 0;
    }
    


  • aso klar...
    so sollte es aussehen:

    #include <windows.h>
    #include <iostream>
    using namespace std;
    
    int LoadBmp2Console(UINT,int,int);
    
    int main()
    {
        LoadBmp2Console(RES_LAKE,270,10);
        getchar();
    }
    
    int LoadBmp2Console(UINT nID, int PosX, int PosY)
    {
        HBITMAP hBitmap = (HBITMAP)LoadImage(GetModuleHandle( NULL ),MAKEINTRESOURCE(nID), IMAGE_BITMAP,0,0,0);
        if (!hBitmap) return 1;
    ...
    


  • Dann kommt vom Compiler die Fehlermeldung:

    Compiler schrieb:

    [C++ Fehler] main.cpp(9): E2451 Undefiniertes Symbol 'RES_LAKE'

    Ich hab's doch in der Ressource-Datei definiert 😕

    Oder was muss ich da jetzt noch machen?

    Jedenfalls danke schonmal für deine Hilfe! 👍



  • Füg eine

    ressource.h

    #define RES_LAKE 100
    

    deinem Projekt hinzu und Inkludiere sie in main.cpp und in ressource.rc.

    Greetz, Swordfish



  • 👍 👍 👍

    Jetzt hab ich's hinbekommen, danke für die Hilfe! 😉


Anmelden zum Antworten