.h
#pragma once
#ifndef _GAMEAPP_H_
#define _GAMEAPP_H_
#include <windows.h>
#define DECLARE(ThisClass) \
CGameApp* CreateObject()\
{\
return new ThisClass;\
}
class CGameApp
{
protected:
HINSTANCE m_hIns;
HWND m_hMainWnd;
public:
CGameApp()
{
m_hIns = 0;
m_hMainWnd = 0;
}
virtual ~CGameApp()
{
}
public:
void SetHandle(HINSTANCE hIns,HWND hwnd)
{
m_hIns = hIns;
m_hMainWnd = hwnd;
}
public:
virtual void OnCreateGame(){} // WM_CREATE
virtual void OnGameDraw(){} // WM_PAINT
virtual void OnGameRun(WPARAM nTimerID){} // WM_TIMER
virtual void OnKeyDown(WPARAM nKey){} // WM_KEYDOWN
virtual void OnKeyUp(WPARAM nKey){} // WM_KEYUP
virtual void OnLButtonDown(POINT point){} // WM_LBUTTONDOWN
virtual void OnLButtonUp(POINT point){} // WM_LBUTTONUP
virtual void OnMouseMove(POINT point){} // WM_MOUSEMOVE
};
#endif//_GAMEAPP_H_
,cpp
#include <windows.h>
#include "GameApp.h"
#include <time.h>
LRESULT CALLBACK WindowProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam);
HINSTANCE hIns = 0;
int CALLBACK WinMain(HINSTANCE hInstance,HINSTANCE hPreInstance,LPSTR lpCmdLine,int nShowCmd)
{
srand((unsigned int)time(0));
//-----------------------------------------------------
HWND hwnd = 0;
MSG msg; // 装消息的结构体
WNDCLASSEX wndclass; //创建窗口的结构体
//-----------------------------------------------------
hIns = hInstance;
//----------------------创建窗口过程-----------------------------------
// 1. 设计
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.cbSize = sizeof(wndclass);
wndclass.hbrBackground = (HBRUSH)COLOR_WINDOW;
wndclass.hCursor = LoadCursor(0,MAKEINTRESOURCE(IDC_ARROW));
wndclass.hIcon = 0;
wndclass.hIconSm = 0;
wndclass.hInstance = hInstance;
wndclass.lpfnWndProc = WindowProc;
wndclass.lpszClassName = "lele";
wndclass.lpszMenuName = 0;
wndclass.style = CS_HREDRAW|CS_VREDRAW;
// 2. 注册
if(RegisterClassEx(&wndclass) == FALSE)
{
MessageBox(0,"注册失败","提示",MB_OK);
return 0;
}
// 3. 创建
hwnd = CreateWindow("lele","O(∩_∩)O哈哈~",WS_OVERLAPPEDWINDOW,0,0,500,500,0,0,hInstance,0);
if(hwnd == 0)
{
MessageBox(0,"创建失败","提示",MB_OK);
return 0;
}
// 4. 显示窗口
ShowWindow(hwnd,SW_SHOW);
//---------------------------创建窗口过程------------------------------------------------
//----------------------------消息循环-------------------------------------------
while(GetMessage(&msg,0,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
//----------------------------消息循环-------------------------------------------
return 0;
}
//=================================处理消息========================================================
CGameApp* pApp = 0;
CGameApp* CreateObject();
LRESULT CALLBACK WindowProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
switch (uMsg)
{
case WM_CREATE:
{
// 创建一个游戏的对象
pApp = CreateObject();
if(pApp != 0)
{
// 设置句柄
pApp->SetHandle(hIns,hwnd);
// 初始化,创建游戏
pApp->OnCreateGame();
}
}
break;
case WM_PAINT:
{
if(pApp != 0)
{
// 显示游戏
pApp->OnGameDraw();
}
}
break;
case WM_TIMER:
{
if(pApp != 0)
{
// 游戏运行
pApp->OnGameRun(wParam);
}
}
break;
case WM_KEYDOWN:
{
if(pApp != 0)
{
pApp->OnKeyDown(wParam);
}
}
break;
case WM_KEYUP:
{
if(pApp != 0)
{
pApp->OnKeyUp(wParam);
}
}
break;
case WM_LBUTTONDOWN:
{
if(pApp != 0)
{
POINT point;
point.x = LOWORD(lParam);
point.y = HIWORD(lParam);
pApp->OnLButtonDown(point);
}
}
break;
case WM_LBUTTONUP:
{
if(pApp != 0)
{
POINT point;
point.x = LOWORD(lParam);
point.y = HIWORD(lParam);
pApp->OnLButtonUp(point);
}
}
break;
case WM_MOUSEMOVE:
{
if(pApp != 0)
{
POINT point;
point.x = LOWORD(lParam);
point.y = HIWORD(lParam);
pApp->OnMouseMove(point);
}
}
break;
case WM_CLOSE:
{
// 删除游戏
delete pApp;
pApp = 0;
PostQuitMessage(0);
}
break;
}
return DefWindowProc( hwnd, uMsg, wParam, lParam);
}
我们要学会使用游戏壳,来实现其复用性。也就是继承游戏壳。
PlaneApp.h
#pragma once
#include "gameapp.h"
class CPlaneApp :
public CGameApp
{
public:
CPlaneApp(void);
~CPlaneApp(void);
public:
virtual void OnLButtonDown(POINT point)
{
::MessageBox(0,"asd","asd",MB_OK);
}
};
PlaneApp.cpp
#include "PlaneApp.h"
DECLARE(CPlaneApp)
CPlaneApp::CPlaneApp(void)
{
}
CPlaneApp::~CPlaneApp(void)
{
}