Bitamp einlesen und ausgeben.
-
Hi, ich möchte grerne ein Bitmap einlesen, und danach in meinem Window ausgeben.
Hat jemand ein Tutorial dazu, oder einen Quelltext der gut kommentiert ist
-
Ich kann ja mal eben basteln ...
Kurz zum Ablauf:
1. Bitmap laden
2. Speicherkontext erstellen, geladene Bitmap einsetzen
3. Speicherkontext auf den Bildschirm kopieren
4. Speicher wieder freigeben (GDI-Clean-Up)Voila
// Bitmap-Datei: "C:\demo.bmp" laden und in Handle 'hbmpSource' speichern: HBITMAP hbmpSource = LoadImage(NULL, TEXT("C:\\demo.bmp"), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_DEFAULTSIZE | LR_DEFAULTCOLOR); // Definition 1: 'hWnd' sei das Fenster auf deren Client-Bereich die Bitmap ausgegeben werden soll. // Definition 2: 'hDC' sei der Geräte-Kontext dieses Fensters; Initialisierung entweder via GetDC(Ex) oder BeginPaint. /* * Speicherkontext für geladene Bitmap erstellen, damit auch * noch weitere Zeichenaktionen (auf die Bitmap) möglich sind; * Bitmap in den Speicherkontext einsetzen und Speicherkontext * auf (Monitor-)Geräte-Kontext blitten (=kopieren). */ HDC hdcMemory = CreateCompatibleDC(hDC); // Speicherkontext initialisieren // Geladene Bitmap in den Speicherkontext einsetzen und vorherige Bitmap sichern: HBITMAP hbmpPrevBits = reinterpret_cast<HBITMAP>(SelectObject(hdcMemory, hbmpSource)); // Hinweis: Mit der Funktion BitBlt lässt sich die Größe der Bitmap nicht ändern, StretchBlt // kann die Größe jedoch ändern (9. und 10. Parameter). RECT rcClient; // für den Client-Bereich BITMAP bmInfo; // für die Bitmap-Informationen (wie Größe, etc. ...) GetClientRect(hWnd, &rcClient); // <- Client-Bereich des Fensters ermitteln (=> Zielbereich) GetObject(hbmpSource, sizeof(BITMAP), &bmInfo); StretchBlt(hDC, 0, 0, rcClient.right, rcClient.bottom, hdcMemory, 0, 0, bmInfo.bmWidth, bmInfo.bmHeight, SRCCOPY); // Hinweis: Beim Verwenden von BitBlt kann man sich die vorletzten beiden Parameter sparen. // GDI-Objekte wieder freigeben: SelectObject(hdcMemory, hbmpPrevBits); // <- Alte Bitmap wieder in den Speicherkontext einsetzen DeleteObject(hbmpSource); // <- Geladene Bitmap löschen // oder etwas kompakter (entspricht aber den beiden oberen Funktionsaufrufen und ist deshalb auskommentiert): // DeleteObject(SelectObject(hdcMemory, hbmpPrevBits)); DeleteDC(hdcMemory); // <- Speicherkontext löschen // Hinweis: Den Aufruf von ReleaseDC bzw. EndPaint nicht vergessen!
Hoffe das ist verständlich .
PS: Ist aber nicht getestet...
EDIT: Vertipper :p ...
-
Hi, Vielen Dank (Wäre was für die FAQ).
Habe aber noch eine Frage
GetObject(hbmpSource, sizeof(BITMAP), &bmInfo);
Was sind alles Objekte ??
int
charusw. auch oder nut HBITMAP und BITMAP ???
-
BlackScreen schrieb:
Hi, Vielen Dank (Wäre was für die FAQ).
Hm jo stimmt, glaube das wurde schon oft gefragt...
BlackScreen schrieb:
Habe aber noch eine Frage
GetObject(hbmpSource, sizeof(BITMAP), &bmInfo);
Was sind alles Objekte ??
int
charusw. auch oder nut HBITMAP und BITMAP ???
Objekte sind (in diesem Sinne hier) 'logische GDI Objekte'; dazu gehören also nicht
die Standarddatentypen wie int oder char. Beispiele wären also HBITMAP, HFONT, HPEN usw.
BITMAP (ohne 'H' ) ist eine Struktur, also definiert mit dem
Schlüsselwort struct.
-
Aber, dann wäre ja
BITMAP bmInfo;
kein Objekt.
Wiso dann
GetObject(hbmpSource, sizeof(BITMAP), &bmInfo);
Bin ein bisschen verwirrt
-
Na der erste Parameter von GetObject ist doch ein Objekt (Typ: HBITMAP); die Informationen
dieses Objekts werden in der Strukturvariable bmInfo (Typ: BITMAP) gespeichert.GetObject ermittelt diese Informationen.
-
Hi, Wiso Funkationiert dass nicht
int LoadBitmapEx(char *BitmapSrc,int x,int y,HINSTANCE hInst,HWND hWnd) { HBITMAP hbmpPicture; HDC dcScreen; HDC dcPicture; BITMAP bmInfo; hbmpPicture = LoadBitmap(hInst,BitmapSrc); GetObject(hbmpPicture,sizeof(BITMAP),&bmInfo); dcScreen = GetDC(hWnd); dcPicture = CreateCompatibleDC(dcScreen); SelectObject(dcPicture,hbmpPicture); BitBlt(dcScreen,0,0,x,y,dcPicture,0,0,SRCCOPY); ReleaseDC(hWnd,dcScreen); return(0); }
Ich bekomme einfach kein Bild zu sehen
-
Niemand Online ??
Mir kommt es vor als ob das Board ausgestorben ist
-
Wo send denn hier die klugen läute abgeblieben.
Müssen die alle schon arebeiten
Kann doch nicht sein Dass keiner ahnung hat !!!!!
-
probier mal das, keine ahnung ob das funktionit ist ein alter quelltext von mir
void DrawBitmap(HDC hDC, HBITMAP hBitmap, int x, int y) { HDC hMemoryDC = CreateCompatibleDC(NULL); HBITMAP hOldBitmap = (HBITMAP) SelectObject(hMemoryDC, hBitmap); BITMAP BitmapInfo; GetObject(hBitmap, sizeof(BitmapInfo), &BitmapInfo); BitBlt(hDC, x, y, BitmapInfo.bmWidth, BitmapInfo.bmHeight, hMemoryDC, 0, 0, SRCCOPY); SelectObject(hMemoryDC, hOldBitmap); DeleteDC(hMemoryDC); } case WM_PAINT: { PAINTSTRUCT PaintStruct; HDC hDC = BeginPaint(hWindow, &PaintStruct); DrawBitmap(hDC, hBitmap, 0, 0); EndPaint(hWindow, &PaintStruct); } break;
-
Hier fehlt ein MAKEINTRESOURCE:
hbmpPicture = LoadBitmap(hInst,BitmapSrc);
hbmpPicture = LoadBitmap(hInst,MAKEINTRESOURCE(BitmapSrc));
PS: Du musst geladene Bitmaps auch wieder löschen bzw einen Speicherkontext wieder entfernen (siehe Beispielcode von mit, oben).
-
H, Danke aber ich möchte gerne wissen was an meinem Script falsch ist langsam werd ich wütend
-
Sry, hab gar nich geshen dass es noch ne 2. Seite hat Sry.
-
Funktioniert immer noch nicht ich bin echt am verzweifeln !!!!!!!!!!!!!!!!!!!!!!!!
int LoadBitmapEx(char *BitmapSrc,int x,int y,HINSTANCE hInst,HWND hWnd) { HBITMAP hbmpPicture; HDC dcScreen; HDC dcPicture; BITMAP bmInfo; hbmpPicture = LoadBitmap(hInst,MAKEINTRESOURCE(BitmapSrc)); GetObject(hbmpPicture,sizeof(BITMAP),&bmInfo); dcScreen = GetDC(hWnd); dcPicture = CreateCompatibleDC(dcScreen); SelectObject(dcPicture,hbmpPicture); BitBlt(dcScreen,x,y,171,171,dcPicture,0,0,SRCCOPY); DeleteDC(dcPicture); DeleteObject(hbmpPicture); ReleaseDC(hWnd,dcScreen); return(0); }
-
Wie/Wo rufst du denn die Funktion auf ?
Zeig mal den Codeabschnitt...PS: Das GetObject ist hier natürlich überflüssig... :p
-
Also die Funktion ist kacke. In WM_PAINT würdest du jedes mal das Bitmap neuladen und woanders zeichnet man nicht.
-
//-------------------------------------------------------------------------------------------------------- RegisterClassEx(&windowinfo); HWND mainWnd = CreateWindowEx(NULL,"Fish","Passoword Fish",WS_OVERLAPPEDWINDOW | WS_VISIBLE,0,0,400,400,NULL,NULL,hinst,NULL); HWND button = CreateWindowEx(NULL,"Button","Ping", WS_CHILD | BS_PUSHBUTTON,10,10,150,50,mainWnd,NULL,hinst,NULL); LoadBitmapEx("c:\\windows.bmp",10,10,hinst,mainWnd); while(GetMessage(&msg,NULL,0,0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return(0);
-
BlackScreen kann es sein das du ein 14 jähriges CS spielendes Kiddy bist?
-
Wiso nein wie kommst du drauf ich nerve mich nur weil ich an diesem mit schon den ganzen tag dransitze und nie funktioniert es
-
loadbitmapex schrieb:
Also die Funktion ist kacke. In WM_PAINT würdest du jedes mal das Bitmap neuladen und woanders zeichnet man nicht.
Jo da hast Du Recht:
Man könnte der Funktion ja auch ein (statisches) Handle zu einer Bitmap übergeben, die unter WM_CREATE geladen und unter WM_DESTROY gelöscht wird.@BlackScreen:
Man unterscheidet zwischen Bitmaps die als Resource in einem Modul abgelegt sind und solche die als Dateien auf einem Datenträger gespeichert sind.
Resourcen-Bitmap werden über die Funktion LoadBitmap unter Angabe des korrekten Instanz-Handles und der ID der Bitmap. Bitmap-Dateien werden über die Funktion LoadImage geladen (man kann damit allerdings auch Resourcen-Bitmaps laden).Weiterhin werden Zeichenaktionen immer unter der Nachricht WM_PAINT in der entsprechenden WndProc deines Zielfensters abgehandelt. Dazu gehören selbstverstänldich auch 'Blittings'.
Ich denke es wäre sinnvoll, wenn Du Dir (nochmal?) ein Tutorial bzgl. WinAPI anguckst. Hier ein Beispiel: http://www.win-api.de/ . Weitere findest Du zu Hauf bei Google.