C++ MFC picture control控件按比例显示任意图片文件(jpg、bmp等)

前段时间做大一专业实训,用MFC做一个图片查看类程序,对于从来没有学过C++的我们来说显示一张图片就是一件很难的事情了,作为小组里唯一一个MFC设计者,我从网上有很多关于MFC图片控件显示的文章,但大多数文章描述的方法不能满足我们的需求。我们需要显示一个文件夹中任意一张图片,实现前后翻页,按比例显示,并且实现图片旋转。现在介绍如何在picture control中按比例显示一张任意格式的图片。

showpic();函数的实现

分为四个步骤
1.用image类创建一个图片对象,获取其宽和高;
2.获取控件句柄,从而获得控件客户区的相关参数;
3.计算,算出图片应该按怎样的比例显示出来;
4.获取控件的DC,将图片显示出来;

   下面先上代码,附部分注释

代码块

void ShowPic()//形参可以为所给的图片对象的指针,这里为了通用性省去了形参
{
    float cx, cy, dx, dy, k, t;//跟控件的宽和高以及图片宽和高有关的参数
    CRect   rect;//用于获取图片控件的宽和高
    CImage q;//为cimage图片类创建一个对象
    q.Load("你想加载的图片路径");//构造函数的形参是所加载图片的路径 
    cx = q.GetWidth();
    cy = q.GetHeight();//获取图片的宽 高
    k = cy / cx;//获得图片的宽高比

    CWnd *pWnd = NULL;
    pWnd = GetDlgItem(你定义的图片控件的ID);//获取控件句柄
    pWnd->GetClientRect(&rect);//获取Picture Control控件的客户区
    dx = rect.Width();
    dy = rect.Height();//获得控件的宽高比
    t = dy / dx;//获得控件的宽高比
    if (k >= t)
    {

        rect.right = floor(rect.bottom / k);
        rect.left = (dx - rect.right) / 2;
        rect.right = floor(rect.bottom / k) + (dx - rect.right) / 2;
    }
    else
    {
        rect.bottom = floor(k*rect.right);
        rect.top = (dy - rect.bottom) / 2;
        rect.bottom = floor(k*rect.right) + (dy - rect.bottom) / 2;
    }
    //相关的计算为了让图片在绘图区居中按比例显示,原理很好懂,如果图片很宽但是不高,就上下留有空白区;如果图片很高而不宽就左右留有空白区,并且保持两边空白区一样大

    CDC *pDc = NULL;
    pDc = pWnd->GetDC();//获取picture control的DC,这是什么玩意我也不知道,百度就行
    int ModeOld = SetStretchBltMode(pDc->m_hDC, STRETCH_HALFTONE);//设置指定设备环境中的位图拉伸模式

    GetDlgItem(Pic)->ShowWindow(FALSE);
    GetDlgItem(Pic)->ShowWindow(TRUE);
    q.StretchBlt(pDc->m_hDC, rect, SRCCOPY);//显示函数
    SetStretchBltMode(pDc->m_hDC, ModeOld);
    ReleaseDC(pDc);//释放指针空间
}

运行效果

竖版的按比例居中显示
这里写图片描述
横版的

总结

编译环境 VS2017
作者现在大二在读,水平有限,之前学过C语言,从零开始学C++到项目结题共用时10天,代码鄙陋,留给自己以后查找用。

  • 18
    点赞
  • 86
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值