Jump to content
  • Advertisement

Archived

This topic is now archived and is closed to further replies.

langguy

DirectDraw 7 Surface + Bitmaps

This topic is 5723 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

I am new to DirectX programming. I have the DX8 SDK and am using BCB6. I am trying to load a bitmap from a file into a CSurface. When I initialize DirectDraw, I call dispDisplay->CreateSurface(&surfBitmap,256,256); dispDisplay->Blt(100,300,surfBitmap,NULL); surfBitmap->Create(dispDisplay->GetBackBuffer()); and then in my game loop, I call surfBitmap->DrawBitmap(bmp->Handle, 100, 300, 256, 256); where *bmp is a Graphics::TBitmap that is loaded in my form''s constructor. When I run my program, however, I just get garbage where my bitmap is supposed to show up. What should I do (that doesn''t require tons of code) to load a bitmap onto my surface? Note: this method works just fine if I call DrawTextA. langguy

Share this post


Link to post
Share on other sites
Advertisement
Hope it helps,


  
LPDIRECTDRAWSURFACE7 CreateSurfaceFromFile( LPDIRECTDRAW7 DDraw, char * file,
bool videomemory )
{
HBITMAP hbmp; // bitmap handle

BITMAP bitmap; // temporary bitmap

HDC hdcImagem; // image handle

HDC hdcSurface; // surface handle

DDSURFACEDESC2 ddsdAux;
LPDIRECTDRAWSURFACE7 ddsSurface; // superficie pointer

HRESULT hr;

// open bitmap

hbmp = ( HBITMAP ) LoadImage( NULL, file, IMAGE_BITMAP, 0, 0,
LR_LOADFROMFILE | LR_CREATEDIBSECTION );

if( hbmp == NULL )
return NULL;

// get image width and height (pixels)

GetObject( hbmp, sizeof( BITMAP ), ( void *) &bitmap );

memset( &ddsdAux, 0, sizeof( DDSURFACEDESC2 ) );

// describe surface

ddsdAux.dwSize = sizeof( DDSURFACEDESC2 );
ddsdAux.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH;
ddsdAux.dwWidth = bitmap.bmWidth;
ddsdAux.dwHeight = bitmap.bmHeight;
ddsdAux.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;

ddsdAux.ddsCaps.dwCaps |= videomemory ? DDSCAPS_VIDEOMEMORY :
DDSCAPS_SYSTEMMEMORY;

// try to create the surface

hr = DDraw->CreateSurface( &ddsdAux, &ddsSurface, NULL );

if( hr != DD_OK )
return NULL;

hdcImagem = CreateCompatibleDC( NULL );
SelectObject( hdcImagem, hbmp );

// get surface DC...

ddsSurface->GetDC( &hdcSurface );

if( hdcSurface == NULL )
{
ddsSurface->Release();
return NULL;
}

// ...so we can blit the image onto it

if( BitBlt( hdcSurface, 0, 0, ddsdAux.dwWidth, ddsdAux.dwHeight, hdcImagem,
0, 0, SRCCOPY ) == false )
{
ddsSurface->ReleaseDC( hdcSurface );
ddsSurface->Release();
return NULL;
}


// release resources

ddsSurface->ReleaseDC( hdcSurface );
DeleteDC( hdcImagem );
DeleteObject( hbmp );

return ddsSurface;
}


"- To begin with, said the Cat, a dog's not mad. You grant that?
- I suppose so, said Alice.
- Well, then, - the Cat went on - you see, a dog growls when it's angry, and wags its tail when it's pleased. Now I growl when I'm pleased, and wag my tail when I'm angry. Therefore I'm mad."

[edited by - Andre Luiz Silva on January 22, 2003 9:08:21 AM]

Share this post


Link to post
Share on other sites

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!