Bitmap aus Datei laden
-
Hi,
ob der Gefahr das ihr dachtet der Thread den ich gestern aufgemacht habe wäre abgeschlossen (hat nämlich niemand mehr geantwortet). Ich will ein Bitmap aus einer Datei laden (ohne LoadImage), dank Hilfe habe ich schon eine Funktion zusammengebastelt, die klappt aber nicht und ich kann den Fehler nicht finden.
Danke schon im voraus.Beim Probieren bin ich nun aber leider an eine Stelle gekommen, an der ich nicht mehr weiter weiß. Ich poste mal den ganzen Code, er ist zwar ein bisschen flüchtig zusammengesetzt, dürfte aber nicht schwer zu verstehen sein.
C/C++ Code:
#include <windows.h>
#include <cstdio>#define WINDOW_NAME "Test"
#define CLASS_NAME "MyWindowClass"HBITMAP hBMP = NULL;
HRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
HBITMAP LoadBitmap (char* szName);
int WINAPI WinMain (HINSTANCE hI, HINSTANCE hPI,
LPSTR lpCmdLine, int iCmdShow)
{WNDCLASSEX wc;
wc.cbClsExtra = NULL;
wc.cbSize = sizeof( WNDCLASSEX );
wc.cbWndExtra = NULL;
wc.hbrBackground = (HBRUSH)GetStockObject( WHITE_BRUSH );
wc.hCursor = LoadCursor( 0, IDC_ARROW );
wc.hIcon = LoadIcon( 0, IDI_WINLOGO );
wc.hIconSm = NULL;
wc.hInstance = hI;
wc.lpfnWndProc = WndProc;
wc.lpszClassName = CLASS_NAME;
wc.lpszMenuName = NULL;
wc.style = CS_VREDRAW|CS_HREDRAW;RegisterClassEx( &wc );
HWND hWnd = CreateWindowEx( NULL, CLASS_NAME, WINDOW_NAME, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, hI, NULL );ShowWindow( hWnd, iCmdShow );
UpdateWindow( hWnd );MSG msg;
hBMP = LoadBitmap( "Bitmap.bmp" );
InvalidateRect( hWnd, NULL, true );while (GetMessage( &msg, NULL, 0, 0 ))
{TranslateMessage( &msg );
DispatchMessage( &msg );} // while
UnregisterClass( CLASS_NAME, hI );
DeleteObject( hBMP );
return msg.wParam;
} // WinMain
HRESULT CALLBACK WndProc (HWND hWnd, UINT message,
WPARAM wParam, LPARAM lParam)
{PAINTSTRUCT ps;
HDC hDC = NULL;
HDC hBmpDC = NULL;switch (message)
{
case WM_DESTROY:
{
PostQuitMessage( 0 );return 0;
} // case WM_DESTROYcase WM_PAINT:
{hDC = BeginPaint( hWnd, &ps );
hBmpDC = CreateCompatibleDC( hDC );
SelectObject( hBmpDC, hBMP );
BitBlt( hDC, 0, 0, 200, 200, hBmpDC, 0, 0, SRCCOPY );
DeleteDC( hBmpDC );EndPaint( hWnd, &ps );
return 0;
} // case WM_PAINT
} // switch
return DefWindowProc( hWnd, message, wParam, lParam );
} // WndProc
HBITMAP LoadBitmap (char* szName)
{/* Variablen zum Laden der Informationen /
FILE pFile = NULL;
BITMAPFILEHEADER bmfh;
BITMAPINFOHEADER bmih;
RGBQUAD* colors = NULL;
int size = 0;
BYTE* tempPixelData = NULL;
HBITMAP hBmp = NULL;/* Öffnen der Datei */
pFile = fopen( szName, "rb" );/* Laden des Dateikopfs */
fread( &bmfh, sizeof( BITMAPFILEHEADER ), 1, pFile );/* Laden der Kopfinformationen */
fread( &bmih, sizeof( BITMAPINFOHEADER ), 1, pFile );/* Laden der Farbpalette */
if (bmih.biBitCount < 24)
{size = 1 << bmih.biBitCount;
colors = new RGBQUAD[size];if (colors == NULL)
{
fclose( pFile );
return 0;
} // iffread( colors, sizeof( RGBQUAD ), size, pFile );
} // if
/* Laden der Pixeldaten */
size = bmfh.bfSize - bmfh.bfOffBits;
tempPixelData = new BYTE[size];
fread( tempPixelData, sizeof( BYTE ), size, pFile );/* Schließen des Handles */
fclose( pFile );/* Bitmap erstellen */
hBmp = CreateBitmap( bmih.biWidth, bmih.biHeight,
bmih.biPlanes, bmih.biBitCount, tempPixelData );/* Speicherfreigabe */
delete [] colors;
delete [] tempPixelData;return hBmp;
} // LoadBitmap
Ich habe dieses Programm schon einmal mit der LoadImage Funktion getestet und es hat funktioniert. Wer weiß was hier falsch ist schreibe das bitte.
-
Trotzdem rechtfertigt das keinen neuen Thread -> hier geht es weiter...