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:
- wie kann ich m_sFileName angeben?
- 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?
-
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 cursorsTo 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
-
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
