www.pudn.com > chibi > DDBITMAP.CPP
///////////// // DDBtimap.cpp : v0010 // Written by : Li Haijun // Compiler : Microsoft Visual C++ 4.0 & DirectX // Library : DDraw.Lib // Copyright (C) : 1996 WayAhead Corporation // v0010 : Nov.28.1996 ///////////// // implementation file // to show the special bitmap . eg : tq.bmp fx.bmp sz.bmp // This file provide basic interfaces for deal with bitmap of interface ////////////////////////////// #include "stdafx.h" #include#include "Assert.h" #include "DDCompo.h" #include "marco.h" #include "DDBitmap.h" //////////////////////////// #include "l_allbmp.h" //extern char bmpfilename[30]; //extern char listfilename[30]; ///////////////////////////////////// ///////////////////////////////////// class CDDBitmap * pAllBitmap[MAX_BITMAP]; //to store all bitmap's pointer ///////////////////////////////////// // to restore all button's pointer //constructor CDDBitmap::CDDBitmap() { m_szOneBitmap.cx = 0L; m_szOneBitmap.cy = 0L; m_rTotal.left = 0L; m_rTotal.top = 0L; m_rTotal.right = 0L; m_rTotal.bottom = 0L; m_rCurrent.left = 0L; m_rCurrent.top = 0L; m_rCurrent.right = 0L; m_rCurrent.bottom = 0L; m_dwX = 0; m_dwY = 0; m_nID = 0; m_nState = 0; m_nPart = 0; } //constructor CDDBitmap::~CDDBitmap() { Release(); } // to preload this bitmap file data by filename id BOOL CDDBitmap::PreLoad( int FilenameId, int x, int y, int OneBitmapWidth/*=0*/, int OneBitmapHeight/*=0*/, char* bmpfilename/* ="bmp\\bmp.lwc"*/, char* listfilename/* = "bmp\\bmp.idx"*/ ) { char fname[20]; HRESULT ddrval; DDSURFACEDESC ddsd; // tempory add this line for debug m_nID = FilenameId ; ////////////////////////////////////////////////// _itoa( FilenameId, fname, 10 ); class CPicture_imageall picture; picture.image_open_compress(bmpfilename); picture.image_open_index(listfilename); picture.LoadBitmap( &m_BitmapSurface, FilenameId ); picture.image_close_index(); picture.image_close_compress(); ///////////////////////////////////////////////////////// // // get size of surface. // ddsd.dwSize = sizeof(ddsd); ddsd.dwFlags = DDSD_HEIGHT | DDSD_WIDTH; ddrval = m_BitmapSurface.GetSurface()->GetSurfaceDesc(&ddsd); if(ddrval != DD_OK) return FALSE; m_rTotal.left = m_rTotal.top = 0; m_rTotal.right = ddsd.dwWidth; m_rTotal.bottom = ddsd.dwHeight; // to set the value of m_szOneBitmap if( (OneBitmapWidth==0)&&(OneBitmapHeight==0) ) { // I assume that all single bitmaps' height is equal to it's width if(m_rTotal.bottom > m_rTotal.right) m_szOneBitmap.cx = m_szOneBitmap.cy = m_rTotal.right; else m_szOneBitmap.cx = m_szOneBitmap.cy = m_rTotal.bottom; // to set the value of m_rCurrent m_rCurrent.left = m_rCurrent.top = 0; m_rCurrent.right = m_rCurrent.bottom = m_szOneBitmap.cx; } else if( OneBitmapWidth * OneBitmapHeight == 0 ) return FALSE; else { // I assume that all single bitmaps' height is not equal to it's width m_szOneBitmap.cx = OneBitmapWidth; m_szOneBitmap.cy = OneBitmapHeight; } //to set the value of m_dwX, m_dwY m_dwX = x; m_dwY = y; SetState(0); return TRUE; } // to preload this bitmap file data by filename //BOOL CDDBitmap::PreLoad(LPCTSTR lpszFilename, int x, int y, // int OneBitmapWidth/*=0*/, int OneBitmapHeight/*=0*/) /* { char fname[20]; HRESULT ddrval; DDSURFACEDESC ddsd; strcpy( fname, lpszFilename ); if( !m_BitmapSurface.LoadBitmap(lpszFilename, FALSE) ) { ErrorMessage( hwndGame, INTERFACE_ERROR+10,"Cannot find or open bitmap data file: ",fname ); return FALSE; } // // get size of surface. // ddsd.dwSize = sizeof(ddsd); ddsd.dwFlags = DDSD_HEIGHT | DDSD_WIDTH; ddrval = m_BitmapSurface.GetSurface()->GetSurfaceDesc(&ddsd); if(ddrval != DD_OK) return FALSE; m_rTotal.left = m_rTotal.top = 0; m_rTotal.right = ddsd.dwWidth; m_rTotal.bottom = ddsd.dwHeight; // to set the value of m_szOneBitmap if( (OneBitmapWidth==0)&&(OneBitmapHeight==0) ) { // I assume that all single bitmaps' height is equal to it's width if(m_rTotal.bottom > m_rTotal.right) m_szOneBitmap.cx = m_szOneBitmap.cy = m_rTotal.right; else m_szOneBitmap.cx = m_szOneBitmap.cy = m_rTotal.bottom; // to set the value of m_rCurrent m_rCurrent.left = m_rCurrent.top = 0; m_rCurrent.right = m_rCurrent.bottom = m_szOneBitmap.cx; } else if( OneBitmapWidth * OneBitmapHeight == 0 ) return FALSE; else { // I assume that all single bitmaps' height is not equal to it's width m_szOneBitmap.cx = OneBitmapWidth; m_szOneBitmap.cy = OneBitmapHeight; } //to set the value of m_dwX, m_dwY m_dwX = x; m_dwY = y; SetState(0); return TRUE; } */ // to set bitmaps' id void CDDBitmap::SetID(int ID) { m_nID = ID ; // button id } // to release this button's pointer void CDDBitmap::Release() { // release the surface that this button's bitmap used m_BitmapSurface.Release(); } // to set bitmaps' state void CDDBitmap::SetState(int state) // let button up or down or ... { m_nState = state ; if( m_szOneBitmap.cx == m_rTotal.right ) { m_rCurrent.left = m_rTotal.left; m_rCurrent.top = m_rTotal.top + m_nState * m_szOneBitmap.cy; m_rCurrent.right = m_rCurrent.left + m_szOneBitmap.cx; m_rCurrent.bottom = m_rCurrent.top + m_szOneBitmap.cy; } else { m_rCurrent.left = m_rTotal.left + m_nState * m_szOneBitmap.cx; m_rCurrent.top = m_rTotal.top; m_rCurrent.right = m_rCurrent.left + m_szOneBitmap.cx; m_rCurrent.bottom = m_rCurrent.top + m_szOneBitmap.cy; } } // to modify the show position of this bitmap void CDDBitmap::SetPosition(int x, int y) { m_dwX = x; m_dwY = y; } // to get the show position of this bitmap POINT CDDBitmap::GetPosition(void) { POINT ShowPosition; ShowPosition.x = m_dwX; ShowPosition.y = m_dwY; return ShowPosition; } ///////////////////////////////////////// // to show the bitmap void CDDBitmap::Show() { Blit(); Update(); } /////////////////////////////////////////// // to blit whole the bitmap to the back buffer void CDDBitmap::Blit() { POINT ptDest; ptDest.x = m_dwX; ptDest.y = m_dwY; m_BitmapSurface.BltToBack(ptDest, &m_rCurrent); } /////////////////////////////////////////// // to blit a compatible part of this bitmap to back buffer by the state void CDDBitmap::Blit( int ID ) { POINT ptDest; ptDest.x = m_dwX; ptDest.y = m_dwY; if( m_szOneBitmap.cx == m_rTotal.right ) { m_rCurrent.left = m_rTotal.left; m_rCurrent.top = m_rTotal.top + (ID - 1) * m_szOneBitmap.cy; m_rCurrent.right = m_rCurrent.left + m_szOneBitmap.cx; m_rCurrent.bottom = m_rCurrent.top + m_szOneBitmap.cy; } else { m_rCurrent.left = m_rTotal.left + (ID - 1) * m_szOneBitmap.cx; m_rCurrent.top = m_rTotal.top; m_rCurrent.right = m_rCurrent.left + m_szOneBitmap.cx; m_rCurrent.bottom = m_rCurrent.top + m_szOneBitmap.cy; } m_BitmapSurface.BltToBack(ptDest, &m_rCurrent); } /////////////////////////////////////////// // to blit the correctly rectangle of the source bitmap to the ancient destination point of the back buffer // // pRect -> the rectangle pointer of the part of the whole bitmap // just used to blit the general face from the zzj_face.bmp to the just ponint of the back buffer void CDDBitmap::Blit( RECT* pRect ) { POINT ptDest; RECT rSource; ptDest.x = m_dwX ; ptDest.y = m_dwY ; rSource.left = pRect->left ; rSource.right = pRect->right ; rSource.top = pRect->top ; rSource.bottom = pRect->bottom ; m_BitmapSurface.BltToBack(ptDest, &rSource); } ////////////////////////////////////////////////// // to blit the correctly rectangle part of the source bitmap to a new destination point of the back buffer // //pDest --> the destinate point in the back buffer to blit this rect of bitmap //pRect --> the rectangle of bitmap should be blit on the back buffer void CDDBitmap::Blit( POINT* pDest, RECT* pRect ) { POINT ptDest; RECT rSource; ptDest.x = pDest->x ; ptDest.y = pDest->y ; rSource.left = pRect->left - m_dwX; rSource.right = pRect->right - m_dwX; rSource.top = pRect->top - m_dwY ; rSource.bottom = pRect->bottom - m_dwY ; m_BitmapSurface.BltToBack(ptDest, &rSource); } /////////////////////////////////////////////// // to update the area of this bitmap file stay void CDDBitmap::Update() { RECT ShowRect; ShowRect.left = m_dwX, ShowRect.top = m_dwY; ShowRect.right = m_dwX + m_szOneBitmap.cx; ShowRect.bottom = m_dwY + m_szOneBitmap.cy; DDC_UpdateScreen( &ShowRect ); } ////////////////////////////////////////////////////// void FACE_DeleteAllBitmap() { for( int i=0; i Blit() ; } } return; } //////////////////////////////////////////////////////