?? 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 + -