MFC-缩放位图

效果如图:
MFC-缩放位图_第1张图片

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);
    }

你可能感兴趣的:(对象,mfc,位图,加载位图,缩放位图)