📄 gamewnd.cpp
字号:
// GameWnd.cpp: implementation of the CGameWnd class.
//
/**///////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "GameWnd.h"
#include "resource.h"
#include "commctrl.h"
//----------------------------------------------------------------
//Macro define
#define WND_CLASS TEXT("Evade_Class")
#define WND_TITLE TEXT("Evade_Title")
//The ID for the command bar
#define ID_COMMANDBAR 100
//Screen width
#define SCREEN_WIDTH GetSystemMetrics(SM_CXSCREEN)
//Screen height
#define SCREEN_HEIGHT GetSystemMetrics(SM_CYSCREEN)
//The window position
#define MAINWND_POS_X 0
#define MAINWND_POS_Y 24
//Level training
#define LEVEL0_BULLET_COUNT 50
#define LEVEL0_BULLET_MAXMOVEDISTANCE 2
#define LEVEL0_PLANE_MOVEDISTANCE 3
//Level_1 value
#define LEVEL1_BULLET_COUNT 100
#define LEVEL1_BULLET_MAXMOVEDISTANCE 3
#define LEVEL1_PLANE_MOVEDISTANCE 3
//Level_2 value
#define LEVEL2_BULLET_COUNT 150
#define LEVEL2_BULLET_MAXMOVEDISTANCE 4
#define LEVEL2_PLANE_MOVEDISTANCE 3
//Level_3 value
#define LEVEL3_BULLET_COUNT 200
#define LEVEL3_BULLET_MAXMOVEDISTANCE 5
#define LEVEL3_PLANE_MOVEDISTANCE 3
//Default value
#define DEFAULT_BULLET_COUNT LEVEL1_BULLET_COUNT
#define DEFAULT_BULLET_MAXMOVEDISTANCE LEVEL1_BULLET_MAXMOVEDISTANCE
#define DEFAULT_PLANE_MOVEDISTANCE LEVEL1_PLANE_MOVEDISTANCE
#define DEFAULT_REFRESH_INTERVAL 50 //0.05s
#define DEFAULT_TEXT_TIME_COLOR RGB(0,0,255)
#define DEFAULT_TEXT_TIME_HEIGHT 16
//The offset of the time text
#define TXT_TIME_OFFSET_TOP 2
#define TXT_TIME_OFFSET_LEFT (SCREEN_WIDTH - 100)
#define TXT_TIME_OFFSET_RIGHT 4
#define TXT_TIME_HEIGHT 40
//-----------------------------------------------------------------
//Initialize
CGameWnd *CGameWnd::m_pInstance = NULL;
/**///////////////////////////////////////////////////////////////////////
// Construction/Destruction
/**///////////////////////////////////////////////////////////////////////
CGameWnd::CGameWnd()
{
m_hWndCB = NULL;
m_bMovePlane = FALSE;
m_bCollide = FALSE;
m_hInst = NULL;
m_hWnd = NULL;
memset(&m_rcWndPlay,0,sizeof(m_rcWndPlay));
memset(&m_ptPlaneSkewing,0,sizeof(m_ptPlaneSkewing));
memset(&m_KeyStatus,0,sizeof(m_KeyStatus));
memset(&m_rcWndMain,0,sizeof(m_rcWndMain));
m_Setting.iBulletCount = DEFAULT_BULLET_COUNT;
m_Setting.iBulletMaxMoveDistance = DEFAULT_BULLET_MAXMOVEDISTANCE;
m_Setting.iRefreshInterval = DEFAULT_REFRESH_INTERVAL;
m_Setting.iPlaneMoveDistance = DEFAULT_PLANE_MOVEDISTANCE;
m_TxtTime.SetTextColor(DEFAULT_TEXT_TIME_COLOR);
m_TxtTime.SetTextHeight(DEFAULT_TEXT_TIME_HEIGHT);
m_TxtTime.SetFormat(DT_RIGHT | DT_VCENTER);
}
CGameWnd::~CGameWnd()
{
if(m_pInstance != NULL)
{
delete m_pInstance;
m_pInstance = NULL;
}
}
//----------------------------------------------------------------
//Description:
// Get the object instance
//-----------------------------------------------------------------
CGameWnd * CGameWnd::GetInstance()
{
if(m_pInstance == NULL)
{
m_pInstance = new CGameWnd();
}
return m_pInstance;
}
//----------------------------------------------------------------
//Description:
// Initialize the window
//-----------------------------------------------------------------
BOOL CGameWnd::Initialize(HINSTANCE hInst)
{
m_hInst = hInst;
WNDCLASS ws;
memset(&ws,0,sizeof(ws));
ws.lpfnWndProc = WndProc;
ws.hInstance = hInst;
ws.lpszClassName = WND_CLASS;
ws.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
if(RegisterClass(&ws) == FALSE)
{
return FALSE;
}
//Find the task bar
HWND hWndTaskBar = FindWindow(TEXT("HHTaskBar"), NULL);
// RECT rcTaskBar = {0};
// GetWindowRect(hWndTaskBar,&rcTaskBar);
m_rcWndMain.left = MAINWND_POS_X;
m_rcWndMain.top = MAINWND_POS_Y;
m_rcWndMain.right = SCREEN_WIDTH;
m_rcWndMain.bottom = SCREEN_HEIGHT - MAINWND_POS_Y;
m_hWnd = CreateWindow(
WND_CLASS,
WND_TITLE,
WS_POPUP ,
m_rcWndMain.left,
m_rcWndMain.top,
m_rcWndMain.right - m_rcWndMain.left ,
m_rcWndMain.bottom/* - m_rcWndMain.top*/,
NULL,
NULL,
hInst,
NULL
);
if(IsWindow(m_hWnd)==FALSE)
{
return FALSE;
}
RECT rcCmdBar = {0};
GetWindowRect(m_hWndCB,&rcCmdBar);
m_rcWndPlay.left = m_rcWndMain.left;
m_rcWndPlay.right = m_rcWndMain.right;
m_rcWndPlay.top = /*m_rcWndMain.top + */(rcCmdBar.bottom - rcCmdBar.top);
m_rcWndPlay.bottom = m_rcWndMain.bottom;
RECT rcTxtTime;
rcTxtTime.top = m_rcWndPlay.top + TXT_TIME_OFFSET_TOP;
rcTxtTime.left = /*m_rcWndPlay.left + */TXT_TIME_OFFSET_LEFT;
rcTxtTime.right = m_rcWndPlay.right - TXT_TIME_OFFSET_RIGHT;
rcTxtTime.bottom = rcTxtTime.top + TXT_TIME_HEIGHT;
m_TxtTime.SetPosition(&rcTxtTime);
CheckMenu();
return TRUE;
}
//----------------------------------------------------------------
//Description:
// The window process
//-----------------------------------------------------------------
LRESULT CGameWnd::WndProc(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam)
{
switch(wMsg)
{
case WM_DESTROY:
m_pInstance->OnDestroy(hWnd,wMsg,wParam,lParam);
return 0;
case WM_PAINT:
m_pInstance->OnPaint(hWnd,wMsg,wParam,lParam);
return 0;
case WM_ERASEBKGND:
//Needn't to redraw the background
return 0;
case WM_MOUSEMOVE:
m_pInstance->OnMouseMove(hWnd,wMsg,wParam,lParam);
return 0;
case WM_LBUTTONDOWN:
m_pInstance->OnLButtonDown(hWnd,wMsg,wParam,lParam);
return 0;
case WM_LBUTTONUP:
m_pInstance->OnLButtonUp(hWnd,wMsg,wParam,lParam);
return 0;
case WM_KEYDOWN:
m_pInstance->OnKeyDown(hWnd,wMsg,wParam,lParam);
return 0;
case WM_KEYUP:
m_pInstance->OnKeyUp(hWnd,wMsg,wParam,lParam);
return 0;
case WM_CREATE:
m_pInstance->OnCreate(hWnd,wMsg,wParam,lParam);
return 0;
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDM_TRAINING:
m_pInstance->OnMenuLevel(IDM_TRAINING);
break;
case IDM_LEVEL_1:
m_pInstance->OnMenuLevel(IDM_LEVEL_1);
return 0;
case IDM_LEVEL_2:
m_pInstance->OnMenuLevel(IDM_LEVEL_2);
return 0;
case IDM_LEVEL_3:
m_pInstance->OnMenuLevel(IDM_LEVEL_3);
return 0;
case IDM_START:
m_pInstance->StartGame();
return 0;
case IDM_FINISH:
m_pInstance->EndGame();
break;
case IDM_EXIT:
DestroyWindow(hWnd);
return 0;
}
break;
}
return DefWindowProc(hWnd,wMsg,wParam,lParam);
}
//----------------------------------------------------------------
//Description:
// Show the window
//-----------------------------------------------------------------
BOOL CGameWnd::ShowWindow(BOOL bShow)
{
if(m_hWnd == NULL)
{
return FALSE;
}
if(bShow == TRUE)
{
::ShowWindow(m_hWnd,SW_SHOW);
}
else
{
::ShowWindow(m_hWnd,SW_HIDE);
}
return TRUE;
}
//----------------------------------------------------------------
//Description:
// On message WM_DESTROY
//-----------------------------------------------------------------
void CGameWnd::OnDestroy(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam)
{
PostQuitMessage(0x00);
}
//----------------------------------------------------------------
//Description:
// On message WM_PAINT
//-----------------------------------------------------------------
void CGameWnd::OnPaint(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd,&ps);
//Create the memory DC
HBITMAP hBitmap = CreateCompatibleBitmap(hdc,m_rcWndMain.right - m_rcWndMain.left,m_rcWndMain.bottom/* - m_rcWndMain.top*/);
HDC hdcMem = CreateCompatibleDC(hdc);
HGDIOBJ hOldSel = SelectObject(hdcMem,hBitmap);
Rectangle(hdcMem,m_rcWndMain.left,0/*m_rcWndMain.top*/,m_rcWndMain.right,m_rcWndMain.bottom);
m_Bullets.Draw(hdcMem);
if(m_bCollide == FALSE)
{
m_Plane.DrawNormal(hdcMem);
}
else
{
m_Plane.DrawDestroy(hdcMem);
}
m_TxtTime.Draw(hdcMem);
BitBlt(hdc,
m_rcWndMain.left,
0/*m_rcWndMain.top*/,
m_rcWndMain.right - m_rcWndMain.left,
m_rcWndMain.bottom/* - m_rcWndMain.top*/,
hdcMem,
0,
0,
SRCCOPY);
SelectObject(hdcMem,hOldSel);
DeleteObject(hBitmap);
DeleteDC(hdcMem);
EndPaint(hWnd,&ps);
}
//----------------------------------------------------------------
//Description:
// Start the game
//-----------------------------------------------------------------
void CGameWnd::StartGame()
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -