武汉理工大学《可视化编程》课程设计说明书
// TODO: Add your specialized code here and/or call the base class }
我们假设贪吃蛇开始有3个节点,食物则是认为1无0有.
3.4响应键盘操作的消息
void CSnakeView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) {
// TODO: Add your message handler code here and/or call default switch(nChar) {
case VK_UP:if(Snake[0].direct!=2)Snake[0].direct=1;break; case VK_DOWN:if(Snake[0].direct!=1)Snake[0].direct=2;break; case VK_LEFT:if(Snake[0].direct!=4)Snake[0].direct=3;break; case
VK_RIGHT:if(Snake[0].direct!=3)Snake[0].direct=4;break; }
CView::OnKeyDown(nChar, nRepCnt, nFlags); CView::OnKeyDown(nChar, nRepCnt, nFlags);
}分别对上下左右的消息进行响应,snake[0].direct表示的时蛇头方向.而case VK_UP:if(Snake[0].direct!=2)Snake[0].direct=1;break; 意思就是当Snake[0].direct的方向此时并不等于“下”的时候,才能做出“上”的操作动作,同理其他的代码亦是相同的意思.
6
武汉理工大学《可视化编程》课程设计说明书
3.5对OnRButtonDown()具体添加代码
void CSnakeView::OnRButtonDown(UINT nFlags, CPoint point) {
// TODO: Add your message handler code here and/or call
default
CString str;
str.Format(\AfxMessageBox(str);
CView::OnRButtonDown(nFlags, point); CView::OnRButtonDown(nFlags, point); CView::OnRButtonDown(nFlags, point);
}这个函数用于当你用鼠标右键屏幕,就会马上显示当前位置的坐标信息。其实这个函数可有可无,但是我在后面的的确定初始化窗口的大小很有作用,于是我在当时决定将其加进去.
3.6对贪吃蛇初始化(画图)
void CSnakeView::Oninit() {
CDC *pDC=GetDC();
CBrush DrawBrush=(RGB(100,0,0));
CBrush *Drawbrush=pDC->SelectObject(&DrawBrush);
7
武汉理工大学《可视化编程》课程设计说明书
for(int i=0;i<=Snake[0].len-1;i++)
pDC->Rectangle(Snake[i].x*20,Snake[i].y*20,(Snake[i].x+1)*20,(Snake[i].y+1)*20);
pDC->SelectObject(DrawBrush);
} 利用Windows给我们提供的CDC类来进行画图,我们首先用一个指向CDC类的指针
去接受与该窗口相关联的DC句柄,然后用定义画刷一个DrawBrush对象,并且用RGB(100,100,100)来给画刷初始化颜色。并且用SelectObject(&DrawBrush);函数把对象画刷选入到设备描述表中,用for循环依次把贪吃蛇的3个节点画出来。
3.7对相关控件的的功能设定
void CSnakeView::OnPause() {
// TODO: Add your command handler code here KillTimer(1);
}
void CSnakeView::OnContinue() {
// TODO: Add your command handler code here SetTimer(1,10,NULL);
8
武汉理工大学《可视化编程》课程设计说明书
}
void CSnakeView::OnExit() {
// TODO: Add your command handler code here
exit (0); }
void CSnakeView::OnStart() {
// TODO: Add your command handler code here SetTimer(1,30,NULL);
}
SetTimer(m_hWnd,1,1000,NULL); //一个1秒触发一次的定时器
在MFC程序中SetTimer被封装在CWnd类中,所以我在调用就不用指定窗口句柄了,并且找资料得到SetTimer API函数的原型
UINT_PTR SetTimer( HWND hWnd, // 窗口句柄
UINT_PTR nIDEvent, // 定时器ID,多个定时器时,可以通过该ID判
断是哪个定时器
UINT uElapse, // 时间间隔,单位为毫秒 TIMERPROC lpTimerFunc // 回调函数 );
因此更加容易的理解了settime的使用及原理.
9
武汉理工大学《可视化编程》课程设计说明书
3.8用画刷画一个背景,并画3个矩形区域.
void CSnakeView::OnDraw(CDC* pDC) {
CSnakeDoc* pDoc = GetDocument(); }
OnDraw()函数众所周知视图类中的输出.视图类的输出基本上都是在视图类的OnDraw函数中处理的,系统会准备好入参,然后调用OnDraw函数
10
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here CBrush backBrush(RGB(100,100,100));
CBrush* pOldBrush = pDC->SelectObject(&backBrush); CRect rect;
pDC->GetClipBox(&rect);
pDC->PatBlt(rect.left, rect.top, rect.Width(), rect.Height(),PATCOPY); pDC->SelectObject(pOldBrush);
pDC->Rectangle(19,19,501,501); Oninit();