#define STARTPAGE 0
#include <windows.h>
#include <tchar.h>
//オブジェクト形式マクロ
#define SCR_WIDTH 800 //スクリーンの幅
#define SCR_HEIGHT 600 //スクリーンの高さ
#define FULL_SCREEN FALSE //フルスクリーンにするかどうか(TRUEならフル FALSEならNOTフル)
#define WND_NAME TEXT("GAME")//アプリケーションの名前
#define CLASS_NAME TEXT("ROOM") //ウィンドウクラスの名前
int show_no =STARTPAGE;
typedef enum tagEnumBitmap
{
E_TITLE,
E_BAKUDAN,
E_MAX
}enumBitmap;
//--------------------------------------------------
// name : WndManager
// brief : ウィンドウの状態を所持する構造体
//--------------------------------------------------
typedef struct tagWndManager
{
HWND hWnd; //ウィンドウハンドル
MSG msg; //メッセージ
WNDCLASS wc; //ウィンドウクラスを扱う構造
HINSTANCE hInstance;//インスタンスハンドル
INT nCmdShow;//ウィンドウ表示状態
} WndManager;
//------------------------------------------------------
// Important2010 (メモリデバイスコンテキストハンドルを追加)
// name : PaintManager
// brief : GDI描画の情報を所持する構造体
//-------------------------------------------------------
typedef struct tagPaintManager
{
HDC hdc; //デバイスコンテキストハンドル
HDC hMemDC; //メモリデバイスコンテキストハンドル
HDC hBuffer;
HDC hBufferDC;
HBITMAP hBufferBmp;
PAINTSTRUCT ps; //再描画の情報
HBRUSH hBrush; //論理ブラシ
} PaintManager;
typedef struct tagBitmapData
{
HBITMAP hBmp; //ビットマップのハンドル
BITMAP bmp; //ビットマップの情報を格納する構造体
int drawX; //描画するX座標
int drawY; //描画するY座標
} BitmapData;
//関数のプロトタイプ宣言
LRESULT CALLBACK WindowProc(HWND, UINT, WPARAM, LPARAM);
INT InitApp(WndManager*); //ウィンドウを生成する関数
void MessageLoop(WndManager*); //メッセージループ
void ChangeFullScreen(WndManager*); //フルスクリーンの設定
void DrawBitmapData(BitmapData bitmapData[], PaintManager *paintManager, int nXDest, int nYDest, int nWidth, int nHeight,
int nXSrc, int nYSrc, DWORD dwRop);
void DeleteBitmapData(BitmapData *pBitmapData);
//--------------------------------------------------------------------------------
// WinMain関数(_tWinMainとあるが、_tWinMainとWinMainはほぼ同じ関数)
//
// アプリケーションのエントリーポイント。ここからプログラムが開始される。
// 成功すれば0以外の値を返す。
//--------------------------------------------------------------------------------
int APIENTRY _tWinMain(HINSTANCE hInstance, //現在のインスタンスハンドル
HINSTANCE hPrevInstance, //以前のインスタンスハンドル
LPTSTR lpCmdLine, //コマンドライン引数
INT nCmdShow) //ウィンドウ表示状態
{
static WndManager wndmanager;
wndmanager.hInstance = hInstance;
wndmanager.nCmdShow = nCmdShow;
//ウィンドウの生成
if(InitApp(&wndmanager) == 0)
{
return 0;
}
//アプリケーションループ
MessageLoop(&wndmanager);
return (int)(wndmanager.msg.wParam);
}
//--------------------------------------------------------------------------------
// InitApp関数
//
// ウィンドウを生成する関数
// 成功すれば0以外の関数を返す
//--------------------------------------------------------------------------------
int InitApp(WndManager* pwndmanager)
{
//ウィンドウの幅.スクリーンの幅とは別
INT wndwidth = SCR_WIDTH
+ GetSystemMetrics(SM_CXFIXEDFRAME) * 2;
//ウィンドウの高さ
INT wndheight = SCR_HEIGHT + GetSystemMetrics(SM_CYFIXEDFRAME) * 2 +
GetSystemMetrics(SM_CYCAPTION);
//ウィンドウクラスの登録
pwndmanager->wc.style = CS_HREDRAW | CS_VREDRAW; //ウィンドウのスタイル
pwndmanager->wc.lpfnWndProc = WindowProc; //使用するプロシージャ
pwndmanager->wc.cbClsExtra = 0; //メモリ領域を確保する。通常0
pwndmanager->wc.cbWndExtra = 0; //ウィンドウオブジェクトが生成されるたびに確保される特別領域を指定。通常0
pwndmanager->wc.hInstance = pwndmanager->hInstance; //インスタンスハンドルを指定
pwndmanager->wc.hIcon = NULL; //アイコン NULLなら標準アイコンを表示
pwndmanager->wc.hCursor = LoadCursor(NULL,IDC_ARROW); //カーソル NULLなら現在のカーソルを表示
pwndmanager->wc.hbrBackground = (HBRUSH)(GetStockObject(WHITE_BRUSH)); //背景
pwndmanager->wc.lpszMenuName = NULL; //メニュー名
pwndmanager->wc.lpszClassName = CLASS_NAME; //ウィンドウクラスの名前
if(RegisterClass(&pwndmanager->wc)==0)
{
return 0;
}
//登録したクラスのウィンドウを生成
pwndmanager->hWnd = CreateWindowEx(
0, //拡張ウィンドウスタイル
CLASS_NAME, //登録されているクラス名
WND_NAME, //ウィンドウに表示される名前
WS_OVERLAPPEDWINDOW ^ WS_THICKFRAME ^ WS_MAXIMIZEBOX,//ウィンドウスタイル
CW_USEDEFAULT, //ウィンドウの表示位置(横)
CW_USEDEFAULT, //ウィンドウの表示位置(縦)
CW_USEDEFAULT, //ウィンドウの幅
CW_USEDEFAULT, //ウィンドウの高さ
0, //親ウィンドウのハンドル
0, //子ウィンドウのハンドル
pwndmanager->hInstance, //インスタンスハンドル
0); //ウィンドウ生成パラメータ.WM_CREATEメッセージのLPARAMに渡される
//ウィンドウをフルスクリーンに
ChangeFullScreen(pwndmanager);
//ウィンドウの表示位置の変更
//画面の中央にくるように
INT posX = GetSystemMetrics(SM_CXSCREEN) / 2 - wndwidth / 2;
INT posY = GetSystemMetrics(SM_CYSCREEN) / 2 - wndheight / 2;
SetWindowPos(pwndmanager->hWnd, HWND_TOP, posX, posY, wndwidth, wndheight, 0);
//ウィンドウの表示状態の設定
ShowWindow(pwndmanager->hWnd, pwndmanager->nCmdShow);
//ウィンドウの更新
UpdateWindow(pwndmanager->hWnd);
return 1;
}
//--------------------------------------------------------------------------------
// MessageLoop関数
//
// メッセージループ
//--------------------------------------------------------------------------------
void MessageLoop(WndManager* pwndmanager)
{
//アプリケーションループ
while(GetMessage(&pwndmanager->msg, NULL, 0, 0))//メッセージが発生したらループさせる
{
TranslateMessage(&pwndmanager->msg);//WM_KEYDOWNメッセージか、WM_KEYUPメッセージををWM_CHARメッセージに変換
DispatchMessage(&pwndmanager->msg);//ウィンドウプロシージャへメッセージを送る
}
}
void ChangeFullScreen(WndManager* pwndmanager)
{
if(FULL_SCREEN)
{
DEVMODE devmode;
LONG lresult;
devmode.dmSize = sizeof(devmode);
devmode.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT;
devmode.dmPelsWidth = SCR_WIDTH;
devmode.dmPelsHeight = SCR_HEIGHT;
lresult = ChangeDisplaySettings(&devmode, CDS_FULLSCREEN);
//カーソルを非表示にする
ShowCursor(FALSE);
if(lresult != DISP_CHANGE_SUCCESSFUL)
{
//失敗したとき
ShowCursor(TRUE);
MessageBox(NULL, TEXT("フルスクリーンの設定変更に失敗しました"), NULL, MB_OK);
}
}
}
LRESULT CALLBACK WindowProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
//オブジェクトの生成
static PaintManager paintManager;
static BitmapData bitmapData[E_MAX];
switch(msg)
{
case WM_CREATE:
paintManager.hdc=GetDC(hWnd);
paintManager.hBufferBmp = CreateCompatibleBitmap(paintManager.hdc,SCR_WIDTH,SCR_HEIGHT);
paintManager.hBufferDC=CreateCompatibleDC(paintManager.hdc);
SelectObject(paintManager.hBufferDC,paintManager.hBufferBmp);
paintManager.hMemDC = CreateCompatibleDC(NULL);
bitmapData[E_TITLE].hBmp=(HBITMAP)LoadImage(NULL,TEXT("title.bmp"),IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
bitmapData[E_BAKUDAN].hBmp=(HBITMAP)LoadImage(NULL,TEXT("bakudan.bmp"),IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
for(INT i=0;i<E_MAX;i++)
{
GetObject(bitmapData[i].hBmp,sizeof(BITMAP),&bitmapData[i].bmp);
}
break;
case WM_CLOSE:
DestroyWindow(hWnd);
break;
case WM_DESTROY:
DeleteDC(paintManager.hMemDC);
DeleteObject(paintManager.hBufferBmp);
DeleteDC(paintManager.hBufferDC);
for(INT i=0;i<E_MAX;i++){DeleteObject(bitmapData[i].hBmp);}
PostQuitMessage(0);
break;
break;
case WM_PAINT:
paintManager.hdc=BeginPaint(hWnd,&paintManager.ps);
//---------
if(show_no==STARTPAGE){
//関数化する↓↓
//SelectObject(paintManager.hMemDC,bitmapData[E_TITLE].hBmp);
//BitBlt(paintManager.hBufferDC,22,10,SCR_WIDTH,SCR_HEIGHT,paintManager.hMemDC,0,0,SRCCOPY);
//↑↑
DrawBitmapData(bitmapData[E_TITLE],&paintManager, 720,320, SCR_WIDTH,
SCR_HEIGHT, 0, 0, SRCCOPY);
}
BitBlt(paintManager.hdc,0,0,SCR_WIDTH,SCR_HEIGHT,paintManager.hBufferDC,0,0,SRCCOPY);
EndPaint(hWnd,&paintManager.ps);
break;//WM_PAINT_break
default:
return DefWindowProc(hWnd, msg, wParam, lParam);
}
return 0;
}
///**
//*@brief ビットマップデータの破棄
//*@return
//*@param pBitmapData ビットマップデータ
//*/
//void DeleteBitmapData(BitmapData *pBitmapData)
//{
// DeleteObject(pBitmapData->hBmp);
//}
void DrawBitmapData(BitmapData bitmapData[], PaintManager *paintManager, int nXDest, int nYDest, int nWidth, int nHeight,
int nXSrc, int nYSrc, DWORD dwRop)
{
SelectObject(paintManager->hMemDC, bitmapData[].hBmp);
BitBlt(paintManager->hdc, nXDest, nYDest, nWidth, nHeight, paintManager->hMemDC, nXSrc, nYSrc, dwRop);
}