[ create a new paste ] login | about

Link: http://codepad.org/l5ekYt1G    [ raw code | output | fork ]

C++, pasted on Jul 18:
#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);
}


Output:
1
2
3
4
Line 20: error: windows.h: No such file or directory
Line 18: error: tchar.h: No such file or directory
Line 28: error: 'HWND' does not name a type
compilation terminated due to -Wfatal-errors.


Create a new paste based on this one


Comments: