#pragma once
#include "headers.h"
#include "Game.h"
HWND g_hWnd; //定义窗体句柄
ULONG_PTR g_GdiplusToken; //GDI+使用标志
Graphics * g_pGraphics; //画图对象指针
Bitmap * g_pBuff; //缓冲区位图
Graphics * g_pBuffGraphics; //缓冲区画图对象指针
CGame * spots;
POINTS zj;
int Game_Init() //游戏资源的初始化
{
//初始化GDI+图形库
GdiplusStartupInput gdiplusStartupInput;
GdiplusStartup(&g_GdiplusToken, &gdiplusStartupInput, NULL);
g_pGraphics = new Graphics(GetDC(g_hWnd));
if (g_pGraphics == NULL)
return 0;
g_pBuff = new Bitmap(1000,600);
g_pBuffGraphics = Graphics::FromImage(g_pBuff);
if (g_pBuffGraphics == NULL)
return 0;
spots = new CGame(g_pBuffGraphics,g_hWnd);
return 1;
}
void Game_Main() //游戏画图
{
spots->OnPaint();
//取得客户端画图区域大小
RECT clientRect;
GetClientRect(g_hWnd,&clientRect);
//画缓冲
g_pGraphics->DrawImage(g_pBuff,
Rect(clientRect.left,clientRect.top,clientRect.right,clientRect.bottom),
0,0,g_pBuff->GetWidth(),g_pBuff->GetHeight(),
UnitPixel);
}
void Game_Shutdown() //释放游戏资源
{
//释放GDI+图形库
delete g_pGraphics;
GdiplusShutdown(g_GdiplusToken);
}
//自定义窗体的消息处理函数
LRESULT CALLBACK //回调函数 (自动调用的函数)
WinProc(HWND hWnd, //窗体的句柄
UINT message, //消息的类型
WPARAM wParam ,LPARAM lParam //消息的参数
)
{
switch(message)
{
case WM_DESTROY: //窗体关闭
//KillTimer(hWnd,IDTIMER);
PostQuitMessage(0); //程序结束
break;
case WM_CREATE:
//SetTimer(hWnd, IDTIMER, 50, NULL);
break;
case WM_TIMER:
break;
case WM_KEYDOWN:
break;
case WM_KEYUP:
break;
case WM_LBUTTONDOWN:
//定义个PHINTS类型的变量pt,保存鼠标x,y值
zj = MAKEPOINTS(lParam);//MAKEPOINTS获取鼠标X Y值,保存到pt中
spots->Mouse(zj);
break;
}
return DefWindowProc(hWnd,message,wParam,lParam);
}
int WINAPI WinMain(HINSTANCE hinstance,
HINSTANCE hprevinstance,
LPSTR lpcmdline,
int ncmdshow)
{
WNDCLASS wc; //定义窗口信息的结构体
//初始化窗体信息的结构
wc.cbClsExtra = 0; //附加内存空间
wc.cbWndExtra = 0; //附加内存空间
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); //背景刷
wc.hCursor = LoadCursorFromFile("资源/cursor/normal.ani");//设置窗口鼠标的形状
wc.hIcon = LoadIcon(hinstance,MAKEINTRESOURCE(IDI_GAMEICON));//窗口的图标
wc.hInstance = hinstance; //窗口的实例化句柄
wc.lpfnWndProc = WinProc; //自定义的消息处理函数
wc.lpszClassName = "mywindow"; //窗口名称(它的名称必须和下面的窗口类名一模一样)
wc.lpszMenuName = NULL; //窗口菜单
wc.style = CS_HREDRAW | CS_VREDRAW ; //支持水平和垂直重绘
RegisterClass(&wc); //注册窗口
int posx, posy;
posx = (GetSystemMetrics(SM_CXSCREEN)-1000)/2; //屏幕宽度
posy = (GetSystemMetrics(SM_CYSCREEN)-600)/2; //屏幕高度
g_hWnd = CreateWindow(
"mywindow", //窗口类名必须和上面的窗体名称一模一样
"我的游戏", //窗口的标题
WS_OVERLAPPEDWINDOW, //窗口的风格, 可重叠窗口,但是不要最大化按钮
posx, //窗体左上角相对于屏幕的X坐标
posy, //窗体左上角相对于屏幕的Y坐标
800,600, //窗体的宽度和高度
NULL, //父窗口句柄
NULL, //窗口菜单句柄
hinstance, //实例句柄
NULL); //附加信息
ShowWindow(g_hWnd, SW_SHOWNORMAL); //正常显示窗口
if (Game_Init() == 0)
{
MessageBox(NULL,"游戏初始化失败","错误",MB_OK);
return 0;
}
MSG msg; //定义一个消息的对象
HACCEL hAcce = LoadAccelerators(hinstance, MAKEINTRESOURCE(IDR_ACCELERATOR1));
//进入消息循环
while(true)
{
if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
//接收系统信息(&msg为MSG类型的信息结构体,NULL是窗口句柄,
//0,是表示接受所有窗口的消息)
{
if(!TranslateAccelerator(g_hWnd, hAcce, &msg))
{
//遇到程序结束的消息,退出循环
if(msg.message == WM_QUIT)
break;
TranslateMessage(&msg);
//把键盘等码转换为系统识别的虚拟键码信息
DispatchMessage(&msg);
// 转到消息的回调函数处理消息
}
}
else
Sleep(10);
Game_Main();//画一帧
}
Game_Shutdown();
}
评论0