OnInit/OnDraw/OnInitialUpdate这些函数之间有什么区别?

clown 2009-08-16 07:27:56
由于是初学MFC
不太懂
都有哪些函数是初始化功能的?
OnInit/OnDraw/OnInitialUpdate
这三个函数,我不知道该调用哪个
比如做个贪吃蛇程序
背景应该在这三个函数哪个函数中画呢
蛇的身体又在哪个函数中?
问的有点低级
忘哥哥姐姐指点
...全文
122 点赞 收藏 6
写回复
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
hsLi001 2009-08-16
void CMFC_SNAKEView::oninit() 我不知道这段是什么意思 什么功能
{
CDC *pDC=GetDC();
CBrush DrawBrush=(RGB(100,100,100));
CBrush *Drawbrush=pDC->SelectObject(&DrawBrush);
for(int i=0;i <=snake[0].l-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);

}
不好意思上面可能说错了,l是指蛇的长度
上面代码是用来画蛇的
回复
hsLi001 2009-08-16
注意看这里:
//////////得到行走方向/////////////////
if(snake[0].r==1)snake[0].y--; 向上
if(snake[0].r==2)snake[0].y++; 向下
if(snake[0].r==3)snake[0].x--; 向左
if(snake[0].r==4)snake[0].x++; 向右
回复
hsLi001 2009-08-16
struct snake
{
int x,y; 这个知道是蛇的每节的坐标
int l; 这个不知道是定义的什么东东
int r;

r是指方向,l是指速度
回复
ondraw和oninitialupdate的差别很容易吧。
回复
clown 2009-08-16
主要是今天我在网上下个贪吃蛇的源码,里面有的看不懂

哥哥 帮我看看

这是VIEW类下的 我贴出来


// MFC_SNAKEView.cpp : implementation of the CMFC_SNAKEView class
//

#include "stdafx.h"
#include "MFC_SNAKE.h"

#include "MFC_SNAKEDoc.h"
#include "MFC_SNAKEView.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

struct snake
{
int x,y; 这个知道是蛇的每节的坐标
int l; 这个不知道是定义的什么东东
int r; 这个不知道是定义的什么东东
}snake[50];
struct food
{
int x;
int y;
int isfood;
}food;
int isage=0;
int s=0;

/////////////////////////////////////////////////////////////////////////////
// CMFC_SNAKEView

IMPLEMENT_DYNCREATE(CMFC_SNAKEView, CView)

BEGIN_MESSAGE_MAP(CMFC_SNAKEView, CView)
//{{AFX_MSG_MAP(CMFC_SNAKEView)
ON_WM_TIMER()
ON_WM_KEYDOWN()
ON_WM_RBUTTONDOWN()
ON_COMMAND(IDM_START, OnStart)
ON_COMMAND(IDM_PAUSE, OnPause)
ON_COMMAND(IDM_CONTINUE, OnContinue)
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMFC_SNAKEView construction/destruction

CMFC_SNAKEView::CMFC_SNAKEView()
{
// TODO: add construction code here

}

CMFC_SNAKEView::~CMFC_SNAKEView()
{
}

BOOL CMFC_SNAKEView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs

return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CMFC_SNAKEView drawing

void CMFC_SNAKEView::OnDraw(CDC* pDC)
{
CBrush backBrush(RGB(100,100,0));
CBrush* pOldBrush = pDC->SelectObject(&backBrush);
CRect rect;
pDC->GetClipBox(&rect);// 获取需要用背景刷子涂抹的区域
pDC->PatBlt(rect.left, rect.top, rect.Width(), rect.Height(),PATCOPY);
pDC->SelectObject(pOldBrush);

CMFC_SNAKEDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
pDC->Rectangle(19,19,501,501); 这个明白是画了三个矩形
pDC->Rectangle(29,29,491,491);
pDC->Rectangle(39,39,481,481);
oninit();
// TODO: add draw code for native data here
}

/////////////////////////////////////////////////////////////////////////////
// CMFC_SNAKEView printing

BOOL CMFC_SNAKEView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}

void CMFC_SNAKEView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}

void CMFC_SNAKEView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}

/////////////////////////////////////////////////////////////////////////////
// CMFC_SNAKEView diagnostics

#ifdef _DEBUG
void CMFC_SNAKEView::AssertValid() const
{
CView::AssertValid();
}

void CMFC_SNAKEView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}

CMFC_SNAKEDoc* CMFC_SNAKEView::GetDocument() // non-debug version is insnake[0].l
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMFC_SNAKEDoc)));
return (CMFC_SNAKEDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CMFC_SNAKEView message handlers

void CMFC_SNAKEView::OnInitialUpdate() 这我想可能是定义蛇身
{
CView::OnInitialUpdate();

// TODO: Add your specialized code here and/or call the base class
snake[0].x=10;
snake[0].y=10;
snake[1].x=11;
snake[1].y=10;
snake[2].x=12;
snake[2].y=10;
snake[0].r=3; 这结构体里的R和L我始终没明白是什么
snake[0].l=3;
food.isfood=1;

}

void CMFC_SNAKEView::OnTimer(UINT nIDEvent)
{
CDC *pDC=GetDC();
CString soure;
/*//////////////////////////加速////////////////////////////*/
/*////////*/if(snake[0].l==2)SetTimer(1,370,NULL);/*////////*/
/*////////*/if(snake[0].l==3)SetTimer(1,270,NULL);/*////////*/
/*////////*/if(snake[0].l==6)SetTimer(1,200,NULL);/*////////*/
/*////////*/if(snake[0].l==9)SetTimer(1,100,NULL);/*////////*/
/*/////////////////////////加速/////////////////////////////*/
soure.Format("你得到了:%d!",(snake[0].l-3)*10);
///////////////////////判断是否撞边界/////////////////////////////////////
if(snake[0].x*20<=37||snake[0].y*20<=37||snake[0].x*20>=462||snake[0].y*20>=462)
{
KillTimer(1);
AfxMessageBox(soure);
s=0;
}
////////////////////////////判断撞蛇身////////////////////////////////////
if(snake[0].l>3)
for(int sn=snake[0].l-1;sn>0;sn--)
{
if(snake[0].x*20==snake[sn].x*20&&snake[0].y*20==snake[sn].y*20)
{
KillTimer(1);
AfxMessageBox(soure);
s=0;
}
}
///////////////////////////////////////////////////////////////////////////
pDC->SelectStockObject(WHITE_PEN);
pDC->Rectangle(snake[snake[0].l-1].x*20,snake[snake[0].l-1].y*20,(snake[snake[0].l-1].x+1)*20,(snake[snake[0].l-1].y+1)*20);
for(int i=snake[0].l-1;i>0;i--)
{
snake[i].x=snake[i-1].x;
snake[i].y=snake[i-1].y;
}
//////////得到行走方向/////////////////
if(snake[0].r==1)snake[0].y--;
if(snake[0].r==2)snake[0].y++;
if(snake[0].r==3)snake[0].x--;
if(snake[0].r==4)snake[0].x++;
pDC->SelectStockObject(BLACK_PEN);

CBrush DrawBrush=(RGB(100,100,100));
CBrush *Drawbrush=pDC->SelectObject(&DrawBrush);
pDC->Rectangle(snake[0].x*20,snake[0].y*20,(snake[0].x+1)*20,(snake[0].y+1)*20);
pDC->SelectObject(DrawBrush);
////////////判断吃豆,如果碰撞则吃豆///////////////////
if(snake[0].x*20==food.x*20&&snake[0].y*20==food.y*20)
{
snake[0].l++;
food.isfood=1;
snake[snake[0].l-1].x=snake[snake[0].l-2].x;
snake[snake[0].l-1].y=snake[snake[0].l-2].y;
}
///////////////如果"豆"被吃掉则重新生成///////////////////
if(food.isfood==1)
{
srand((unsigned)time(NULL));
do
{
for(int isfo=snake[0].l-1;isfo>=0;isfo--)
if(snake[0].x*20==snake[isfo].x*20&&snake[0].y*20==snake[isfo].y*20)
{
food.x=rand()%25;
food.y=rand()%25;
}
}while(food.x*20<70||food.y*20<70||food.x*20>430||food.y*20>430);
pDC->Rectangle(food.x*20,food.y*20,(food.x+1)*20,(food.y+1)*20);
food.isfood=0;
}
///////////////////升级////////////////////////
if(snake[0].l==5)
{
s+=snake[0].l*10;
KillTimer(1);
AfxMessageBox("升级!");
snake[0].x=10;
snake[0].y=10;
snake[1].x=11;
snake[1].y=10;
snake[2].x=12;
snake[2].y=10;
snake[0].r=1;
snake[0].l=3;
food.isfood=1;
CBrush DrawBrush=(RGB(255,255,255));
CBrush *Drawbrush=pDC->SelectObject(&DrawBrush);
pDC->Rectangle(39,39,481,481);
pDC->SelectObject(DrawBrush);


soure.Format("当前得分:%d",s);
AfxMessageBox(soure);

SetTimer(1,3000,NULL);
oninit();
}

CView::OnTimer(nIDEvent);
}

void CMFC_SNAKEView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
///////////////获取按键方向//////////////////////
switch(nChar)
{
case VK_UP:if(snake[0].r!=2)snake[0].r=1;break;
case VK_DOWN:if(snake[0].r!=1)snake[0].r=2;break;
case VK_LEFT:if(snake[0].r!=4)snake[0].r=3;break;
case VK_RIGHT:if(snake[0].r!=3)snake[0].r=4;break;
}
CView::OnKeyDown(nChar, nRepCnt, nFlags);
}



void CMFC_SNAKEView::OnRButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CString str;
str.Format("%d,%d",point.x,point.y);
AfxMessageBox(str);
CView::OnRButtonDown(nFlags, point);
}

void CMFC_SNAKEView::oninit() 我不知道这段是什么意思 什么功能
{
CDC *pDC=GetDC();
CBrush DrawBrush=(RGB(100,100,100));
CBrush *Drawbrush=pDC->SelectObject(&DrawBrush);
for(int i=0;i<=snake[0].l-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);

}

void CMFC_SNAKEView::OnStart()
{
// TODO: Add your command handler code here
SetTimer(1,3000,NULL);
AfxMessageBox("3秒后开始游戏!");
}

void CMFC_SNAKEView::OnPause()
{
// TODO: Add your command handler code here
KillTimer(1);
AfxMessageBox("游戏暂停...");
}

void CMFC_SNAKEView::OnContinue()
{
// TODO: Add your command handler code here
SetTimer(1,10,NULL);
}


多谢哥哥姐姐了 由于初学 问这么菜的问题 嘿嘿
回复
副组长 2009-08-16
在OnInitialUpdate做初始化工作
在OnDraw里面绘图
OnInit ? 是哪里的?
回复
发动态
发帖子
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
社区公告
暂无公告