前段时间做大一专业实训,用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天,代码鄙陋,留给自己以后查找用。