MFC-缩放位图

效果如图:

1.定义几个成员变量

    CBitmap m_bitmap;//存放新的位图对象
    CDC m_dc;        //DC对象
    CBitmap* m_pOldbmp;//旧的位图对象
    int m_iPercent;    //缩放位图的比例

    void FreeObject(); //释放对象

2.在构造函数中初始化

    //初始化
    m_iPercent = 100;
    m_pOldbmp = nullptr;

3.打开位图

CFileDialog dlg(TRUE, nullptr, nullptr, OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST,
        TEXT("*.bmp|*.bmp||"), this);
    if (dlg.DoModal())
    {
        //加载位图
        HBITMAP hBitmap = (HBITMAP)LoadImage(nullptr,
            dlg.GetPathName(), IMAGE_BITMAP, 0, 0, LR_DEFAULTSIZE | LR_LOADFROMFILE);
        if (!hBitmap)
        {
            AfxMessageBox(TEXT("加载位图失败"));
            return;
        }
        //当加载第二张位图的时候要释放旧的位图对象
        FreeObject();
        //添加位图
        m_bitmap.Attach(hBitmap);

        //创建兼容DC
        CDC* pDc = GetDC();
        m_dc.CreateCompatibleDC(pDc);
        ReleaseDC(pDc);
        //把位图对象选入DC中
        m_pOldbmp = m_dc.SelectObject(&m_bitmap);
        //使窗口无效,这样OnPaint函数就会被触发,使之被画出来
        Invalidate(FALSE);
    }

4.在OnPaint函数中把位图画到客户区

if (m_dc.GetSafeHdc() == nullptr)
        {   //如果没有新的位图对象选入dc则不必画
            CDialogEx::OnPaint();
        }
        else
        {
            //画图DC
            CPaintDC dc(this);
            //填充客户区为白色,避免缩放的时候客户区残留原来的位图
            CRect rect = { 0 };
            GetClientRect(&rect);
            FillRect(dc, &rect, (HBRUSH)GetStockObject(WHITE_BRUSH));
            //缩放位图
            BITMAP bm;
            m_bitmap.GetBitmap(&bm);
            dc.StretchBlt(0, 0, bm.bmWidth*m_iPercent / 100, bm.bmHeight*m_iPercent / 100,
                &m_dc, 0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY);
        }

5.利用鼠标滚轮控制位图大小
找到WM_MOUSEWHEEL消息,代码如下:

    //滚轮向后滚,缩小
    if (zDelta < 0)
    {
        m_iPercent -= 10;
        Invalidate(FALSE);
    }
    else //滚轮向前滚,放大
    {
        m_iPercent += 10;
        Invalidate(FALSE);
    }
  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值