zoukankan      html  css  js  c++  java
  • 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()

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

  • 相关阅读:
    如何最快速的找到页面某一元素所绑定的点击事件,并查看js代码
    Python3 实现 JS 中 RSA 加密的 NoPadding 模式
    Python实现京东自动登录
    使用Chrome或Fiddler抓取WebSocket包
    python的ws库功能,实时获取服务器ws协议返回的数据
    js遍历对象所有的属性名称和值
    selenium webdriver 实现Canvas画布自动化测试
    CE教程
    How to Get Text inside a Canvas using Webdriver or Protractor
    HTML <​canvas> testing with Selenium and OpenCV
  • 原文地址:https://www.cnblogs.com/aarond/p/tanke.html
Copyright © 2011-2022 走看看