LoadImage



  • hallo Forum,

    ich habe mir ein kleinen Quellcode gemacht, wo eineinfaches bild im fenster angezeigt werden soll.

    nun habe ich das problehm, das wenn ich es kompiliere zwei errors kommen 😕

    hier der Quelltext:

    #include <windows.h>
    #include "stdafx.h"
    #include "dmhdsg.h"
    
    LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam )
    {   
             HDC hdc;   
             PAINTSTRUCT ps;   
             int i;
    
    		 HANDLE hbitmap = LoadImage(NULL,"test.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
    HDC hdc = GetWindowDC(hwnd);
    HDC hdc_ram = CreateCompatibleDC(NULL);
    SelectObject(hdc_ram, hbitmap);
    BitBlt(hdc,50,50,100,100,hdc_ram,0,0,SRCCOPY);
    
    switch( message )   
             {   
               case WM_PAINT:       
                 hdc = BeginPaint( hwnd, &ps );
                   for(i=0; i<1024; i++) SetPixel( hdc, i, 100, RGB(0,0,255) );
                 EndPaint( hwnd, &ps );
               return 0;
    
               case WM_DESTROY:       
                 PostQuitMessage(0);       
               return 0;                
    
               return 0;   
             }
             return DefWindowProc (hwnd, message, wParam, lParam);
    }
    
    int WINAPI WinMain( HINSTANCE hI, HINSTANCE hPrI, PSTR szCmdLine, int iCmdShow )
    {
             static TCHAR szName[] = TEXT("Fensterklasse");   
             HWND hwnd ;
    
             WNDCLASS wc;
             wc.style         = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
             wc.lpfnWndProc   = WndProc;   
             wc.cbClsExtra    = 0;
             wc.cbWndExtra    = 0;   
             wc.hInstance     = hI;
             wc.hIcon         = LoadIcon (NULL, IDI_WINLOGO);
             wc.hCursor       = LoadCursor (NULL, IDC_ARROW);
             wc.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH);
             wc.lpszMenuName  = NULL;   
             wc.lpszClassName = szName;
    
             RegisterClass (&wc);
             hwnd = CreateWindow (szName, TEXT("Punkte setzen"), WS_OVERLAPPEDWINDOW,
                                  0, 0, 200, 200, NULL, NULL, hI, NULL);       
    
             ShowWindow (hwnd, iCmdShow);   
             UpdateWindow (hwnd);   
    
             MSG msg;   
    
             while (GetMessage (&msg, NULL, 0, 0))   
             {
                 TranslateMessage (&msg);       
                 DispatchMessage (&msg);
             }
             return msg.wParam;
    }
    

    Und in diesem bereich wird das Bild geladen und ausgegeben:

    HANDLE hbitmap = LoadImage(NULL,"test.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
    HDC hdc = GetWindowDC(hwnd);
    HDC hdc_ram = CreateCompatibleDC(NULL);
    SelectObject(hdc_ram, hbitmap);
    BitBlt(hdc,50,50,100,100,hdc_ram,0,0,SRCCOPY);
    

    wenn ich es nun kompiliere kommt folgendes:

    c:\dokumente und einstellungen\dustin.trance\eigene dateien\visual studio 2005\projects\dmhdsg\dmhdsg\dmhdsg.cpp(13) : error C2664: 'LoadImageW': Konvertierung des Parameters 2 von 'const char [9]' in 'LPCWSTR' nicht möglich
    Die Typen, auf die verwiesen wird, sind nicht verknüpft; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat.
    c:\dokumente und einstellungen\dustin.trance\eigene dateien\visual studio 2005\projects\dmhdsg\dmhdsg\dmhdsg.cpp(14) : error C2086: 'HDC hdc': Neudefinition
    c:\dokumente und einstellungen\dustin.trance\eigene dateien\visual studio 2005\projects\dmhdsg\dmhdsg\dmhdsg.cpp(9): Siehe Deklaration von 'hdc'
    c:\dokumente und einstellungen\dustin.trance\eigene dateien\visual studio 2005\projects\dmhdsg\dmhdsg\dmhdsg.cpp(67) : warning C4244: 'return': Konvertierung von 'WPARAM' in 'int', möglicher Datenverlust

    kann mir vieleicht jeman weiter helfen?

    MfG
    Showball!



  • Hilfe zur Selbsthilfe :

    ...
    HDC hdc;                     // <- !
    PAINTSTRUCT ps;
    ...
    HDC hdc = GetWindowDC(hwnd); // <- !
    ...
    
    TEXT("test.bmp")
    

    🙂



  • hey, Danke!!!

    Ein feghler is nun behoben, aber eine error habe ich noch 😞

    Ich weiß leider nicht was diese error beduetet, habe die nähmlich eigentlich noch net gehabt 😕

    hier der code:

    #include <windows.h>
    #include "stdafx.h"
    #include "dmhdsg.h"
    
    LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam )
    {   
    
             int i;
    
    HANDLE hbitmap = LoadImage(NULL,"test.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
    HDC hdc = GetWindowDC(hwnd);
    HDC hdc_ram = CreateCompatibleDC(NULL);
    SelectObject(hdc_ram, hbitmap);
    BitBlt(hdc,50,50,100,100,hdc_ram,0,0,SRCCOPY);
    TEXT("test.bmp");
    PAINTSTRUCT ps; 
    
    switch( message )   
             {   
               case WM_PAINT:       
                 hdc = BeginPaint( hwnd, &ps );
                   for(i=0; i<1024; i++) SetPixel( hdc, i, 100, RGB(0,0,255) );
                 EndPaint( hwnd, &ps );
               return 0;
    
               case WM_DESTROY:       
                 PostQuitMessage(0);       
               return 0;                
    
               return 0;   
             }
             return DefWindowProc (hwnd, message, wParam, lParam);
    }
    

    und hier die error:

    c:\dokumente und einstellungen\dustin.trance\eigene dateien\visual studio 2005\projects\dmhdsg\dmhdsg\dmhdsg.cpp(14) : error C2664: 'LoadImageW': Konvertierung des Parameters 2 von 'const char [9]' in 'LPCWSTR' nicht möglich
    Die Typen, auf die verwiesen wird, sind nicht verknüpft; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat.

    mal so eine andere frage, würde der code eigentlich mit MSVC++2005EE überhaupt gehen, wenn ich nur den compiler und API installiert habe??

    Alsoe es soll halt eine Bilmap datei, also eon bild anzeigen 🙂
    hoffe das es sol klappt wie ich es mir vorstelle 🙂 Also cih füge ienfach eine ressource im projekt hinzu und zwar das test.bmp die bitmap datei, und dann soll das bild eingelesen und angezeigt werden 🙂

    ich hoffe das es geht 🙂 dann währe ich nähmlich sehr glücklich!

    MfG
    Showball!



  • Ähem, eigentlich war das mit TEXT("test.bmp") so gemeint :

    // HANDLE hbitmap = LoadImage(NULL,"test.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
    HANDLE hbitmap = LoadImage(NULL,TEXT("test.bmp"),IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
    

    🙂



  • hey danke es klappt, nur jetzt wird das bild net angezeigt, es heißt Bild1.bmp

    aber es wird halt net angezeigt, und weil ich mich in den images nicht sehr gut auskenne, weiß ich auh net genau warum 😞

    hier der Code:

    #include <windows.h>
    #include "stdafx.h"
    #include "dmhdsg.h"
    
    LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam )
    {   
    
             int i;
    
    HANDLE hbitmap = LoadImage(NULL,TEXT("bild1.bmp"),IMAGE_BITMAP,0,0,LR_LOADFROMFILE); 
    HDC hdc = GetWindowDC(hwnd);
    HDC hdc_ram = CreateCompatibleDC(NULL);
    SelectObject(hdc_ram, hbitmap);
    BitBlt(hdc,50,50,100,100,hdc_ram,0,0,SRCCOPY);
    PAINTSTRUCT ps; 
    
    switch( message )   
             {   
               case WM_PAINT:       
                 hdc = BeginPaint( hwnd, &ps );
                   for(i=0; i<1024; i++) SetPixel( hdc, i, 100, RGB(0,0,255) );
                 EndPaint( hwnd, &ps );
               return 0;
    
               case WM_DESTROY:       
                 PostQuitMessage(0);       
               return 0;                
    
               return 0;   
             }
             return DefWindowProc (hwnd, message, wParam, lParam);
    }
    
    int WINAPI WinMain( HINSTANCE hI, HINSTANCE hPrI, PSTR szCmdLine, int iCmdShow )
    {
             static TCHAR szName[] = TEXT("Fensterklasse");   
             HWND hwnd ;
    
             WNDCLASS wc;
             wc.style         = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
             wc.lpfnWndProc   = WndProc;   
             wc.cbClsExtra    = 0;
             wc.cbWndExtra    = 0;   
             wc.hInstance     = hI;
             wc.hIcon         = LoadIcon (NULL, IDI_WINLOGO);
             wc.hCursor       = LoadCursor (NULL, IDC_ARROW);
             wc.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH);
             wc.lpszMenuName  = NULL;   
             wc.lpszClassName = szName;
    
             RegisterClass (&wc);
             hwnd = CreateWindow (szName, TEXT("Punkte setzen"), WS_OVERLAPPEDWINDOW,
                                  0, 0, 200, 200, NULL, NULL, hI, NULL);       
    
             ShowWindow (hwnd, iCmdShow);   
             UpdateWindow (hwnd);   
    
             MSG msg;   
    
             while (GetMessage (&msg, NULL, 0, 0))   
             {
                 TranslateMessage (&msg);       
                 DispatchMessage (&msg);
             }
             return msg.wParam;
    }
    

    Also zurst lade ich das bild in die ressourcen, also ich mache im projekt bei ressorrcen "hinzufügen" ->> "vohandenes Element" ->> und dann das bild auswählen

    habe ich noch irgent was vergessen?

    MfG
    Showball!



  • kann das vieleciht sein, das die Funktion fürs anzeigen fehlt, sowas wie DrawPic oder so?

    Aber wie mache ich das???

    MfG
    Showball!



  • Überleg mal, ob die Stelle wo LoadImage () aufgerufen wird, irgendwie auch richtig ist.

    Sie sollte "irgendwo" in der switch () - Anweisung liegen. Aber wo ?

    Danach informiere Dich über folgende WinAPI-Funktionen :

    -> DeleteObject ()
    -> DeleteDC ()
    -> ReleaseDC ()

    Erst wenn alles läuft solltest Du anfangen, Ressourcen via Kompilereinstellungen hinzuzufügen.
    🙂



  • Also ich habe versucht das in einer switch funktion in einer case ein zu fügen, aber es funktionierte nicht, kahmen 9 errors 😕

    Wo kann ich mich denn uber die drei Objekte informieren?? knnst du einen guten link, am besten auf deutsch?

    MfG
    Showball!

    PS: Finde es gut das du mir den Code nicht vorgiebst, so muss ich selber herausfinden wie's geht, zu mindest zum teil 👍

    EDIT: Wie geht das denn sonst ohne ressourcen?? geht das noch anders, einfacher?



  • Grundsätzlich gilt : Was man vom Betriebssystem anfordert, muss man (nach Gebrauch) auch wieder freigeben.
    D.h. zu jedem "open" gehört ein "close", zu jedem "LoadImage" gehört ein "DeleteObject", zu jedem "CreateCompatibleDC" gehört ein "DeleteDC".
    Ich gebe jetzt mal sechs Zeilen vor 🙂
    Guck nochmal genau die Anweisungen an, die Du bei "WM_PAINT" bereits hast und setze diese sechs Zeilen dann an die richtige Stelle :

    switch (message) 
    {
     case WM_PAINT :
     {
      ...
    //----------------------------------------------------
      hbitmap = LoadImage (NULL,TEXT("C:\\TEMP\\bild1.bmp"),IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
      hdc_ram = CreateCompatibleDC(NULL);
      SelectObject (hdc_ram, hbitmap);
      BitBlt       (hdc,50,50,100,100,hdc_ram,0,0,SRCCOPY);
      DeleteDC     (hdc_ram);
      DeleteObject (hbitmap);
    //----------------------------------------------------
      ...
      return 0;
     }
    
     case WM_DESTROY : 
     {
      ...
      return 0;
     }
    
    }
    


  • haha! Das ist ja eigentlich einfacher als ich dachte, wozu braucht man denn Directx wenns auch so geht!!! 😃

    danke!!!

    bist echt ne gute Huilfe!!!

    Für alle die das auch gerne machen wollen, versucht es doch mal damit:

    switch( message )  
             {  
               case WM_PAINT:      
                 hdc = BeginPaint( hwnd, &ps );
    
     hbitmap = LoadImage (NULL,TEXT("C:\\Dokumente und Einstellungen\\Dustin.TRANCE\\Eigene Dateien\\Visual Studio 2005\\Projects\\dmhdsg\\bild2.bmp"),IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
      hdc_ram = CreateCompatibleDC(NULL);
      SelectObject (hdc_ram, hbitmap);
      BitBlt       (hdc,50,50,100,100,hdc_ram,0,0,SRCCOPY);
      DeleteDC     (hdc_ram);
      DeleteObject (hbitmap); 
    
                   for(i=0; i<1024; i++) SetPixel( hdc, i, 100, RGB(0,0,255) );
                 EndPaint( hwnd, &ps );
    
               return 0;
    
               case WM_DESTROY:      
                 PostQuitMessage(0);      
               return 0;                
    
               return 0;  
             }
             return DefWindowProc (hwnd, message, wParam, lParam);
    }
    

    jetzt habe ich nurnoch eine frage, so wie ich das sehe funktionieren da aber keine zwei bilder oder??? wenn ih mal zwei bilder einfügen will ...

    Oder geht das doch?

    **und wie kann ich machen, also den link dort zu dem bild, das man da ine variable rein acht, also ab da wo die exe ist beginnt der link, denn wenn ich mein proggy jetzt anderen geben würde und die das wo ganz anders haben, dann werden die bilder ja uh nimmer angezeigt oder?
    **
    PS: Nochmals tausenden dank!!!

    MfG
    Showball

    Währe das auch nichts fürs FAQ??



  • ich weiß das man grundlos eigentlich nix posten sollte, aber das muss ich jetzt einfach, weil ich nun weiß, das das was ich vor habe nun geht.

    Als info für alle die es noch nicht wissen, bei den abständen zu den rändern kann man auch negative werte eintareg, z.b -10 oder so, dann wird das bild um 10 pixel weniger ganz am rand angezeigt!!!



  • Ich hbe mal so eine frage, wenn ich farablen in den abständen einfügen will, muss ich da dann einfach den variablen namen einfügen, z.b. i oder so ähnlich, oder was muss ich dafür machen?


Anmelden zum Antworten