我在CMyView::OnCreate()里设置了一个定时器SetTimer(1,200,NULL);在视类的构造函数中给小球一个初速度,使其在定时器事件里自动行驶,问如何用小键盘的四个方向键、Home(左上)、PgUp(右上)、End(左下)、PgDn(右下)这八个方向键控制小球的行驶,并且当按键时,定时器关闭;不按键时,小球按原来轨迹自动行驶?
    以下是源代码:
    CMyView::OnTimer(UINT nIDEvent)里
    {
CClientDC dc(this);
dc.Rectangle(10,10,520,450);//画边框,使小球移动范围限制在该矩形框里
CDC *mdc=new CDC;
mdc->CreateCompatibleDC(&dc);
CBitmap *bitmap=new CBitmap;//小球20*20象素即半径10象素
bitmap->LoadBitmap(IDB_BALL);//装载小球图片
mdc->SelectObject(bitmap);
dc.BitBlt(x,y,20,20,mdc,0,0,SRCCOPY);//小球初始位置(500,430)
//x,y,vx,vy是视类的成员变量int x,y,vx,vy;
//在视类的构造函数中赋初值x=500;y=430;vx=vy=5;
x += vx;//小球的初速度vx=vy=5象素
y += vy;
if(y >= 430)//小球碰到矩形底时,初速度反向
{
vy = -vy;
y = 430;
}
if(x >= 500)//矩形右边
{
vx = -vx;
x = 500;
}
if(x <= 20)//矩形左边
{
vx = -vx;
x = 20;
}
if(y <= 20)//矩形顶
{
vy = -vy;
y = 20;
}
CFormView::OnTimer(nIDEvent);
if(mdc) delete mdc;
if(bitmap) delete bitmap;
    }

解决方案 »

  1.   

    楼主:我怎么编译不行呢
    说这个CFormView::OnTimer(nIDEvent);有问题哦还请楼主指点一二
      

  2.   

    设一个标志,当键盘按下时执行另一个函数,而在OnTimer()里面的绘图动作停止
      

  3.   

    nuaawenlin(飘人):你好!能不能详细点,我是初学者,好多东西都不会。如何获取键盘对小球的控制?函数如何写?能帮我写写吗?
      

  4.   


    参考:蛇吞蛋
    http://fxstudio.xiloo.com/code/snake.zip
      

  5.   

    Skt32(荒城之月)
    http://fxstudio.xiloo.com/code/snake.zip这个怎么玩呢
      

  6.   

    Skt32(荒城之月)谢谢指点,今天晚上我研究一下!但是我运行的时候怎么没有背景音乐啊!我仔细没看源代码!还是看了再问你吧!
      

  7.   

    重载ON_KEYDOWN消息啊,
    // ActionFrame.cpp : implementation file
    //#include "stdafx.h"#include "ActionFrame.h"
    include "ActionFrame.h"#ifdef _DEBUG
    #define new DEBUG_NEW
    #undef THIS_FILE
    static char THIS_FILE[] = __FILE__;
    #endif
    /////////////////////////////////////////////////////////////////////////////
    // ActionFramint p=0;
    int count=7;
    int count1=0;
    int count2=0;
    int count3=0;
    int life=120;
    int x=130,y=360,k=0,yp=250;
    int flags=0,flags1=0,flags2=0,flags3=0,flags4=0;
    int randomnum[8]={abs(rand())%320+20,abs(rand())%320+20,abs(rand())%320+20,abs(rand())%320+20,abs(rand())%320+20,abs(rand())%320+20,abs(rand())%320+20,abs(rand())%320+20};
    int yk[8]={315,270,225,180,135,90,45,0};
    int selectram[6]={0,0,0,0,0,0};
    IMPLEMENT_DYNCREATE(ActionFrame, CFrameWnd)ActionFrame::ActionFrame()
    {
    Create(NULL,"游戏----制作",WS_OVERLAPPEDWINDOW,rectDefault,NULL,NULL,0,NULL);
    CRect rect;
    CClientDC dc(this);
    int width=GetDeviceCaps(dc,HORZSIZE);
    int heigh=GetDeviceCaps(dc,VERTSIZE);
    GetWindowRect(&rect);
    width=width/2;
    heigh=heigh/2;
    MoveWindow(width,heigh,(rect.right-rect.left),(rect.bottom-rect.top),true);
    bgmap= new CBitmap;
    maskmap=new CBitmap;
    showmap=new CBitmap;
    tempmap=new CBitmap;
    bg=new CBitmap;
    mdc=new CDC;
    mdc1=new CDC;
    mdc->CreateCompatibleDC(&dc);
    mdc1->CreateCompatibleDC(&dc);
    showmap->m_hObject=(HBITMAP)::LoadImage(NULL,"bmp1.bmp",IMAGE_BITMAP,542,399,LR_LOADFROMFILE);
    bgmap->m_hObject=(HBITMAP)::LoadImage(NULL,"bgmap.bmp",IMAGE_BITMAP,635,435,LR_LOADFROMFILE);
    maskmap->m_hObject=(HBITMAP)::LoadImage(NULL,"bmp2.bmp",IMAGE_BITMAP,383,231,LR_LOADFROMFILE);
    tempmap->CreateCompatibleBitmap(&dc,633,435);
    bg->m_hObject=(HBITMAP)::LoadImage(NULL,"bg.bmp",IMAGE_BITMAP,421,720,LR_LOADFROMFILE);
    mdc->SelectObject(tempmap);
    i=0;
    }ActionFrame::~ActionFrame()
    {
    bgmap->DeleteObject();
    showmap->DeleteObject();
    maskmap->DeleteObject();
    tempmap->DeleteObject();
    mdc->DeleteDC();
    mdc1->DeleteDC();
    KillTimer(0);
    }
    BEGIN_MESSAGE_MAP(ActionFrame, CFrameWnd)
    //{{AFX_MSG_MAP(ActionFrame)
    ON_WM_PAINT()
    ON_WM_CREATE()
    ON_WM_TIMER()
    ON_WM_KEYDOWN()
    ON_WM_SETFOCUS()
    ON_WM_KILLFOCUS()
    ON_WM_LBUTTONDOWN()
    //}}AFX_MSG_MAP
    END_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////
    // ActionFrame message handlersvoid ActionFrame::OnPaint() 
    {
    CPaintDC dc(this); // device context for painting

    // TODO: Add your message handler code here

    // Do not call CFrameWnd::OnPaint() for painting messages
    }
    int ActionFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) 
    {
    if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
    return -1;
    SetTimer(0,25,NULL);

    // TODO: Add your specialized creation code here
    ModifyStyleEx(0,SWP_NOSIZE);
    return 0;
    }void ActionFrame::OnTimer(UINT nIDEvent) 
    {
    // TODO: Add your message handler code here and/or call default
    count3++;
    flags4=0;
    CClientDC dc(this);
    flags1=0;
    CTime nowTime;
    nowTime=GetCurrentTime();
    CString str;
    str=nowTime.Format("%S");
    char temp1=str.GetAt(1);
    int temp2=(int)temp1;
    mdc1->SelectObject(bgmap);
    mdc->BitBlt(0,0,633,435,mdc1,0,0,SRCCOPY);
    if(y<=0)
    {
    mdc1->SelectObject(bg);
    mdc->BitBlt(21,60,421,-y,mdc1,0,720+y,SRCPAINT);
    mdc->BitBlt(21,60-y,421,360+y,mdc1,0,0,SRCPAINT);
    }
    else
    {
    mdc1->SelectObject(bg);
    mdc->BitBlt(21,60,421,360,mdc1,0,y,SRCPAINT);
    }
    for(int j=0;j<8;j++)
    {

    if(yk[j]>=360)
    {
    selectram[j]=abs(rand())%9;
    if(selectram[j]>5)
    selectram[j]=0;
    randomnum[j]=abs(rand())%100+(temp2-50)*30;
    if(randomnum[j]<40||randomnum[j]>330)
    randomnum[j]=abs(rand())%290+40;
    yk[j]=0;
    }
    if(x>=randomnum[j]-28&&x<=randomnum[j]+90)
    if(yp+32>=420-yk[j]&&yp+32-420+yk[j]<=25)
    {
    if(selectram[j]==5)
    {
    yp=388-yk[j]+24;
    flags4=1;
    }
    else
    yp=388-yk[j];
    flags1=selectram[j]+1;
    if(selectram[j]==1)
    flags2=randomnum[j];
    if(selectram[j]==2)
    flags3=randomnum[j];
    }

    switch(selectram[j])
    {
    case 0:
    mdc1->SelectObject(showmap);
    mdc->BitBlt(randomnum[j],420-yk[j],94,14,mdc1,288,0,SRCPAINT);
    yk[j]+=5;
    break;
    case 1:
    if(flags2==randomnum[j])
    {
    count1++;
    switch(count1%5)
    {
    case 0:
    mdc->BitBlt(flags2,420-yk[j]-5,94,24,mdc1,288,183,SRCPAINT);
    break;
    case 1:
    mdc->BitBlt(flags2,420-yk[j]-11,94,36,mdc1,288,215,SRCPAINT);
    break;
    case 2:
    mdc->BitBlt(flags2,420-yk[j]-9,94,32,mdc1,288,254,SRCPAINT);
    break;
    case 3:
    mdc->BitBlt(flags2,420-yk[j]-10,94,34,mdc1,288,289,SRCPAINT);
    break;
    case 4:
    mdc->BitBlt(flags2,420-yk[j]-8,94,30,mdc1,288,327,SRCPAINT);
    break;
    }
    yk[j]+=5;
    if(count1>=5)
    {
    count1=0;
    flags2=0;
    }
    }
    else
    {
    mdc1->SelectObject(showmap);
    mdc->BitBlt(randomnum[j],420-yk[j],94,14,mdc1,288,153,SRCPAINT);
    yk[j]+=5;
    }
    break;
    case 2:
    if(flags3==randomnum[j])
    {
    count1++;
    switch(count1%8)
    {
    case 0:
    mdc->BitBlt(flags3,420-yk[j]+2,94,14,mdc1,384,328,SRCCOPY);
    break;
    case 1:
    mdc->BitBlt(flags3,420-yk[j]+4,94,12,mdc1,384,352,SRCCOPY);
    break;
    case 2:
    mdc->BitBlt(flags3,420-yk[j]+2,94,14,mdc1,384,328,SRCCOPY);
    break;
    case 3:
    mdc->BitBlt(flags3,420-yk[j],94,16,mdc1,384,304,SRCCOPY);
    break;
    case 4:
    mdc->BitBlt(flags3,420-yk[j]-2,94,18,mdc1,384,280,SRCCOPY);
    break;
    case 5:
    mdc->BitBlt(flags3,420-yk[j]-4,94,20,mdc1,384,256,SRCCOPY);
    break;
    case 6:
    mdc->BitBlt(flags3,420-yk[j]-6,94,22,mdc1,384,232,SRCCOPY);
    break;
    case 7:
    mdc->BitBlt(flags3,420-yk[j]-8,94,24,mdc1,384,208,SRCCOPY);
    break;
    }
    yk[j]+=5;
    if(count1>=8)
    {
    count1=0;
    flags3=0;
    }
    }
    else
    {
    mdc1->SelectObject(showmap);
    mdc->BitBlt(randomnum[j],420-yk[j],94,14,mdc1,384,304,SRCPAINT);
    yk[j]+=5;
    }
    break;
    case 3:
    mdc1->SelectObject(showmap);
    count2++;
    mdc->BitBlt(randomnum[j],420-yk[j],94,16,mdc1,288,15+count2/3%4*16,SRCCOPY);
    yk[j]+=5;
    break;
    case 4:
    mdc1->SelectObject(showmap);
    count2++;
    mdc->BitBlt(randomnum[j],420-yk[j],94,16,mdc1,288,80+count2/3%4*16,SRCCOPY);
    yk[j]+=5;
    break;
    case 5:
    mdc1->SelectObject(showmap);
    mdc->BitBlt(randomnum[j],420-yk[j],94,30,mdc1,382,368,SRCPAINT);
    yk[j]+=5;
    break;
    }

    }
    if(yp<=70)
    {
    yp=75;
    life-=10;
    flags4=1;
    }
    if(flags3!=0)
    yp-=30;
    if(flags4==1)
    {
    mdc1->SelectObject(maskmap);
    mdc->BitBlt(x,yp-8,31,31,mdc1,128+k*32,flags*34,SRCAND);
    mdc1->SelectObject(showmap);
    mdc->BitBlt(x,yp-8,31,31,mdc1,128+k*32,flags*34,SRCPAINT);
    }
    else
    {
    mdc1->SelectObject(maskmap);
    mdc->BitBlt(x,yp,31,31,mdc1,k*32,flags*34,SRCAND);
    mdc1->SelectObject(showmap);
    mdc->BitBlt(x,yp,31,31,mdc1,k*32,flags*34,SRCPAINT);
    }
      

  8.   

    include "ActionFrame.h"#ifdef _DEBUG
    #define new DEBUG_NEW
    #undef THIS_FILE
    static char THIS_FILE[] = __FILE__;
    #endif
    /////////////////////////////////////////////////////////////////////////////
    // ActionFramint p=0;
    int count=7;
    int count1=0;
    int count2=0;
    int count3=0;
    int life=120;
    int x=130,y=360,k=0,yp=250;
    int flags=0,flags1=0,flags2=0,flags3=0,flags4=0;
    int randomnum[8]={abs(rand())%320+20,abs(rand())%320+20,abs(rand())%320+20,abs(rand())%320+20,abs(rand())%320+20,abs(rand())%320+20,abs(rand())%320+20,abs(rand())%320+20};
    int yk[8]={315,270,225,180,135,90,45,0};
    int selectram[6]={0,0,0,0,0,0};
    IMPLEMENT_DYNCREATE(ActionFrame, CFrameWnd)ActionFrame::ActionFrame()
    {
    Create(NULL,"游戏----制作",WS_OVERLAPPEDWINDOW,rectDefault,NULL,NULL,0,NULL);
    CRect rect;
    CClientDC dc(this);
    int width=GetDeviceCaps(dc,HORZSIZE);
    int heigh=GetDeviceCaps(dc,VERTSIZE);
    GetWindowRect(&rect);
    width=width/2;
    heigh=heigh/2;
    MoveWindow(width,heigh,(rect.right-rect.left),(rect.bottom-rect.top),true);
    bgmap= new CBitmap;
    maskmap=new CBitmap;
    showmap=new CBitmap;
    tempmap=new CBitmap;
    bg=new CBitmap;
    mdc=new CDC;
    mdc1=new CDC;
    mdc->CreateCompatibleDC(&dc);
    mdc1->CreateCompatibleDC(&dc);
    showmap->m_hObject=(HBITMAP)::LoadImage(NULL,"bmp1.bmp",IMAGE_BITMAP,542,399,LR_LOADFROMFILE);
    bgmap->m_hObject=(HBITMAP)::LoadImage(NULL,"bgmap.bmp",IMAGE_BITMAP,635,435,LR_LOADFROMFILE);
    maskmap->m_hObject=(HBITMAP)::LoadImage(NULL,"bmp2.bmp",IMAGE_BITMAP,383,231,LR_LOADFROMFILE);
    tempmap->CreateCompatibleBitmap(&dc,633,435);
    bg->m_hObject=(HBITMAP)::LoadImage(NULL,"bg.bmp",IMAGE_BITMAP,421,720,LR_LOADFROMFILE);
    mdc->SelectObject(tempmap);
    i=0;
    }ActionFrame::~ActionFrame()
    {
    bgmap->DeleteObject();
    showmap->DeleteObject();
    maskmap->DeleteObject();
    tempmap->DeleteObject();
    mdc->DeleteDC();
    mdc1->DeleteDC();
    KillTimer(0);
    }
    BEGIN_MESSAGE_MAP(ActionFrame, CFrameWnd)
    //{{AFX_MSG_MAP(ActionFrame)
    ON_WM_PAINT()
    ON_WM_CREATE()
    ON_WM_TIMER()
    ON_WM_KEYDOWN()
    ON_WM_SETFOCUS()
    ON_WM_KILLFOCUS()
    ON_WM_LBUTTONDOWN()
    //}}AFX_MSG_MAP
    END_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////
    // ActionFrame message handlersvoid ActionFrame::OnPaint() 
    {
    CPaintDC dc(this); // device context for painting

    // TODO: Add your message handler code here

    // Do not call CFrameWnd::OnPaint() for painting messages
    }
    int ActionFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) 
    {
    if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
    return -1;
    SetTimer(0,25,NULL);

    // TODO: Add your specialized creation code here
    ModifyStyleEx(0,SWP_NOSIZE);
    return 0;
    }void ActionFrame::OnTimer(UINT nIDEvent) 
    {
    // TODO: Add your message handler code here and/or call default
    count3++;
    flags4=0;
    CClientDC dc(this);
    flags1=0;
    CTime nowTime;
    nowTime=GetCurrentTime();
    CString str;
    str=nowTime.Format("%S");
    char temp1=str.GetAt(1);
    int temp2=(int)temp1;
    mdc1->SelectObject(bgmap);
    mdc->BitBlt(0,0,633,435,mdc1,0,0,SRCCOPY);
    if(y<=0)
    {
    mdc1->SelectObject(bg);
    mdc->BitBlt(21,60,421,-y,mdc1,0,720+y,SRCPAINT);
    mdc->BitBlt(21,60-y,421,360+y,mdc1,0,0,SRCPAINT);
    }
    else
    {
    mdc1->SelectObject(bg);
    mdc->BitBlt(21,60,421,360,mdc1,0,y,SRCPAINT);
    }
    for(int j=0;j<8;j++)
    {

    if(yk[j]>=360)
    {
    selectram[j]=abs(rand())%9;
    if(selectram[j]>5)
    selectram[j]=0;
    randomnum[j]=abs(rand())%100+(temp2-50)*30;
    if(randomnum[j]<40||randomnum[j]>330)
    randomnum[j]=abs(rand())%290+40;
    yk[j]=0;
    }
    if(x>=randomnum[j]-28&&x<=randomnum[j]+90)
    if(yp+32>=420-yk[j]&&yp+32-420+yk[j]<=25)
    {
    if(selectram[j]==5)
    {
    yp=388-yk[j]+24;
    flags4=1;
    }
    else
    yp=388-yk[j];
    flags1=selectram[j]+1;
    if(selectram[j]==1)
    flags2=randomnum[j];
    if(selectram[j]==2)
    flags3=randomnum[j];
    }

    switch(selectram[j])
    {
    case 0:
    mdc1->SelectObject(showmap);
    mdc->BitBlt(randomnum[j],420-yk[j],94,14,mdc1,288,0,SRCPAINT);
    yk[j]+=5;
    break;
    case 1:
    if(flags2==randomnum[j])
    {
    count1++;
    switch(count1%5)
    {
    case 0:
    mdc->BitBlt(flags2,420-yk[j]-5,94,24,mdc1,288,183,SRCPAINT);
    break;
    case 1:
    mdc->BitBlt(flags2,420-yk[j]-11,94,36,mdc1,288,215,SRCPAINT);
    break;
    case 2:
    mdc->BitBlt(flags2,420-yk[j]-9,94,32,mdc1,288,254,SRCPAINT);
    break;
    case 3:
    mdc->BitBlt(flags2,420-yk[j]-10,94,34,mdc1,288,289,SRCPAINT);
    break;
    case 4:
    mdc->BitBlt(flags2,420-yk[j]-8,94,30,mdc1,288,327,SRCPAINT);
    break;
    }
    yk[j]+=5;
    if(count1>=5)
    {
    count1=0;
    flags2=0;
    }
    }
    else
    {
    mdc1->SelectObject(showmap);
    mdc->BitBlt(randomnum[j],420-yk[j],94,14,mdc1,288,153,SRCPAINT);
    yk[j]+=5;
    }
    break;
    case 2:
    if(flags3==randomnum[j])
    {
    count1++;
    switch(count1%8)
    {
    case 0:
    mdc->BitBlt(flags3,420-yk[j]+2,94,14,mdc1,384,328,SRCCOPY);
    break;
    case 1:
    mdc->BitBlt(flags3,420-yk[j]+4,94,12,mdc1,384,352,SRCCOPY);
    break;
    case 2:
    mdc->BitBlt(flags3,420-yk[j]+2,94,14,mdc1,384,328,SRCCOPY);
    break;
    case 3:
    mdc->BitBlt(flags3,420-yk[j],94,16,mdc1,384,304,SRCCOPY);
    break;
    case 4:
    mdc->BitBlt(flags3,420-yk[j]-2,94,18,mdc1,384,280,SRCCOPY);
    break;
    case 5:
    mdc->BitBlt(flags3,420-yk[j]-4,94,20,mdc1,384,256,SRCCOPY);
    break;
    case 6:
    mdc->BitBlt(flags3,420-yk[j]-6,94,22,mdc1,384,232,SRCCOPY);
    break;
    case 7:
    mdc->BitBlt(flags3,420-yk[j]-8,94,24,mdc1,384,208,SRCCOPY);
    break;
    }
    yk[j]+=5;
    if(count1>=8)
    {
    count1=0;
    flags3=0;
    }
    }
    else
    {
    mdc1->SelectObject(showmap);
    mdc->BitBlt(randomnum[j],420-yk[j],94,14,mdc1,384,304,SRCPAINT);
    yk[j]+=5;
    }
    break;
    case 3:
    mdc1->SelectObject(showmap);
    count2++;
    mdc->BitBlt(randomnum[j],420-yk[j],94,16,mdc1,288,15+count2/3%4*16,SRCCOPY);
    yk[j]+=5;
    break;
    case 4:
    mdc1->SelectObject(showmap);
    count2++;
    mdc->BitBlt(randomnum[j],420-yk[j],94,16,mdc1,288,80+count2/3%4*16,SRCCOPY);
    yk[j]+=5;
    break;
    case 5:
    mdc1->SelectObject(showmap);
    mdc->BitBlt(randomnum[j],420-yk[j],94,30,mdc1,382,368,SRCPAINT);
    yk[j]+=5;
    break;
    }

    }
    if(yp<=70)
    {
    yp=75;
    life-=10;
    flags4=1;
    }
    if(flags3!=0)
    yp-=30;
    if(flags4==1)
    {
    mdc1->SelectObject(maskmap);
    mdc->BitBlt(x,yp-8,31,31,mdc1,128+k*32,flags*34,SRCAND);
    mdc1->SelectObject(showmap);
    mdc->BitBlt(x,yp-8,31,31,mdc1,128+k*32,flags*34,SRCPAINT);
    }
    else
    {
    mdc1->SelectObject(maskmap);
    mdc->BitBlt(x,yp,31,31,mdc1,k*32,flags*34,SRCAND);
    mdc1->SelectObject(showmap);
    mdc->BitBlt(x,yp,31,31,mdc1,k*32,flags*34,SRCPAINT);
    }
      

  9.   

    for(int j=0;j<8;j++)
    {

    if(yk[j]>=360)
    {
    selectram[j]=abs(rand())%9;
    if(selectram[j]>5)
    selectram[j]=0;
    randomnum[j]=abs(rand())%100+(temp2-50)*30;
    if(randomnum[j]<40||randomnum[j]>330)
    randomnum[j]=abs(rand())%290+40;
    yk[j]=0;
    }
    if(x>=randomnum[j]-28&&x<=randomnum[j]+90)
    if(yp+32>=420-yk[j]&&yp+32-420+yk[j]<=25)
    {
    if(selectram[j]==5)
    {
    yp=388-yk[j]+24;
    flags4=1;
    }
    else
    yp=388-yk[j];
    flags1=selectram[j]+1;
    if(selectram[j]==1)
    flags2=randomnum[j];
    if(selectram[j]==2)
    flags3=randomnum[j];
    }

    switch(selectram[j])
    {
    case 0:
    mdc1->SelectObject(showmap);
    mdc->BitBlt(randomnum[j],420-yk[j],94,14,mdc1,288,0,SRCPAINT);
    yk[j]+=5;
    break;
    case 1:
    if(flags2==randomnum[j])
    {
    count1++;
    switch(count1%5)
    {
    case 0:
    mdc->BitBlt(flags2,420-yk[j]-5,94,24,mdc1,288,183,SRCPAINT);
    break;
    case 1:
    mdc->BitBlt(flags2,420-yk[j]-11,94,36,mdc1,288,215,SRCPAINT);
    break;
    case 2:
    mdc->BitBlt(flags2,420-yk[j]-9,94,32,mdc1,288,254,SRCPAINT);
    break;
    case 3:
    mdc->BitBlt(flags2,420-yk[j]-10,94,34,mdc1,288,289,SRCPAINT);
    break;
    case 4:
    mdc->BitBlt(flags2,420-yk[j]-8,94,30,mdc1,288,327,SRCPAINT);
    break;
    }
    yk[j]+=5;
    if(count1>=5)
    {
    count1=0;
    flags2=0;
    }
    }
    else
    {
    mdc1->SelectObject(showmap);
    mdc->BitBlt(randomnum[j],420-yk[j],94,14,mdc1,288,153,SRCPAINT);
    yk[j]+=5;
    }
    break;
    case 2:
    if(flags3==randomnum[j])
    {
    count1++;
    switch(count1%8)
    {
    case 0:
    mdc->BitBlt(flags3,420-yk[j]+2,94,14,mdc1,384,328,SRCCOPY);
    break;
    case 1:
    mdc->BitBlt(flags3,420-yk[j]+4,94,12,mdc1,384,352,SRCCOPY);
    break;
    case 2:
    mdc->BitBlt(flags3,420-yk[j]+2,94,14,mdc1,384,328,SRCCOPY);
    break;
    case 3:
    mdc->BitBlt(flags3,420-yk[j],94,16,mdc1,384,304,SRCCOPY);
    break;
    case 4:
    mdc->BitBlt(flags3,420-yk[j]-2,94,18,mdc1,384,280,SRCCOPY);
    break;
    case 5:
    mdc->BitBlt(flags3,420-yk[j]-4,94,20,mdc1,384,256,SRCCOPY);
    break;
    case 6:
    mdc->BitBlt(flags3,420-yk[j]-6,94,22,mdc1,384,232,SRCCOPY);
    break;
    case 7:
    mdc->BitBlt(flags3,420-yk[j]-8,94,24,mdc1,384,208,SRCCOPY);
    break;
    }
    yk[j]+=5;
    if(count1>=8)
    {
    count1=0;
    flags3=0;
    }
    }
    else
    {
    mdc1->SelectObject(showmap);
    mdc->BitBlt(randomnum[j],420-yk[j],94,14,mdc1,384,304,SRCPAINT);
    yk[j]+=5;
    }
    break;
    case 3:
    mdc1->SelectObject(showmap);
    count2++;
    mdc->BitBlt(randomnum[j],420-yk[j],94,16,mdc1,288,15+count2/3%4*16,SRCCOPY);
    yk[j]+=5;
    break;
    case 4:
    mdc1->SelectObject(showmap);
    count2++;
    mdc->BitBlt(randomnum[j],420-yk[j],94,16,mdc1,288,80+count2/3%4*16,SRCCOPY);
    yk[j]+=5;
    break;
    case 5:
    mdc1->SelectObject(showmap);
    mdc->BitBlt(randomnum[j],420-yk[j],94,30,mdc1,382,368,SRCPAINT);
    yk[j]+=5;
    break;
    }

    }
    if(yp<=70)
    {
    yp=75;
    life-=10;
    flags4=1;
    }
    if(flags3!=0)
    yp-=30;
    if(flags4==1)
    {
    mdc1->SelectObject(maskmap);
    mdc->BitBlt(x,yp-8,31,31,mdc1,128+k*32,flags*34,SRCAND);
    mdc1->SelectObject(showmap);
    mdc->BitBlt(x,yp-8,31,31,mdc1,128+k*32,flags*34,SRCPAINT);
    }
    else
    {
    mdc1->SelectObject(maskmap);
    mdc->BitBlt(x,yp,31,31,mdc1,k*32,flags*34,SRCAND);
    mdc1->SelectObject(showmap);
    mdc->BitBlt(x,yp,31,31,mdc1,k*32,flags*34,SRCPAINT);
    }
    switch(flags1)
    {
    case 1:
    yp-=5;
    break;
    case 2:
    break;
    case 3:
    break;
    case 4:
    yp-=5;
    x+=3;
    break;
    case 5:
    yp-=5;
    x-=3;
    break;
    case 6:
    yp-=50;
    if(!(count--%6))
    life-=10;
    if(count<=0)
    count=7;
    break;
    }
    yp+=21; y-=8;
    if(y<=-360)
    y=360;
    if(x>380)
    x=380;
    if(x<43)
    x=43;
    CFrameWnd::OnTimer(nIDEvent);
    mdc->BitBlt(40,60,386,15,mdc1,0,367,SRCPAINT);
    mdc->BitBlt(22,60,16,360,mdc1,510,0,SRCPAINT);
    mdc->BitBlt(426,60,16,360,mdc1,510,0,SRCPAINT);
    mdc->BitBlt(20,38,95,16,mdc1,384,life/10*16,SRCPAINT);
    mdc->BitBlt(151,25,108,31,mdc1,128,320,SRCPAINT);
    mdc->BitBlt(270,25,29,32,mdc1,480,p/100*32,SRCPAINT);
    mdc->BitBlt(300,25,29,32,mdc1,480,p/10%10*32,SRCPAINT);
    mdc->BitBlt(330,25,29,32,mdc1,480,p%100%10*32,SRCPAINT);
    dc.BitBlt(0,0,633,435,mdc,0,0,SRCCOPY);
    p=count3/60;
    if(count3%20==0)
    if(life<100)
    life+=10;

    if(yp>=490||life<=0)
    {
    KillTimer(0);
    if(p<10)
    AfxMessageBox("你好菜啊!呵呵!",MB_ICONINFORMATION);
    if(p>=10&&p<50)
    AfxMessageBox("水平还有限!",MB_ICONINFORMATION);
    if(p>=50&&p<80)
    AfxMessageBox("水平可以啦!",MB_ICONINFORMATION);
    if(p>=80&&p<100)
    AfxMessageBox("好厉害啊!",MB_ICONINFORMATION);
    if(p>=100)
    AfxMessageBox("不错,是高手!",MB_ICONINFORMATION);
    int result=::MessageBox(this->m_hWnd,"是否继续?","询问",MB_YESNO|MB_ICONQUESTION);
    i=0;
    yp=140;
    p=0;
    life=100;
    if(result==IDOK)
    {
    SetTimer(0,10,NULL);
    }
    if(result==IDNO)
    DestroyWindow();
    }
    /* if(p<10)
    dc.TextOut(510,203,"小心有陷阱!");
    if(p>=10&&p<30)
    dc.TextOut(510,203,"路正长,坚持!");
    if(p>=30&&p<60)
    dc.TextOut(510,203,"漫漫黑夜,不要着急!");
    if(p>=60&&p<80)
    dc.TextOut(510,203,"已经看到曙光了!");
    if(p>=80&&p<100)
    dc.TextOut(510,203,"胜利就在眼前了!");
    if(p>=100)
    dc.TextOut(510,203,"恭喜你!成功了!");
    */
    }
    BOOL ActionFrame::PreCreateWindow(CREATESTRUCT& cs) 
    {
    // TODO: Add your specialized code here and/or call the base class
    cs.cx=643;
    cs.cy=464;
    cs.style &=~WS_MAXIMIZEBOX;
    return CFrameWnd::PreCreateWindow(cs);
    }
    void ActionFrame::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
    {
    // TODO: Add your message handler code here and/or call default
    CClientDC dc(this);
      k=i%4;
    i++;
    if(nChar==VK_RIGHT)
    {
    flags=1;
    x+=15;
    }
    if(nChar==VK_LEFT)
    {
    flags=0;
    x-=15;
    }

    CFrameWnd::OnKeyDown(nChar, nRepCnt, nFlags);
    }
    void ActionFrame::OnSetFocus(CWnd* pOldWnd) 
    {
    CFrameWnd::OnSetFocus(pOldWnd);
    SetTimer(0,10,NULL);
    // TODO: Add your message handler code here

    }void ActionFrame::OnKillFocus(CWnd* pNewWnd) 
    {
    CFrameWnd::OnKillFocus(pNewWnd);
    KillTimer(0);
    // TODO: Add your message handler code here

    }void ActionFrame::OnLButtonDown(UINT nFlags, CPoint point) 
    {
    // TODO: Add your message handler code here and/or call default
    CPoint Pos;
    Pos=point; CRect rect;
    GetClientRect(&rect);
    rect.left=510;
    rect.top=300;
    rect.bottom=350;
    rect.right=560;
    if(rect.PtInRect((POINT)Pos)&&!m_Stop)
    {
    m_Stop=TRUE;
    KillTimer(0);
    }
    else if(m_Stop&&rect.PtInRect((POINT)Pos))
    {
    m_Stop=FALSE;
    SetTimer(0,25,NULL);
    }
    CFrameWnd::OnLButtonDown(nFlags, point);
    }
      

  10.   

    koules:   由Linux移植的程序,经典作品。   开发工具:VC++6.0 和 Directx   程序及源程序下载(174k)http://creativesoft.home.shangdu.net/koules.zip
      

  11.   

    重载ON_KEYDOWN消息
    void CMyView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
    {
    switch(nChar)
    {
    case 87://大写W键的ASCII值       可以控制小球向上移动
    case 119://小写w键的ASCII值
    KillTimer(1);//KeyDown时关闭定时器
    y += vy;
    this->DrawBall(x,y);//你自己定义一个画小球的函数
    if(y <= 20)//
    {
    vy = vy;
    y = 430;
    }
    SetTimer(1,200,NULL);//不按键时让小球自己走
    break;
             //其他的键控制可以参考上面,自己要多练习
    }