📄 canvasframe.cpp
字号:
// canvasFrame.cpp : implementation file
//
#include "stdafx.h"
#include "canvasr.h"
#include "canvasFrame.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// canvasFrame
int x,y,kx,ky,ty,i,j,k,m,count;
bool keydown;
bool newpie;
bool cancel;
bool full;
bool restart;
int bottom[16];
struct piece
{
int x;
int y;
int color;
};
piece pie;
struct occupy
{
int x;
int y;
bool exist;
int color;
};
occupy occ[20][16];
IMPLEMENT_DYNCREATE(canvasFrame, CFrameWnd)
canvasFrame::canvasFrame()
{
Create(NULL,"ELS",WS_OVERLAPPED|WS_SYSMENU|WS_CAPTION,CRect(0,0,330,436));
CClientDC dc(this);
int width = dc.GetDeviceCaps(HORZRES);
int height = dc.GetDeviceCaps(VERTRES);
GetWindowRect( &rect );
width = ( width - ( rect.right - rect.left ))/2 ;
height = (height - (rect.bottom - rect.top ))/2 ;
MoveWindow( width , height , (rect.right - rect.left ) , (rect.bottom - rect.top ) ,true);
GetClientRect(&rect);
mdc = new CDC;
mdc1 = new CDC;
mdc->CreateCompatibleDC(&dc); //将mdc转换成与dc相容的DC
mdc1->CreateCompatibleDC(&dc);
temp = new CBitmap;
temp->CreateCompatibleBitmap(&dc,rect.right,rect.bottom);
mdc->SelectObject(temp);
bg=new CBitmap;
bg->m_hObject = (HBITMAP)::LoadImage(NULL,"bg.bmp",IMAGE_BITMAP,rect.right,rect.bottom,LR_LOADFROMFILE); //载入背景图文件
mp=new CBitmap;
mp->m_hObject=(HBITMAP)::LoadImage(NULL,"m0.bmp",IMAGE_BITMAP,240,80,LR_LOADFROMFILE);
char str[7];
for(i=0;i<3;i++)
{
sprintf(str,"e%d.bmp",i);
fk[i] = new CBitmap;
fk[i]->m_hObject = (HBITMAP)::LoadImage(NULL,str,IMAGE_BITMAP,20,20,LR_LOADFROMFILE);
}
for(i=0;i<16;i++)
bottom[i]=rect.bottom;
for(i=0;i<20;i++)
for(j=0;j<16;j++)
{
occ[i][j].exist=false;
occ[i][j].color=0;
occ[i][j].x=j*20;
occ[i][j].y=i*20;
}
pie.color=rand()%3;
x=rect.right/2;
y=0;
kx=20;
ky=20;
ty=20;
keydown=false;
newpie=true;
cancel=false;
full=false;
restart=true;
}
canvasFrame::~canvasFrame()
{
for(i=0;i<3;i++)
delete fk[i];
delete temp;
delete mdc;
delete mdc1;
delete bg;
}
BEGIN_MESSAGE_MAP(canvasFrame, CFrameWnd)
//{{AFX_MSG_MAP(canvasFrame)
ON_WM_TIMER()
ON_WM_CREATE()
//}}AFX_MSG_MAP
ON_WM_KEYDOWN()
ON_WM_KEYUP()
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// canvasFrame message handlers
void canvasFrame::OnTimer(UINT nIDEvent)
{
CClientDC dc(this);
if(!keydown)
{
mdc1->SelectObject(bg);
mdc->BitBlt(0,0,rect.right,rect.bottom,mdc1,0,0,SRCCOPY);
}//待修改
for(i=0;i<16;i++)
{
if(bottom[i]<=0)
{
full=true;
break;
}
}
if(full)
{
newpie=false;
cancel=false;
restart=false;
}
if(keydown==false&&restart==false)
{
for(i=0;i<20;i++)
{
for(j=0;j<16;j++)
{
if(occ[i][j].exist)
{
mdc1->SelectObject(fk[occ[i][j].color]);
mdc->BitBlt(occ[i][j].x,occ[i][j].y,20,20,mdc1,0,0,SRCCOPY);
}
}
}
mdc1->SelectObject(fk[pie.color]);
mdc->BitBlt(pie.x,pie.y,20,20,mdc1,0,0,SRCCOPY);
}
if(keydown==false&&restart==false)
{
mdc1->SelectObject(mp);
mdc->BitBlt(40,160,240,80,mdc1,0,0,SRCCOPY);
dc.BitBlt(0,0,rect.right,rect.bottom,mdc,0,0,SRCCOPY);
}
if(restart)
{
if(!keydown)
{
pie.x=x;
pie.y=y;
y+=ty;
if((pie.y+20)>=bottom[x/20])
{
pie.x=x;
pie.y=bottom[pie.x/20]-20;
bottom[pie.x/20]-=20;
newpie=true;
occ[pie.y/20][pie.x/20].exist=true;
occ[pie.y/20][pie.x/20].color=pie.color;
}
if(newpie)
{
newpie=false;
pie.color=rand()%3;
pie.x=rect.right/2;
pie.y=0;
x=rect.right/2;
y=0;
}
for(i=0;i<20;i++)
{
for(j=0;j<16;j++)
{
if(occ[i][j].exist)
{
mdc1->SelectObject(fk[occ[i][j].color]);
mdc->BitBlt(occ[i][j].x,occ[i][j].y,20,20,mdc1,0,0,SRCCOPY);
}
}
}
mdc1->SelectObject(fk[pie.color]);
mdc->BitBlt(pie.x,pie.y,20,20,mdc1,0,0,SRCCOPY);
dc.BitBlt(0,0,rect.right,rect.bottom,mdc,0,0,SRCCOPY);
for(j=0;j<16;j++)
{
if(occ[19][j].exist==false)
break;
}
if(j>=16)
cancel=true;
if(cancel)
{
for(k=19;k>0;k--)
{
for(m=0;m<16;m++)
{
occ[k][m].exist=occ[k-1][m].exist;
if(occ[k-1][m].exist)
occ[k][m].color=occ[k-1][m].color;
}
}
for(j=0;j<16;j++)
{
occ[0][j].exist=false;
bottom[j]=bottom[j]+20;
}
cancel=false;
}
}
}
CFrameWnd::OnTimer(nIDEvent);
}
int canvasFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
SetTimer(1,300,NULL);
return 0;
}
void canvasFrame::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
keydown=true;
CClientDC dc(this);
mdc1->SelectObject(bg);
mdc->BitBlt(0,0,rect.right,rect.bottom,mdc1,0,0,SRCCOPY);
for(i=0;i<16;i++)
{
if(bottom[i]<=0)
{
full=true;
break;
}
}
if(full)
{
newpie=false;
cancel=false;
restart=false;
}
if(restart==false)
{
for(i=0;i<20;i++)
{
for(j=0;j<16;j++)
{
if(occ[i][j].exist)
{
mdc1->SelectObject(fk[occ[i][j].color]);
mdc->BitBlt(occ[i][j].x,occ[i][j].y,20,20,mdc1,0,0,SRCCOPY);
}
}
}
mdc1->SelectObject(fk[pie.color]);
mdc->BitBlt(pie.x,pie.y,20,20,mdc1,0,0,SRCCOPY);
}
if(restart==false)
{
mdc1->SelectObject(mp);
mdc->BitBlt(40,160,240,80,mdc1,0,0,SRCCOPY);
dc.BitBlt(0,0,rect.right,rect.bottom,mdc,0,0,SRCCOPY);
}
if(restart)
{
if(nChar==VK_DOWN)
{
y+=ky;
if(y+20>=bottom[x/20])
y=bottom[x/20]-20;
}
if(nChar==VK_UP)
{
keydown=false;
}
if(nChar==VK_LEFT)
{
x-=kx;
if(x<=0)
x=0;
}
if(nChar==VK_RIGHT)
{
x+=kx;
if(x+20>=rect.right)
x=rect.right-20;
}
pie.x=x;
pie.y=y;
if((pie.y+20)>=bottom[x/20])
{
pie.x=x;
pie.y=bottom[pie.x/20]-20;
bottom[pie.x/20]-=20;
occ[pie.y/20][pie.x/20].exist=true;
occ[pie.y/20][pie.x/20].color=pie.color;
newpie=true;
}
if(newpie)
{
newpie=false;
pie.color=rand()%3;
pie.x=rect.right/2;
pie.y=0;
x=rect.right/2;
y=0;
}
for(i=0;i<20;i++)
{
for(j=0;j<16;j++)
{
if(occ[i][j].exist)
{
mdc1->SelectObject(fk[occ[i][j].color]);
mdc->BitBlt(occ[i][j].x,occ[i][j].y,20,20,mdc1,0,0,SRCCOPY);
}
}
}
mdc1->SelectObject(fk[pie.color]);
mdc->BitBlt(pie.x,pie.y,20,20,mdc1,0,0,SRCCOPY);
dc.BitBlt(0,0,rect.right,rect.bottom,mdc,0,0,SRCCOPY);
for(j=0;j<16;j++)
{
if(occ[19][j].exist==false)
break;
}
if(j>=16)
cancel=true;
if(cancel)
{
for(k=19;k>0;k--)
{
for(m=0;m<16;m++)
{
occ[k][m].exist=occ[k-1][m].exist;
if(occ[k-1][m].exist)
occ[k][m].color=occ[k-1][m].color;
}
}
for(j=0;j<16;j++)
{
occ[0][j].exist=false;
bottom[j]=bottom[j]+20;
}
cancel=false;
}
}
if(nChar==VK_F1)
{
restart=true;
full=false;
for(i=0;i<16;i++)
bottom[i]=rect.bottom;
for(i=0;i<20;i++)
for(j=0;j<16;j++)
{
occ[i][j].exist=false;
occ[i][j].color=0;
occ[i][j].x=j*20;
occ[i][j].y=i*20;
}
pie.color=rand()%3;
x=rect.right/2;
y=0;
}
if(nChar==VK_ESCAPE)
PostMessage(WM_CLOSE);
CFrameWnd::OnKeyDown(nChar, nRepCnt, nFlags);
}
void canvasFrame::OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags)
{
keydown=false;
CFrameWnd::OnKeyUp(nChar, nRepCnt, nFlags);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -