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 @   McKay  阅读(1168)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示