bitmap datei laden



  • hallo

    ich habe mir folgenden code aus vc++ in 21 tagen herausgenommen:

    // Die Bitmap-Datei laden
    	HBITMAP hBitmap;
    	hBitmap = (HBITMAP)::LoadImage(AfxGetInstanceHandle(),m_sFileName, IMAGE_BITMAP, 0, 0,LR_LOADFROMFILE | LR_CREATEDIBSECTION);
    	// Das geladene Bild dem CBitmap-Objekt zuweisen
    	m_bmpBitmap.Attach(hBitmap);
    
    	CBitmap m_bmpBitmap;
    
    	// Einen Gerätekontext erzeugen
    	CDC dcMem;
    	// Neuen Gerätekontext zum originalen DC kompatibel machen
    	dcMem.CreateCompatibleDC(pDC);
    	// Bitmap in den neuen DC selektieren
    	dcMem.SelectObject(&m_bmpBitmap);
    	//Wenn Sie das Bitmap in einen kompatiblen Gerätekontext selektieren, können Sie das Bitmap in den normalen
    	//Anzeigegerätekontext mit Hilfe der Funktion BitBlt kopieren:
    	// Das Bitmap in den Anzeige-pDC kopieren
    	pDC->BitBlt(10, 10, 726,623, &dcMem, 0, 0,SRCCOPY);
    

    Problem:

    1. wie kann ich m_sFileName angeben?
    2. in welche methode schreibe ich mir den code rein?
      mfg
      woldo


  • hi,
    m_sFileName ersetzt du einfach durch den Namen der zu ladenden Datei. oder legst dir eben nen char array an, der den Pfad enthält und setzt den ein.

    der Code muss in die OnDraw() Funktion eingesetzt werden, da dieser Funktion pDC als Parameter übergeben wird. Die Func legst du in VS 6 übern Klassenassistenten an oder in VS.net über Eigenschaften (Fenster unten links, glaub ich)->Meldungen.



  • hi,

    danke.
    den filename hab ich schon probiert durch eine cstring variable anzugeben. funktioniert nicht ganz.. ich denke mal das müsste ein zeiger auf die adresse sein, denn der filename alleine reicht ja nicht aus (pfad), oder?


  • Administrator

    MSDN nachschauen 😉

    MSDN schrieb:

    HANDLE LoadImage(
    HINSTANCE hinst,
    LPCTSTR lpszName,
    UINT uType,
    int cxDesired,
    int cyDesired,
    UINT fuLoad
    );

    MSDN schrieb:

    lpszName
    Specifies the image to load. If the hinst parameter is non-NULL and the fuLoad parameter omits LR_LOADFROMFILE, lpszName specifies the image resource in the hinst module. If the image resource is to be loaded by name, the lpszName parameter is a pointer to a null-terminated string that contains the name of the image resource. If the image resource is to be loaded by ordinal, use the MAKEINTRESOURCE macro to convert the image ordinal into a form that can be passed to the LoadImage function.

    If the hinst parameter is NULL and the fuLoad parameter omits the LR_LOADFROMFILE value, the lpszName specifies the OEM image to load. The OEM image identifiers are defined in Winuser.h and have the following prefixes.

    OBM_ OEM bitmaps
    OIC_ OEM icons
    OCR_ OEM cursors

    To pass these constants to the LoadImage function, use the MAKEINTRESOURCE macro. For example, to load the OCR_NORMAL cursor, pass MAKEINTRESOURCE(OCR_NORMAL) as the lpszName parameter and NULL as the hinst parameter.

    If the fuLoad parameter includes the LR_LOADFROMFILE value, lpszName is the name of the file that contains the image.

    Grüssli



  • 🙄 hab ich eh schon..
    aaber nicht ganz verstanden.
    könntest du mir das für meinen falle (beliebige datei laden) erklären?
    wenn sich das bitmap im verzeichnis des quellcodes befindet funktionierts eh, zb:

    hbmpBackground=(HBITMAP)LoadImage(NULL,"bild.bmp", IMAGE_BITMAP, 0,0,LR_LOADFROMFILE | LR_CREATEDIBSECTION | LR_DEFAULTSIZE);
    

    nur mit dem pfad nicht ganz


  • Administrator

    Hab es gerade selber noch ausprobiert. Also bei mir geht es mit dem Pfad. Zum Beispiel so:

    HBITMAP hBitmap = (HBITMAP)LoadImage(NULL, _T("C:\\Dokumente und Einstellungen\\NameZensiert\\Eigene Dateien\\Eigene Bilder\\greif1.bmp"), 
                                         IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION | LR_DEFAULTSIZE);
    

    Bist du sicher, dass der Pfad auch korrekt ist. Ansonsten wenn das zurück gegebene Handle NULL ist, kannst du mal GetLastError aufrufen um vielleicht ein paar genauere Informationen zu bekommen.

    Grüssli



  • hm, mit zwei backslash funktionierts bei mir auch 🙂
    wieso denn eigentlich 2?

    danke auf jeden fall euch 2!



  • '\' ist für C++ das Zeichen, das eine sogenannte 'Escape-Sequenz' kommt. die also durch ein normales Zeichen ein ungewöhnliches Zeichen erzeugt: \n wird zB zu 13 und \r zu 10 (oder wars anders rum? 😕 ), da niemand das Zeichen für Zeilenumbruch kennt.

    wenn du jetzt also als Pfad "C:\Windows\testexe.exe" erkennt er zwei solche Segqenzen \W und \t. ersteres erzeugt nen Fehler und 2ens nen Tabulator.
    Und dein Pfad sollte glaube ich nicht heißen "C:indows estexe.exe", oder?

    Damit nun C++ weiß das du keine EscapeSeQuenz haben willst sondern einfach nur nen \ gibtst du 2 \ ein: \.

    ich weiß, es geht einfacher zu erjklären..... 🙄



  • ..die erklärung passt eh.
    danke (schon wieder was gelernt 😉 )



  • Wobei es nicht unbedingt immer so ganz schlau ist, das Bild bei JEDEM Zeichenvorgang neu zu laden. D.h. einmal im Kontruktor laden und im Destructor Destroyen. Letzteres fehlt in deinem Code auch noch. Und du kannst das, solange du nicht auf eine Resourcen Dll odg. zugreifen willst auch einfach mit der CBitmap Funktion LoadBitmap machen 😉


Anmelden zum Antworten