Bmp Karte anzeigen?

hallo,

weisst jemand ob es eine Funktion unter „windows programmierung“ gibt, womit man eine bmp Karte in einem Fenster anzeigen kann, ohne Umwandlung der Karte in .c Datei.

Vielen Dank im Voraus

hallo,

weisst jemand ob es eine Funktion unter „windows
programmierung“ gibt, womit man eine bmp Karte in einem
Fenster anzeigen kann, ohne Umwandlung der Karte in .c Datei.

Hmmmmm, darf ich das mal nach „deutsch“ übersetzen(?),
was Du wahrscheinlich möchtest, ist vielleicht
to display a bitmap in a window“, und zwar
without converting the bitmap into a resource first“?

Ist es das?

Grüße

Hallo,

unter dem nackten Win32-API ist der Umgang mit Bitmaps sehr komplex, da wirst du dich länger damit beschäftigen müssen.

Ich empfehle daher, eine höhere GUI-Sprache wie Delphi zu verwenden, da gibt es fertige Objekte, bei denen man nur den Dateinamen angeben und die Methode zum Zeichnen aufrufen muss.

Gruss Reinhard

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

hallo,

weisst jemand ob es eine Funktion unter „windows
programmierung“ gibt, womit man eine bmp Karte in einem
Fenster anzeigen kann, ohne Umwandlung der Karte in .c Datei.

Hmmmmm, darf ich das mal nach „deutsch“ übersetzen(?),
was Du wahrscheinlich möchtest, ist vielleicht
to display a bitmap in a window“, und zwar
without converting the bitmap into a resource first“?

Ist es das?

ja, eine Idee wie es möglich ist?
danke

Grüße

hi,
erst mal einen wunderhubschen guten Morgen.
Ich weiß nicht welche Entwicklungsumgebung du verwendest. Wenn es MS Visual C++ ist, geht das relatiev einfach.

Dann verwendest du am besten die Klasse CImage. Die stellt eigentlich bereits die wichtigsten Grundfunktionen zur Verfügung.
Um ein Bild anzuzeigen, sind nur wenige Befehle notwendig.

#include 

CImage I;
...
OnButtonClicked()
{
 CClientDC dc(this);
 HDC hdc= dc.m\_hDC;
 CRect rc(0,0,800,600);
 I.Load ("Test.bmp");
 I.Draw (hdc,rc);
}

Schau am besten mal in der Hilfe nach den Memberfunktionen.
Grüße,
husky

Hallo (welches ist der Vorname?),

Ist es das?

ja, eine Idee wie es möglich ist?

Du hast ja schon einen Hinweis bekommen, wie
das mit der MFC gehen könnte. Ohne MFC geht
das auch, ich will hier mal Beispiele dazu bringen …

Also: das sind ja zwei Sachen,

  1. Bitmap-File öffnen, lesen und in Bitmap-Array laden
  2. dieses Bitmap-Array in den aktuellen device context kopieren

Du brauchst als Voraussetzung immer den
aktuellen „device context“ (DC) des Fensters,
in das du zeichnest. Um den zu bekommen, rufst
Du kurz vorher eine Funktion auf, die diesen
liefert. Beispielsweise bei der bearbeitung
der WM_PAINT-Message fällt dieser an:

 **HDC hdc** ;
 switch(message) {
 ...
 case WM\_PAINT:
 {
 PAINTSTRUCT pnt;
**hdc** = BeginPaint(hwnd, &pnt);
 ...

Weiter: Das zweite (2) ist simpel und stand schon in den
alten Petzold-Büchern, z.B.:

 void DrawBitmap(HDC hdc, **HBITMAP hBitmap** , short xStart, short yStart)
{
 BITMAP bm;
 HDC hdcMem;
 POINT ptSize, ptOrg;

 hdcMem = CreateCompatibleDC(hdc);
 SelectObject(hdcMem, hBitmap);
 SetMapMode(hdcMem, GetMapMode(hdc));
 GetObject(hBitmap, sizeof(BITMAP), (LPSTR) &bm);
 ptSize.x = bm.bmWidth;
 ptSize.y = bm.bmHeight;
 DPtoLP(hdc, &ptSize, 1);
 ptOrg.x = ptOrg.y = 0;
 DPtoLP(hdcMem, &ptOrg, 1);
 **BitBlt(hdc, xStart, yStart, ptSize.x, ptSize.y, hdcMem, ptOrg.x, ptOrg.y, SRCCOPY)**;
 DeleteObject(hdcMem);
 DeleteDC(hdcMem);
}

Das erste, also die Erzeugung des HBITMAP hBitmap richtet sich
nach den „Gegebenheiten“, welches Format genau - usw.
Ein Beispiel:

 **HBITMAP** LoadPictureBMP(char \*fname, int mode, HWND hWnd)
{
 BITMAPFILEHEADER bmfh; // so geht das .BMP los
 BITMAPINFO bmi, \*lpBmi; // so geht das .BMP weiter
 long lPos=0L, dwCount, clrSize;
 int handle, cx, cy;
 unsigned short nCount, wUsage;
 HBITMAP hBm=0;
 GLOBALHANDLE hGlob;
 LOCALHANDLE hLBmi;
 char\* lpGmem;
 HDC hdc;

 if((handle=\_lopen((LPSTR)fname, OF\_READ)) == -1) 
 return FALSE;
 
 \_lread(handle, &bmfh, sizeof(bmfh)); // Bitmap-Fileheader laden
 \_lread(handle, &bmi, sizeof(bmi)); // Bitmap-Info laden
 cx = bmi.bmiHeader.biWidth;
 cy = bmi.bmiHeader.biHeight;
 if(!(dwCount = (DWORD) bmi.bmiHeader.biSizeImage)) // Wie groß ?
 dwCount = (DWORD) bmi.bmiHeader.biWidth 
 \* (DWORD) bmi.bmiHeader.biHeight 
 \* bmi.bmiHeader.biBitCount;
 
 hGlob = GlobalAlloc(GMEM\_MOVEABLE, dwCount); // Speicher holen
 lpGmem = (char\*)GlobalLock (hGlob);
 // die Größe der Farbtabelle je nach BMP-Typ ermitteln
 if(!bmi.bmiHeader.biClrUsed && bmi.bmiHeader.biBitCount hdc = GetDC(hWnd);
**hBm** = CreateDIBitmap(hdc, &bmi.bmiHeader, CBM\_INIT, lpGmem, lpBmi, wUsage);
 ReleaseDC(hWnd, hdc);
 }
 if(hLBmi != 0) {
 LocalUnlock(hLBmi);
 LocalFree(hLBmi);
 }
 if(hGlob != 0) {
 GlobalUnlock(hGlob);
 GlobalFree(hGlob);
 }
 **return hBm** ;
}

Ich hatte sowas vor Jahren mal gemacht,
da hat es funktioniert. Das ist glaube
ich noch Win16-code (Lock/Unlock),
sollte aber auch unter Win32 gehen.

Versuch mal, ob das klappt :wink:

Grüße

CMБ