MFC 坦克定位

最近学习MFC,写了个用键盘上下左右移动的坦克界面,效果图:

 

 

先用VC++新建一个最简单的MFC项目,基于Dialog的

1. 添加坦克图片资源:略

2. 添加3个变量:x, y, m_bitmap

int x;
int y;
CBitmap m_bitmap;

 

3. 在初始化方法中加载bitmap以及设置好初始的坐标位置:

BOOL Ctest3Dlg::OnInitDialog()
{
       //略(系统生成的代码略)
       this->m_bitmap.LoadBitmapW(IDB_BITMAP2);  //BMP文件的资源文件ID
    BITMAP bmpInfo;
    this->m_bitmap.GetBitmap(&bmpInfo); //获取图片的宽高等属性

    RECT r;
    this->GetWindowRect(&r);  //获取当前Dialog的宽高等属性
    this->x=(r.right-r.left)/2-bmpInfo.bmWidth/2;      //计算出中心位置
    this->y=(r.bottom-r.top)/2-bmpInfo.bmHeight/2; //计算出中心位置

    return TRUE;
}

 

4. 重写OnPaint函数:

    CClientDC d(this);
    CDC memDC;
    memDC.CreateCompatibleDC(&d);
    memDC.SelectObject(&m_bitmap);
    BITMAP bmpInfo;
    this->m_bitmap.GetBitmap(&bmpInfo);
    d.BitBlt(this->x, this->y, bmpInfo.bmWidth, bmpInfo.bmHeight, &memDC, 0, 0, SRCCOPY);   //这句最重要

 

5. 挂载键盘event:

void Ctest3Dlg::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
    // TODO: 在此添加消息处理程序代码和/或调用默认值

    switch (nChar)
    {
        case VK_LEFT:
            this->x-=10;
            break;
        case VK_RIGHT:
            this->x+=10;
            break;
        case VK_UP:
            this->y-=10;
            break;
        case VK_DOWN:
            this->y+=10;
            break;
        default:
            break;
    }

    this->InvalidateRect(NULL);  //擦除原先的图片,重新画出图片(OnPaint中)

    CDialogEx::OnKeyDown(nChar, nRepCnt, nFlags);
}

 

6. 由于Dialog中的事件机制,需要加入消息预处理函数才能让程序真正接收到keydown事件,如下:

BOOL Ctest3Dlg::PreTranslateMessage(MSG* pMsg)
{
    // TODO: 在此添加专用代码和/或调用基类
    if (pMsg->message == WM_KEYDOWN)
    {
        SendMessage(WM_KEYDOWN, pMsg->wParam, pMsg->lParam);
    }

    return CDialogEx::PreTranslateMessage(pMsg);
}

上面写的比较简单,事件关联没有写进去,不过由于有UI向导帮助建立,所以就没有写,如:

BEGIN_MESSAGE_MAP(Ctest3Dlg, CDialogEx)
    ON_WM_PAINT()
    ON_WM_KEYDOWN()
END_MESSAGE_MAP()

 

哈哈,现在能控制坦克的上下左右了。

 

posted @ 2013-07-23 18:30  McKay  阅读(1167)  评论(0编辑  收藏  举报