📄 elsgamedlg.cpp
字号:
m_nArray[m_nCurIndexY+m_nBlockInfoArray[m_nCurBlock-1][m_nCurDir-1][i].y][m_nCurIndexX+m_nBlockInfoArray[m_nCurBlock-1][m_nCurDir-1][i].x]=0;
}
m_bPause=FALSE;
MySetTimer();
m_wndStatusBar.SetText("正在游戏",0,0);
}
else//pause
{
SetArrayBlockData();
m_bPause=TRUE;
KillTimer(1);
m_wndStatusBar.SetText("暂停游戏",0,0);
}
}
//计算定时
void CElsGameDlg::MySetTimer()
{
int level;
level=m_nUserSpeed+m_lsumLev/100;
if(level>9)
level=9;
SetTimer(1,m_nSpeedTime-level*100,NULL);
}
//弹出设置速度按钮
void CElsGameDlg::OnLevel()
{
if(m_bPlaying)
return;
CDlgSetting dlg;
if(dlg.DoModal()==IDOK)
{
m_nUserSpeed=dlg.m_nLevel;
m_slevel.Format("%d",m_nUserSpeed);
UpdateData(FALSE);
}
}
//stop game
void CElsGameDlg::OnStop()
{
if(!m_bPlaying)
return;
KillTimer(1);
m_bPlaying=FALSE;
m_bPause=FALSE;
ClearArray();
m_wndStatusBar.SetText("停止游戏",0,0);
Invalidate(FALSE);
}
//"ELS"
void CElsGameDlg::DemoStatic(int iColor)
{
int i;
m_nCurBmpIndex=iColor;
//===="S"===========//
m_nArray[4][2]=iColor+1;
for(i=4;i<=6;i++)
m_nArray[4][i]=iColor+1;
m_nArray[5][2]=iColor+1;
m_nArray[5][4]=iColor+1;
m_nArray[5][6]=iColor+1;
for(i=2;i<=4;i++)
m_nArray[6][i]=iColor+1;
m_nArray[6][6]=iColor+1;
//===="L"===========//
m_nArray[8][6]=iColor+1;
m_nArray[9][6]=iColor+1;
for(i=2;i<=6;i++)
m_nArray[10][i]=iColor+1;
//==="E"============//
m_nArray[12][2]=iColor+1;
m_nArray[12][4]=iColor+1;
m_nArray[12][6]=iColor+1;
m_nArray[13][2]=iColor+1;
m_nArray[13][4]=iColor+1;
m_nArray[13][6]=iColor+1;
for(i=2;i<=6;i++)
m_nArray[14][i]=iColor+1;
}
//清空矩阵
void CElsGameDlg::ClearArray()
{
int i,j;
for(i=0;i<19;i++)
{
for(j=0;j<10;j++)
m_nArray[i][j]=0;
}
}
//左右移动以适应旋转
int CElsGameDlg::AdaptRotatePos()
{
int i;
int t;
int mPos;
int nextDir=m_nCurDir+1;
if(nextDir>4)
nextDir=1;
///////////////////////////////////////////
mPos=0;
for(i=1;i<=3;i++)
{
t=m_nCurIndexX+m_nBlockInfoArray[m_nCurBlock-1][nextDir-1][i-1].x;
if(t<0)
{
if(abs(t)>abs(mPos))
mPos=t;
}
else if(t>9)
{
if((t-9)>mPos)
mPos=t-9;
}
}
///////////////////////////////////////////
return mPos;
}
//弹出设置界面的对话框
void CElsGameDlg::OnSetface()
{
if(m_pDlgSetFace)
m_pDlgSetFace->SetActiveWindow();//激活对话框
else
{
//创建非模态对话框
m_pDlgSetFace=new CDlgSetFace(this);
m_pDlgSetFace->Create(IDD_DLGSETFACE,this);
}
}
//设置窗口透明度
void CElsGameDlg::SetWndAlpha(int nAlphaDegree)
{
//m_pSetLayerWindow(*this,0,nAlphaDegree,LWA_ALPHA);
}
//按钮消息
void CElsGameDlg::OnBtnrotate()
{
SendMessage(WM_KEYDOWN,VK_UP);
}
//按钮消息
void CElsGameDlg::OnBtnleft()
{
SendMessage(WM_KEYDOWN,VK_LEFT);
}
//按钮消息
void CElsGameDlg::OnBtndown()
{
SendMessage(WM_KEYDOWN,VK_DOWN);
}
//按钮消息
void CElsGameDlg::OnBtnright()
{
SendMessage(WM_KEYDOWN,VK_RIGHT);
}
//显示窗口
void CElsGameDlg::OnShowWindow(BOOL bShow, UINT nStatus)
{
CDialog::OnShowWindow(bShow, nStatus);
}
//重新提取位图
void CElsGameDlg::ReLoadBitmap()
{
if(m_nBmpType==0)
{
m_BmpBlock[0].LoadBitmap(IDB_BITMAP1);
m_BmpBlock[1].LoadBitmap(IDB_BITMAP2);
m_BmpBlock[2].LoadBitmap(IDB_BITMAP3);
m_BmpBlock[3].LoadBitmap(IDB_BITMAP4);
m_BmpBlock[4].LoadBitmap(IDB_BITMAP5);
m_BmpBlock[5].LoadBitmap(IDB_BITMAP6);
m_BmpBlock[6].LoadBitmap(IDB_BITMAP7);
}
else
{
m_BmpBlock[0].LoadBitmap(IDB_BMPEX1);
m_BmpBlock[1].LoadBitmap(IDB_BMPEX2);
m_BmpBlock[2].LoadBitmap(IDB_BMPEX3);
m_BmpBlock[3].LoadBitmap(IDB_BMPEX4);
m_BmpBlock[4].LoadBitmap(IDB_BMPEX5);
m_BmpBlock[5].LoadBitmap(IDB_BMPEX6);
m_BmpBlock[6].LoadBitmap(IDB_BMPEX7);
}
}
//保存此次的界面设置值
void CElsGameDlg::OnClose()
{
CWinApp * pApp=AfxGetApp();
pApp->WriteProfileInt("GAMEFACE","BLOCKTYPE",m_nBmpType);
pApp->WriteProfileInt("GAMEFACE","SAMEGRAPH",m_bSameGraph);
pApp->WriteProfileInt("GAMEFACE","BACKGROUND",m_bBackGround);
pApp->WriteProfileString("GAMEFACE","FILEPATH",m_strMapPath);
CDialog::OnClose();
}
//右键窗口伴随
void CElsGameDlg::OnMouseMove(UINT nFlags, CPoint point)
{
static CPoint p;
ClientToScreen(&point);
if(nFlags & MK_RBUTTON)
{
//SetCursor(LoadCursor(NULL,IDC_CROSS));
CRect rc;
GetWindowRect(rc);
MoveWindow(rc.left+point.x-p.x,rc.top+point.y-p.y,rc.Width(),rc.Height());
}
p=point;
CDialog::OnMouseMove(nFlags, point);
}
//显示工具栏上的提示信息
BOOL CElsGameDlg::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult)
{
TOOLTIPTEXT* tt;
tt=(TOOLTIPTEXT*)lParam;
CString Tip;
switch(tt->hdr.code)
{
case TTN_NEEDTEXT://该信息表明要求显示工具栏上的提示
switch(tt->hdr.idFrom)
{
case IDM_START:
Tip.LoadString(IDS_START); //设置对应于工具栏上按钮的提示信息
break;
case IDM_PAUSE:
Tip.LoadString(IDS_PAUSE);
break;
case IDM_STOP:
Tip.LoadString(IDS_STOP);
break;
case IDM_SETFACE:
Tip.LoadString(IDS_SETFACE);
break;
case IDM_CONTENTS:
Tip.LoadString(IDS_HELP);
break;
case IDM_ABOUT:
Tip.LoadString(IDS_ABOUT);
break;
}
strcpy(tt->szText,(LPCSTR)Tip);//显示提示信息
break;
}
return CDialog::OnNotify(wParam, lParam, pResult);
}
//delete
void CElsGameDlg::ShowSpecialAward(BOOL isShow)
{
HWND hwndScr;
HDC hdcScr;
HPEN hPen;
int i;
if(isShow)
{
::LockWindowUpdate(hwndScr=::GetDesktopWindow());
hdcScr = ::GetDCEx(hwndScr, NULL, DCX_CACHE | DCX_LOCKWINDOWUPDATE) ;
::SelectObject(hdcScr,(HBRUSH)GetStockObject(NULL_BRUSH));
for(i=0;i<=10;i++)
{
hPen=CreatePen(PS_SOLID,2,RGB(255-i*20,0,0));
::SelectObject(hdcScr,hPen);
::Ellipse(hdcScr,300-(10-i)*2,100-(10-i)*2,
1300-(10-i)*2,1100-(10-i)*2);
::DeleteObject(hPen);
Sleep(20);
}
for(i=0;i<=10;i++)
{
hPen=CreatePen(PS_SOLID,2,RGB(0,255-i*20,0));
SelectObject(hdcScr,hPen);
::Ellipse(hdcScr,300+i*2,100+i*2,
1300+i*2,1100+i*2);
::DeleteObject(hPen);
Sleep(20);
}
for(i=0;i<=10;i++)
{
hPen=CreatePen(PS_SOLID,2,RGB(0,0,255-i*20));
::SelectObject(hdcScr,hPen);
::Ellipse(hdcScr,300+(i+10)*2,100+(i+10)*2,
1300+(i+10)*2,1100+(i+10)*2);
::DeleteObject(hPen);
Sleep(20);
}
::LockWindowUpdate (NULL) ;
::ReleaseDC(hwndScr,hdcScr);
}
else
{
hwndScr=::GetDesktopWindow();
::InvalidateRect(hwndScr,NULL,TRUE);
}
}
//处理游戏结束
void CElsGameDlg::DoGameOver()
{
m_bPlaying=FALSE;
KillTimer(1);
m_wndStatusBar.SetText("结束游戏",0,0);
if(m_lscore>m_nHiScore)
{
m_nHiScore=m_lscore;
//写入最高分
WriteHiScore();
if(m_lscore>=5000)
{
ShowSpecialAward(TRUE);
SetTimer(99,3000,NULL);
}
}
}
//存储位图到文件中
BOOL CElsGameDlg::SaveBitmapToFile(HBITMAP hBitmap, CString lpFileName)
{
HDC hDC; //设备描述表
int iBits; //当前显示分辨率下每个像素所占字节数
WORD wBitCount; //位图中每个像素所占字节数
DWORD dwPaletteSize=0, //定义调色板大小, 位图中像素字节大小 ,位图文件大小 , 写入文件字节数
dwBmBitsSize,
dwDIBSize, dwWritten;
BITMAP Bitmap;
BITMAPFILEHEADER bmfHdr; //位图属性结构
BITMAPINFOHEADER bi; //位图文件头结构
LPBITMAPINFOHEADER lpbi; //位图信息头结构
HANDLE fh, hDib, hPal,hOldPal=NULL; //指向位图信息头结构,定义文件,分配内存句柄,调色板句柄
//计算位图文件每个像素所占字节数
hDC = CreateDC("DISPLAY",NULL,NULL,NULL);
iBits = GetDeviceCaps(hDC, BITSPIXEL) *
GetDeviceCaps(hDC, PLANES);
DeleteDC(hDC);
if (iBits <= 1)
wBitCount = 1;
else if (iBits <= 4)
wBitCount = 4;
else if (iBits <= 8)
wBitCount = 8;
else if (iBits <= 24)
wBitCount = 24;
//计算调色板大小
if (wBitCount <= 8)
dwPaletteSize = (1 << wBitCount) *sizeof(RGBQUAD);
//设置位图信息头结构
GetObject(hBitmap, sizeof(BITMAP), (LPSTR)&Bitmap);
bi.biSize = sizeof(BITMAPINFOHEADER);
bi.biWidth = Bitmap.bmWidth;
bi.biHeight = Bitmap.bmHeight;
bi.biPlanes = 1;
bi.biBitCount = wBitCount;
bi.biCompression = BI_RGB;
bi.biSizeImage = 0;
bi.biXPelsPerMeter = 0;
bi.biYPelsPerMeter = 0;
bi.biClrUsed = 0;
bi.biClrImportant = 0;
dwBmBitsSize = ((Bitmap.bmWidth *wBitCount+31)/32)*4*Bitmap.bmHeight ;
//为位图内容分配内存
hDib = GlobalAlloc(GHND,dwBmBitsSize+dwPaletteSize+sizeof(BITMAPINFOHEADER));
lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib);
*lpbi = bi;
// 处理调色板
hPal = GetStockObject(DEFAULT_PALETTE);
if (hPal)
{
hDC = ::GetDC(NULL);
hOldPal = SelectPalette(hDC, (HPALETTE)hPal, FALSE);
RealizePalette(hDC);
}
// 获取该调色板下新的像素值
GetDIBits(hDC, hBitmap, 0, (UINT) Bitmap.bmHeight,
(LPSTR)lpbi + sizeof(BITMAPINFOHEADER)+dwPaletteSize,
(LPBITMAPINFO)lpbi, DIB_RGB_COLORS);
//恢复调色板
if (hOldPal)
{
SelectPalette(hDC, (HPALETTE)hOldPal, TRUE);
RealizePalette(hDC);
::ReleaseDC(NULL, hDC);
}
//创建位图文件
fh = CreateFile(lpFileName, GENERIC_WRITE,
0, NULL, CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);
if (fh == INVALID_HANDLE_VALUE)
return FALSE;
// 设置位图文件头
bmfHdr.bfType = 0x4D42; // "BM"
dwDIBSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + dwPaletteSize + dwBmBitsSize;
bmfHdr.bfSize = dwDIBSize;
bmfHdr.bfReserved1 = 0;
bmfHdr.bfReserved2 = 0;
bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER)
+ (DWORD)sizeof(BITMAPINFOHEADER)
+ dwPaletteSize;
// 写入位图文件头
WriteFile(fh, (LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER), &dwWritten, NULL);
// 写入位图文件其余内容
WriteFile(fh, (LPSTR)lpbi, dwDIBSize,&dwWritten, NULL);
//消除内存分配
GlobalUnlock(hDib);
GlobalFree(hDib);
CloseHandle(fh);
return TRUE;
}
//存储窗口到位图文件中
void CElsGameDlg::OnSavebmp()
{
CDC dc;
HDC hdc = GetWindowDC()->m_hDC;
CBitmap bm;
TCHAR szBuf[MAX_PATH];
dc.Attach(hdc);
CDC memDC;
CRect r;
//=================================//
memDC.CreateCompatibleDC(&dc);
GetModuleFileName(NULL, szBuf, MAX_PATH);
lstrcpy(strrchr(szBuf, '.')+1, "bmp");
this->GetWindowRect(&r);
CSize sz(r.Width(), r.Height());
bm.CreateCompatibleBitmap(&dc, sz.cx, sz.cy);
CBitmap * oldbm = memDC.SelectObject(&bm);
memDC.BitBlt(0, 0, sz.cx, sz.cy, &dc, 0, 0, SRCCOPY);
if(SaveBitmapToFile((HBITMAP)bm.m_hObject,szBuf))
MessageBox(_T("窗口图形存储成功!"),_T("窗口存储"),MB_ICONINFORMATION|MB_OK);
else
MessageBox(_T("无法存储窗口图形!"),_T("窗口存储"),MB_ICONEXCLAMATION|MB_OK);
}
//选择背景图片
void CElsGameDlg::OnBackground()
{
CMenu* hMenu=GetMenu();
hMenu=hMenu->GetSubMenu(1);
if(!m_bBackGround)
{
CFileDialog dlg(TRUE,"bmp",".bmp",OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,_T("位图文件(*.BMP)|*.BMP||"));
if(dlg.DoModal()==IDOK)
{
HBITMAP bitmap=(HBITMAP)LoadImage(AfxGetInstanceHandle(),dlg.GetPathName(),IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);
m_strMapPath=dlg.GetPathName();
CBitmap hBitmap;
hBitmap.Attach(bitmap);
m_brBack.CreatePatternBrush(&hBitmap);
hMenu->CheckMenuItem(IDM_BACKGROUND,MF_CHECKED);
m_bBackGround=!m_bBackGround;
////////////////////////////
DrawGameFace();
DrawTheMap();
hBitmap.DeleteObject();
}
}
else
{
hMenu->CheckMenuItem(IDM_BACKGROUND,MF_UNCHECKED);
m_bBackGround=!m_bBackGround;
m_brBack.DeleteObject();
////////////////////////
DrawGameFace();
DrawTheMap();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -