📄 q11evc.cpp
字号:
/*==============================================================================
文件: Q11Evc.cpp
说明:WINCE下小游戏习作,仅博一笑而已,此CPP适应于通用WIN32/WINCE的主窗口建立。
时间:2003-12-06
编写:oshj || oshj@21cn.com
环境:EVC3.0 or Win2000 Pro/SP4/1024*768分辨率
特别说明:涉及的代码是针对WINCE3.0(PPC2002)平台,同时兼顾了WIN32平台; 旨在
讨论编写同时适应2种平台的通用代码;就我现有掌握的资料来看,WINCE平台
并不支持DirectX,而WINCE的GAPI又不适合WIN32平台,且无法在模拟器下进行
调试(我对GAPI也是一无所知^_^),所以采用了最原始的BitBlt贴图和离屏
方式,贴图效果比较粗糙。对声音的处理也比较幼稚,希望不会误导初学者。
游戏算法和图片部分参考了王正盛的A10攻击机和Kylinx的kplan代码,在此对
两位作者公布源代码的无私行为表示感谢!
==============================================================================*/
////////////////////////////////////////////////////////////////////////////////
//------------------------------------------------------------------------------
#include "stdafx.h"
#include "Game.h"
//------------------------------------------------------------------------------
#define WindowClass TEXT("WINCE游戏") //窗口类名
#define WindowTitle TEXT("Q11战斗机") //窗口标题
#define MENU_HEIGHT 26 //CE下的菜单条高度
//------------------------------------------------------------------------------
//仅做调试之用!正式时不能有Msg,否则可能陷入死循环
#define Msg(str) MessageBox(GetActiveWindow(),TEXT(str),TEXT("Info"),\
MB_OK|MB_ICONINFORMATION);
HINSTANCE g_hInst; // The current instance
HWND g_hwndCB; // The command bar handle
HWND hWnd; //主窗口句柄
HWND hWndDlgSet; //设置窗口句柄
TCHAR tcAppExePath[MAX_PATH]={'\0'}; //exe文件路径
TCHAR iniFile[256]={'\0'}; //ini文件
BOOL bActive = TRUE;
#if _WIN32_WCE
static SHACTIVATEINFO s_sai;
#endif
//------------------------------------------------------------------------------
CGame *game;
//------------------------------------------------------------------------------
//初始化窗口
BOOL InitWindow(HINSTANCE hInstance,int nCmdShow);
//主窗口回调函数
LRESULT CALLBACK MainProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam);
//设置窗口回调函数
LRESULT CALLBACK SetProc(HWND hWndSet,UINT message,WPARAM wParam,LPARAM lParam);
//关于窗口回调函数
LRESULT CALLBACK About(HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam);
//使一个窗口相对于另外一个窗口居中,并不一定要父子关系
void CenterWindow(HWND hWndChild, HWND hWndParent);
//创建菜单条
HWND CreateRpCommandBar(HWND);
//释放资源
void FreeAll(void);
//读配置文件
void IniRead();
//写配置文件
void IniWrite();
//设置缺省操作键
void KeyDefault();
//键值检测,是否重复
BOOL KeyCheck();
//------------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////
//------------------------------------------------------------------------------
//main
int WINAPI WinMain( HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
MSG msg;
//初始化主窗口
if(FALSE == InitWindow(hInstance,nCmdShow) )
return FALSE;
DWORD dLenth;
TCHAR tcAppFullPath[MAX_PATH];
dLenth = GetModuleFileName(NULL,tcAppFullPath,MAX_PATH);
//获得EXE文件的路径
#if _WIN32_WCE
wcsncpy(tcAppExePath,tcAppFullPath,dLenth-10); // Q11Evc.exe
#else
wcsncpy(tcAppExePath,tcAppFullPath,dLenth-9); // Q11PC.exe
#endif
//配置文件
wcscpy(iniFile,tcAppExePath);
wcscat(iniFile,TEXT("Q11\\Set.dat"));
//可能首次使用
HANDLE hf = CreateFile(iniFile, GENERIC_READ, FILE_SHARE_WRITE|FILE_SHARE_READ, NULL,
OPEN_EXISTING, 0, NULL);
if (hf == INVALID_HANDLE_VALUE)
DialogBox(g_hInst,MAKEINTRESOURCE(IDD_DIALOG_SETTING),hWnd,(DLGPROC)SetProc);
CloseHandle(hf);
//初始化游戏
game = new CGame;
game->InitGame();
for(;;)
{
if(PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
{
if(!GetMessage(&msg, NULL, 0, 0 ))
return msg.wParam;
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else if(bActive)
{
//场景更换
#if _WIN32_WCE
game->UpdateFrame();
#else
//画面延时,PC下速度有点太快了
static int NewCount, OldCount=0;
NewCount=GetTickCount();
if (NewCount > OldCount+12)
{
OldCount=NewCount;
game->UpdateFrame();//更新画面
}
#endif
}
}
}
//------------------------------------------------------------------------------
//创建主窗口。
BOOL InitWindow( HINSTANCE hInstance, int nCmdShow )
{
WNDCLASS wc;
DWORD dwStyle;
g_hInst = hInstance;
//填充窗口类结构
wc.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS ;
wc.lpfnWndProc = (WNDPROC)MainProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
#if _WIN32_WCE
wc.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDR_MENU_MAIN));
wc.lpszMenuName = 0;
dwStyle = WS_VISIBLE;
#else
wc.lpszMenuName = MAKEINTRESOURCE(IDR_MENU_MAIN);
wc.hIcon = LoadIcon(hInstance, IDC_ICON);
wc.hCursor = LoadCursor( NULL, IDC_ARROW );
dwStyle = WS_OVERLAPPEDWINDOW;
#endif
wc.lpszClassName =(LPCTSTR)WindowClass;
//注册窗口类
RegisterClass(&wc);
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
//查找实例是否已经启动,是则载入前台
//这个是根据WINCE例子来的,WIN32程序中我习惯用下面两句
//::SetForegroundWindow(hWnd);
//::SetActiveWindow(hWnd);
//If it is already running, then focus on the window
hWnd = FindWindow((LPCTSTR)WindowClass, (LPCTSTR)WindowTitle);
if (hWnd)
{
// set focus to foremost child window
// The "| 0x01" is used to bring any owned windows to the foreground and
// activate them.
SetForegroundWindow((HWND)((ULONG) hWnd | 0x00000001));
return 0;
}
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
//创建窗口
RECT rect;
GetClientRect(hWnd, &rect);
hWnd = CreateWindow((LPCTSTR)WindowClass,
(LPCTSTR)WindowTitle,
dwStyle,
(GetSystemMetrics(SM_CXSCREEN)-ScreenW)/2,
(GetSystemMetrics(SM_CYSCREEN)-ScreenH)/2,
ScreenW,
ScreenH,
NULL,
NULL,
hInstance,
NULL);
if (!hWnd) return FALSE;
//这个也是WINCE例子生成的
#if _WIN32_WCE
RECT rc;
GetWindowRect(hWnd, &rc);
rc.bottom -= MENU_HEIGHT;
if (g_hwndCB)
MoveWindow(hWnd, rc.left, rc.top, rc.right, rc.bottom, FALSE);
#endif
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
return TRUE;
}
//------------------------------------------------------------------------------
//主窗口回调函数
LRESULT CALLBACK MainProc( HWND hWnd, UINT message,
WPARAM wParam, LPARAM lParam )
{
switch( message )
{
case WM_CREATE:
#if _WIN32_WCE
g_hwndCB = CreateRpCommandBar(hWnd);
memset (&s_sai, 0, sizeof (s_sai));
s_sai.cbSize = sizeof (s_sai);
#endif
break;
case WM_ACTIVATE:
bActive = wParam;
break;
case WM_LBUTTONDOWN:
game->StartGame();
break;
//双击屏幕放雷?是否合适?没有其他消息适合呢
case WM_LBUTTONDBLCLK:
game->FlashScreen();
break;
case WM_MOUSEMOVE:
//鼠标拖拉,左键是否按下
if(wParam == MK_LBUTTON)
{
//定位pos为飞机中点
game->pos.x = LOWORD(lParam) - 25; //飞机图片一半宽度
game->pos.y = HIWORD(lParam) - 30; //飞机图片一半高度
}
break;
case WM_KEYDOWN://击键消息
switch(LOWORD(wParam))
{
case VK_ESCAPE://退出
if(MessageBox(hWnd,TEXT("退出游戏?"),TEXT("EXIT"),MB_YESNO)==IDYES)
{
FreeAll();
PostQuitMessage( 0 );
}
break;
case VK_RETURN:
game->StartGame();
break;
case VK_ADD ://加速
game->movespeed++;
break;
case VK_SUBTRACT ://减速
game->movespeed--;
if (game->movespeed < 1)
game->movespeed=1;
break;
}
break;
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDM_GAME_START:
game->InitGame();
break;
case IDM_GAME_SET:
//游戏设置
DialogBox(g_hInst,MAKEINTRESOURCE(IDD_DIALOG_SETTING),hWnd,(DLGPROC)SetProc);
break;
case IDM_GAME_EXIT:
if(MessageBox(hWnd,TEXT("退出游戏?"),TEXT("EXIT"),MB_YESNO)==IDYES)
{
FreeAll();
PostQuitMessage(0);
}
break;
case IDM_ABOUT:
DialogBox(g_hInst,(LPCTSTR)(IDD_DIALOG_ABOUT),hWnd,(DLGPROC)About);
break;
}
break;
case WM_DESTROY:
FreeAll();
PostQuitMessage(0);
break;
}
//调用缺省消息处理过程
return DefWindowProc(hWnd, message, wParam, lParam);
}
//------------------------------------------------------------------------------
//设置窗口回调函数
LRESULT CALLBACK SetProc(HWND hWndSet,UINT message,WPARAM wParam,LPARAM lParam)
{
HWND hWndFocus=NULL;
HDC hDC=NULL;
POINT p;
RECT rc,rcDlg;
int a,i;
int vKey = -1;
TCHAR str[256] = {'\0'};
TCHAR strInput[256] = {'\0'};
BOOL bPress=FALSE;
switch (message)
{
case WM_INITDIALOG:
CenterWindow(hWndSet,hWnd);
hWndDlgSet = hWndSet;
#if _WIN32_WCE
hWndFocus = GetDlgItem(hWndSet,IDC_STATIC_SETTING);
SetWindowText(hWndFocus,TEXT("WINCE下是不能更改键盘设置di"));
hWndFocus = NULL;
#endif
IniRead();
hWndFocus = GetDlgItem(hWndDlgSet,IDC_CMBUSER);
GetWindowText(hWndFocus,str,256);
if( 0 == wcscmp(str,TEXT("")) )
KeyDefault();
break;
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDOK:
if(FALSE == KeyCheck() )
return FALSE;
else
IniWrite();
case IDCANCEL:
EndDialog(hWndSet, LOWORD(wParam));
return TRUE;
case IDC_BTN_DEFAULT: //缺省设置
KeyDefault();
break;
case IDC_CMBUSER: //用户栏输入
if(HIWORD(wParam) == CBN_KILLFOCUS)
{
hWndFocus = GetDlgItem(hWndDlgSet,IDC_CMBUSER);
//获得输入的用户名
GetWindowText(hWndFocus,strInput,256);
a = SendMessage(hWndFocus,CB_GETCOUNT,0,0);
//与已有的比较
for(i=0;i<a;i++)
{
SendMessage(hWndFocus,CB_GETLBTEXT,i,(LPARAM)(LPCSTR)str);
//如果已经有了
if( 0 == wcscmp(str,strInput) )
{
//Msg("e");
return FALSE;
}
}
//Msg("he");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -