// BitMap.cpp : Defines the entry point for the application.
//
#include "stdafx.h"
#include "resource.h"
#include <stdio.h>
#define MAX_LOADSTRING 100
#define KEY_DOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0)
#define _RGB16BIT565(r,g,b) ((b & 31) + ((g & 63) << 5) + ((r & 31) << 11))
#define DDRAW_INIT_STRUCT(ddstruct) { memset(&ddstruct,0,sizeof(ddstruct)); ddstruct.dwSize=sizeof(ddstruct); }
// Global Variables:
HWND main_window_handle;
HRESULT hr = S_OK;
//DirectDraw
LPDIRECTDRAW7 lpdd;
LPDIRECTDRAWSURFACE7 lpPBuf; //primary Surface
LPDIRECTDRAWSURFACE7 lpSBuf; //secondary Surface
LPDIRECTDRAWSURFACE7 lpOBuf[8]; //object SurFace
DDSURFACEDESC2 DDde;
DDSCAPS2 DDcaps;
HDC hdc,dhdc;
HBITMAP bitmap;
DDCOLORKEY colorkey;
int nframe = 0;
HINSTANCE hInst; // current instance
TCHAR szTitle[MAX_LOADSTRING]; // The title bar text
TCHAR szWindowClass[MAX_LOADSTRING]; // The title bar text
// Foward declarations of functions included in this code module:
ATOM MyRegisterClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK About(HWND, UINT, WPARAM, LPARAM);
// game console
int Game_Init(void *parms=NULL, int num_parms = 0);
int Game_Shutdown(void *parms=NULL, int num_parms = 0);
int Game_Main(void *parms=NULL, int num_parms = 0);
void InitDD();
void Load_Bitmap(int width, int height,char* filename, int nNum);
int DDraw_Fill_Surface(LPDIRECTDRAWSURFACE7 lpdds, USHORT color, RECT *client = NULL);
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
// TODO: Place code here.
MSG msg;
HACCEL hAccelTable;
// Initialize global strings
LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
LoadString(hInstance, IDC_BITMAP, szWindowClass, MAX_LOADSTRING);
MyRegisterClass(hInstance);
// Perform application initialization:
if (!InitInstance (hInstance, nCmdShow))
{
return FALSE;
}
hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_BITMAP);
// initialize game here
Game_Init();
// enter main event loop
while(TRUE)
{
// test if there is a message in queue, if so get it
if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
// test if this is a quit
if (msg.message == WM_QUIT)
break;
// translate any accelerator keys
TranslateMessage(&msg);
// send the message to the window proc
DispatchMessage(&msg);
} // end if
// main game processing goes here
Game_Main();
} // end while
// closedown game here
Game_Shutdown();
return msg.wParam;
}
//
// FUNCTION: MyRegisterClass()
//
// PURPOSE: Registers the window class.
//
// COMMENTS:
//
// This function and its usage is only necessary if you want this code
// to be compatible with Win32 systems prior to the 'RegisterClassEx'
// function that was added to Windows 95. It is important to call this function
// so that the application will get 'well formed' small icons associated
// with it.
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = (WNDPROC)WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, (LPCTSTR)IDI_BITMAP);
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
wcex.lpszMenuName = NULL;
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL);
return RegisterClassEx(&wcex);
}
//
// FUNCTION: InitInstance(HANDLE, int)
//
// PURPOSE: Saves instance handle and creates main window
//
// COMMENTS:
//
// In this function, we save the instance handle in a global variable and
// create and display the main program window.
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
HWND hWnd;
hInst = hInstance; // Store instance handle in our global variable
hWnd = CreateWindow(szWindowClass, szTitle, WS_POPUP,
CW_USEDEFAULT, 0, 800, 600, NULL, NULL, hInstance, NULL);
if (!hWnd)
{
return FALSE;
}
main_window_handle = hWnd;
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
return TRUE;
}
//
// FUNCTION: WndProc(HWND, unsigned, WORD, LONG)
//
// PURPOSE: Processes messages for the main window.
//
// WM_COMMAND - process the application menu
// WM_PAINT - Paint the main window
// WM_DESTROY - post a quit message and return
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
TCHAR szHello[MAX_LOADSTRING];
LoadString(hInst, IDS_HELLO, szHello, MAX_LOADSTRING);
switch (message)
{
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// Parse the menu selections:
switch (wmId)
{
case IDM_ABOUT:
DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
// Mesage handler for about box.
LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_INITDIALOG:
return TRUE;
case WM_COMMAND:
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
{
EndDialog(hDlg, LOWORD(wParam));
return TRUE;
}
break;
}
return FALSE;
}
int Game_Init(void *parms, int num_parms)
{
InitDD();
hdc = ::CreateCompatibleDC(NULL);
::ShowCursor(false);
char filename[20];
for (int nIndex = 0; nIndex < 8; nIndex++)
{
sprintf(filename,"first_%d.BMP",nIndex);
Load_Bitmap(140,140,filename,nIndex);
}
// RECT rect,drect;
// rect.left = 0;
// rect.right = 140;
// rect.top = 0;
// rect.bottom = 140;
// drect.left = 0;
// drect.right = 140;
// drect.top = 0;
// drect.bottom = 140;
// lpSBuf->Blt(&drect,lpOBuf[],&rect,(DDBLT_WAIT | DDBLT_KEYSRC),NULL);
// lpPBuf->Flip(NULL , DDFLIP_WAIT);
return(0);
}
int Game_Shutdown(void *parms, int num_parms)
{
return(0);
}
int Game_Main(void *parms, int num_parms)
{
if (KEY_DOWN(VK_ESCAPE))
PostMessage(main_window_handle, WM_DESTROY,0,0);
DWORD nNow = GetTickCount();
DDraw_Fill_Surface(lpPBuf,0);
RECT rect,drect;
rect.left = 0;
rect.right = 140;
rect.top = 0;
rect.bottom = 140;
drect.left = 0 + nframe*50;
drect.right = 140 + nframe*50;
drect.top = 200;
drect.bottom = 200+140;
lpSBuf->Blt(&drect,lpOBuf[nframe],&rect,(DDBLT_WAIT | DDBLT_KEYSRC),NULL);
lpPBuf->Flip(NULL , DDFLIP_WAIT);
while((GetTickCount() - nNow) < 30);
nframe ++;
if (nframe > 7)
{
nframe = 0;
}
return(0);
}
void InitDD()
{
hr = DirectDrawCreateEx(NULL,(VOID**)&lpdd,IID_IDirectDraw7,NULL);
if ( DD_OK != hr)
{
MessageBox(main_window_handle,"Failed !","DirectDrawCreat",MB_OK);
return;
}
hr = lpdd->SetCooperativeLevel(main_window_handle,DDSCL_EXCLUSIVE |
DDSCL_FULLSCREEN|DDSCL_ALLOWREBOOT );
if (DD_OK != hr )
{
MessageBox(main_window_handle,"Failed !","SetCooperativeLevel",MB_OK);
return;
}
hr = lpdd->SetDisplayMode(800,600,16,0,0);
if (DD_OK != hr )
{
MessageBox(main_window_handle,"Failed !","SetDisplayMode",MB_OK);
return;
}
memset(&DDde,0,sizeof(DDde));
DDde.dwSize = sizeof(DDde);
DDde.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
DDde.dwBackBufferCount = 1;
DDde.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_COMPLEX | DDSCAPS_FLIP;
hr = lpdd->CreateSurface(&DDde,&lpPBuf,NULL);
if( DD_OK != hr)
{
MessageBox(main_window_handle,"Failed !","CreatePrimarySurface",MB_OK);
return;
}
DDcaps.dwCaps = DDSCAPS_BACKBUFFER;
hr = lpPBuf->GetAttachedSurface(&DDcaps,&lpSBuf);
if(hr !=DD_OK)
{
MessageBox(main_window_handle,"Failed !","CreateSecondSurface",MB_OK);
return;
}
memset(&DDde,0,sizeof(DDde));
DDde.dwSize = sizeof(DDde);
DDde.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH;
DDde.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN ;
}
void Load_Bitmap(int width, int height,char* filename,int nNum)
{
DDde.dwWidth = width;
DDde.dwHeight = height;
hr = lpdd->CreateSurface(&DDde, &lpOBuf[nNum], NULL);
if(hr !=DD_OK)
{
MessageBox(main_window_handle,"Failed !","CreateBackSurface",MB_OK);
return;
}
bitmap = (HBITMAP)::LoadImage(NULL,filename,IMAGE_BITMAP,width,height,LR_LOADFROMFILE);
if(bitmap==NULL)
{
MessageBox(main_window_handle,"Failed !","LoadImage",MB_OK);
return;
}
::SelectObject(hdc,bitmap);
lpOBuf[nNum]->GetDC( &dhdc );
::BitBlt( dhdc , 0 , 0 ,width,height, hdc , 0 , 0 , SRCCOPY );
lpOBuf[nNum]->ReleaseDC(dhdc);
colorkey.dwColorSpaceHighValue = _RGB16BIT565(0,255,0);
colorkey.dwColorSpaceLowValue = _RGB16BIT565(0,255,0);
lpOBuf[nNum]->SetColorKey(DDCKEY_SRCBLT,&colorkey);
}
int DDraw_Fill_Surface(LPDIRECTDRAWSURFACE7 lpdds, USHORT color, RECT *client)
{
DDBLTFX ddbltfx; // this contains the DDBLTFX structure
// clear out the structure and set the size field
DDRAW_INIT_STRUCT(ddbltfx);
// set the dwfillcolor field to the desired color
ddbltfx.dwFillColor = color;
// ready to blt to surface
lpdds->Blt(client, // ptr to dest rectangle
NULL, // ptr to source surface, NA
NULL, // ptr to source rectangle, NA
DDBLT_COLORFILL | DDBLT_WAIT, // fill and wait
&ddbltfx); // ptr to DDBLTFX structure
// return success
return(1);
} // end DDraw_Fill_Surface