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

📄 elsgamedlg.cpp

📁 俄罗斯方块
💻 CPP
📖 第 1 页 / 共 3 页
字号:
			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 + -