⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 q11evc.cpp

📁 涉及的代码是针对WINCE3.0(PPC2002)平台
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/*==============================================================================
文件: 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 + -