效果如图:
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);
}