BMPs einbinden
-
Morgen Leute, mal aufgepasst:
Ich bin grad dabei ne einfache BMP Datei einzubinden (256 Farben 585x418pix).
Ich habe den ganzen Quellcode schon fertig und "korrekt" geschrieben dennoch bekomme ich es nicht hin dass die BMP auf der Primary Surface also auf dem Monitor angezeigt wird. Ich hab mal den Quellcode gleich mitgebracht:[cpp]
#define WIN32_LEAN_AND_MEAN
#define TASTE(Taste) (tastenPuffer[Taste] &0x80)
#define SCREEN_BREITE 1024
#define SCREEN_HOEHE 768
#define SCREEN_BPP 8
#define M_PI 3.141592653589793#include <windows.h>
#include <math.h>
#define DIRECTINPUT_VERSION 0x0700
#include <dinput.h>
#include <ddraw.h>
#include <io.h>
#include <stdlib.h>
HWND hwnd;LPDIRECTDRAWPALETTE lpDDPal;
LPDIRECTINPUT7 lpDI;
LPDIRECTINPUTDEVICE7 lpDIKeyboard;
char tastenPuffer[256];
const char* Datei="logo.bmp";LPDIRECTDRAW7 lpDD; //Direct Draw Object
LPDIRECTDRAWSURFACE7 lpDDSPrimary;BOOL done=FALSE;
BOOL DDrawStart(void);
BOOL DInputStart(HINSTANCE hinst);
BOOL TastenAbfrage();HANDLE xxf_openBMPFile(const char* fileName);
BOOL xxf_saveBMPFile(const char* fileName);LRESULT CALLBACK WindowProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam)
{switch(message)
{
case WM_DESTROY:
{
PostQuitMessage(0);
return(0);
}break;default:break;
}
return(DefWindowProc(hwnd, message, wparam, lparam));
}int WINAPI WinMain(HINSTANCE hinst, HINSTANCE hprevinst, LPSTR lpcmdline, int ncmdshow)
{
WNDCLASSEX winclass;MSG message;
const char szclassname[]="Klassename";
winclass.cbSize=sizeof(WNDCLASSEX);
winclass.style=CS_HREDRAW | CS_VREDRAW;
winclass.lpfnWndProc=WindowProc;
winclass.cbClsExtra=0;
winclass.cbWndExtra=0;
winclass.hInstance=hinst;
winclass.hIcon=LoadIcon(NULL, IDI_APPLICATION);
winclass.hCursor=LoadCursor(NULL, IDC_ARROW);
winclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
winclass.lpszMenuName=NULL;
winclass.lpszClassName=szclassname;
winclass.hIconSm=LoadIcon(NULL, IDI_APPLICATION);if(!RegisterClassEx(&winclass))
return(0);if(!(hwnd= CreateWindowEx(NULL,
szclassname,
"BMP Test",
WS_OVERLAPPED | WS_VISIBLE,
0,0,
400,300,
NULL,
NULL,
hinst,
NULL)))
return(0);
ShowWindow(hwnd, ncmdshow);
UpdateWindow(hwnd);DDrawStart();
DInputStart(hinst);
DWORD loop;/////////////////////////HAUPTSCHLEIFE////////////////////////////////////
while(!done)
{
loop=GetTickCount();
while(PeekMessage(&message, NULL,0,0, PM_REMOVE))
{
TranslateMessage(&message);
DispatchMessage(&message);
}TastenAbfrage();
while((GetTickCount()-loop)<500);
}
//////////////////////////HAUPTSCHLEIFE ENDE/////////////////////////////////////
}
//Ende WinMain()//->//!--Anfang xxf_openBMPFile()
HANDLE xxf_openBMPFile(const char* fileName)
{
HANDLE hDatei;hDatei = CreateFile(
fileName,
GENERIC_READ,
FILE_SHARE_READ,
(LPSECURITY_ATTRIBUTES) NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
(HANDLE) NULL);if( hDatei != INVALID_HANDLE_VALUE)
return hDatei;return INVALID_HANDLE_VALUE;
}
//Ende xxf_openBMPFile()//->//!--Anfang xxf_saveBMPFile()
BOOL xxf_saveBMPFile(const char* fileName)
{
LPBYTE lpbyBild;
HANDLE hDatei;
BITMAPFILEHEADER BMPFileHead;
BITMAPINFOHEADER BMPFileInfo;
RGBQUAD Palette[256];
DWORD dwLeseSpeicher;
DDSURFACEDESC2 ddsd;
LPSTR lpZielRAM;
LPSTR lpQuellRAM;
int DDS_Breite;
int DDS_Hoehe;ZeroMemory(&ddsd, sizeof(ddsd));
ddsd.dwSize=sizeof(ddsd);lpDDSPrimary->Lock(NULL, &ddsd, DDLOCK_SURFACEMEMORYPTR | DDLOCK_WAIT, NULL);
DDS_Breite=ddsd.dwWidth;
DDS_Hoehe= ddsd.dwHeight;if(!(lpbyBild=(LPBYTE)malloc(DDS_Breite*DDS_Hoehe)))
return FALSE;hDatei=xxf_openBMPFile(fileName);
if(hDatei==INVALID_HANDLE_VALUE){
MessageBox(hwnd, "ungültiger HANDLE beim Laden ", "XXX", MB_OK);
return FALSE;}if(!ReadFile(hDatei, &BMPFileHead, sizeof(BMPFileHead), &dwLeseSpeicher, NULL))
{
CloseHandle(hDatei);MessageBox(hwnd, "File Header lesen fehlgeschlagen", "XXX", MB_OK);
return FALSE;
}if(!ReadFile(hDatei, &BMPFileInfo, sizeof(BMPFileInfo), &dwLeseSpeicher, NULL))
{
CloseHandle(hDatei);MessageBox(hwnd, "Info Header lesen fehlgeschlagen", "XXX", MB_OK);
return FALSE;
}if ((BMPFileInfo.biWidth!=DDS_Breite)||
(BMPFileInfo.biHeight!=DDS_Hoehe) ||
(BMPFileInfo.biBitCount!=8))
{
CloseHandle(hDatei);MessageBox(hwnd, "Maße passen nicht", "XXX", MB_OK);
return FALSE;
}if(!ReadFile(hDatei, Palette, sizeof(Palette), &dwLeseSpeicher, NULL))
{
CloseHandle(hDatei);MessageBox(hwnd, "Pallete speichern", "XXX", MB_OK);
return FALSE;
}if(!ReadFile(hDatei, lpbyBild, DDS_Breite*DDS_Hoehe, &dwLeseSpeicher, NULL))
{
CloseHandle(hDatei);MessageBox(hwnd, "Bilddateien lesen", "XXX", MB_OK);
return FALSE;
}
CloseHandle(hDatei);lpZielRAM=(LPSTR)ddsd.lpSurface;
lpQuellRAM=(LPSTR)(&lpbyBild[(DDS_Hoehe-1)*DDS_Breite]);for(int j=0; j<DDS_Hoehe;j++)
{
memcpy(lpZielRAM, lpQuellRAM, DDS_Breite);
lpZielRAM+=ddsd.lPitch;
lpQuellRAM-=DDS_Breite;
}lpDDSPrimary->Unlock(NULL);
if(lpbyBild) free(lpbyBild);
PALETTEENTRY pe[356];
HRESULT ddrval;ZeroMemory(pe,256*sizeof(PALETTEENTRY));
for(int i=0; i<256; i++)
{
pe[i].peRed=Palette[i].rgbRed;
pe[i].peGreen=Palette[i].rgbGreen;
pe[i].peBlue=Palette[i].rgbBlue;
pe[i].peFlags=PC_NOCOLLAPSE;
}
ddrval=lpDD->CreatePalette(DDPCAPS_8BIT | DDPCAPS_ALLOW256, pe, &lpDDPal, NULL);
if(ddrval != DD_OK)
{
MessageBox(hwnd, "Fehler in der Palette", "XXX", MB_OK);
return FALSE;
}
ddrval=lpDDSPrimary->SetPalette(lpDDPal);
if(ddrval!= DD_OK)
{
MessageBox(hwnd, "Palette kann nicht eingestellt werden", "XXX", MB_OK);
return FALSE;
}}
//!--Anfang InputStart()
BOOL DInputStart(HINSTANCE hinst){
HRESULT dirval;dirval=DirectInputCreateEx(hinst, DIRECTINPUT_VERSION, IID_IDirectInput7, (void**)&lpDI, NULL);
if(dirval!=DI_OK)
{
MessageBox(hwnd, "DInput Fehler: DInputCreate()", "XXX", MB_OK);
return FALSE;
}dirval=lpDI->CreateDeviceEx(GUID_SysKeyboard, IID_IDirectInputDevice7, (LPVOID*)&lpDIKeyboard, NULL);
if(dirval!=DI_OK){
MessageBox(hwnd, "DInput Fehler: CreateDeviceEx()", "XXX", MB_OK);
return FALSE;
}dirval=lpDIKeyboard->SetDataFormat(&c_dfDIKeyboard);
if(dirval!=DI_OK)
{
MessageBox(hwnd, "DInput Fehler: SetDataFormat()", "XXX", MB_OK);
return FALSE;
}dirval=lpDIKeyboard->SetCooperativeLevel(hwnd, DISCL_FOREGROUND | DISCL_NONEXCLUSIVE);
if(dirval!=DI_OK)
{
MessageBox(hwnd, "DInput Fehler: SetCooperativeLevel()", "XXX", MB_OK);
return FALSE;
}if(lpDIKeyboard) lpDIKeyboard->Acquire();
return TRUE;
}
//Ende InputStart//-->//!--Anfang Tastenabfrage()
BOOL TastenAbfrage(void)
{
HRESULT dirval;dirval=lpDIKeyboard->GetDeviceState(sizeof(tastenPuffer), (LPVOID)&tastenPuffer);
if(dirval!=DI_OK)
{
if(dirval==DIERR_INPUTLOST)
{
if(lpDIKeyboard)
{
lpDIKeyboard->Acquire();
dirval=lpDIKeyboard->GetDeviceState(sizeof(tastenPuffer), (LPVOID)&tastenPuffer);
if(dirval!=DI_OK)
{
MessageBox(hwnd, "DInput Fehler: GetDeviceStatel()", "XXX", MB_OK);
return FALSE;
}
}
}else{
MessageBox(hwnd, "DInput Fehler: GetDeviceState()", "XXX", MB_OK);
return FALSE;
}
}if TASTE(DIK_ESCAPE)
{
if(lpDIKeyboard != NULL)
{
lpDIKeyboard->Unacquire();
lpDIKeyboard->Release();
lpDIKeyboard=NULL;
}done=TRUE;
PostMessage(hwnd, WM_CLOSE,0,0);
return FALSE;
}}
//Ende TastenAbfrage//-->//!--Anfang DDrawStart()
BOOL DDrawStart(void)
{
HRESULT ddrval; //Rückgabewert
DDSURFACEDESC2 ddsd; //Surface Beschreibung
DDSCAPS2 ddscaps; //Struktureigenschaftenddrval = DirectDrawCreateEx ( NULL, (LPVOID*)&lpDD, IID_IDirectDraw7, NULL); //Erzeugen des Objects
if(ddrval != DD_OK)
{MessageBox(hwnd, "DDraw Fehler : CreateEx()", "XXX", MB_OK);return 0;
}ddrval = lpDD->SetCooperativeLevel(hwnd, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN);//ExclusiveRechner über Bildschirm
if(ddrval != DD_OK)
{MessageBox(hwnd, "DDraw Fehler : SetCooperative()", "XXX", MB_OK);return 0;
}ddrval = lpDD->SetDisplayMode(SCREEN_BREITE, SCREEN_HOEHE, SCREEN_BPP, 0,0);//Leerer Bildschirm
if(ddrval != DD_OK)
{MessageBox(hwnd, "DDraw Fehler : SetDisplayMode()", "XXX", MB_OK);return 0;
}ZeroMemory(&ddsd, sizeof(ddsd)); //Speicher bereitstellen
ddsd.dwSize=sizeof(ddsd);
ddsd.dwFlags=DDSD_CAPS; //macht ddsdcaps ist gültig
ddsd.ddsCaps.dwCaps=DDSCAPS_PRIMARYSURFACE; //Primäre Surface, nur ein malddrval=lpDD->CreateSurface(&ddsd, &lpDDSPrimary, NULL);
if(ddrval != DD_OK)
{MessageBox(hwnd, "DDraw Fehler : CreateSurface()", "XXX", MB_OK);return 0;
}return TRUE;
}
//Ende DDrawStart()//-->
[cpp]Ich fänds super wenns sich das mal jemand anschauen könnte und mir dann sagt was ich dagegen unternehmen kann.
Ciao ciao!