VC++图片控件(Picture Control)显示资源位图(BMP)、文件位图(BMP)、其它格式文件图片(JPG\PNG\BMP)的方法
最后更新于:2022-04-01 20:35:16
在VC++ MFC编程中,我们常使用Picture Control图片控件来显示图像。下面简单归纳几种显示不同的方式:
(实例可在我的CSDN资源中下载:[http://download.csdn.net/detail/margin1988/8341525](http://download.csdn.net/detail/margin1988/8341525))
**第一种、资源位图方式显示BMP图片**
如果要显示的是一张BMP位图,则可以采用资源位图方式,具体步骤如下:
(1)将BMP文件拷贝到工程的res目录下;
(2)在对话框中添加一个Picture Control控件,例如:ID为IDC_STATIC1,Type设为Bitmap;
(3)在工程的资源视图下,右键“添加资源”,现在资源类型Bitmap,然后“导入”(1)中的文件,例如:导入后资源的ID为IDB_BITMAP1;
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-08-31_57c6b4a8ad1bc.jpg)
(4)为IDC_STATIC1 Picture Control控件添加Control类型变量,例如:CStatic m_resbmp;
(5)在此控件上显示来自资源中的BMP位图IDB_BITMAP1,代码如下:
~~~
HBITMAP hBitmap;
// 显示资源中的图像(仅限位图BMP)
hBitmap =(HBITMAP)LoadImage(AfxGetInstanceHandle(),
MAKEINTRESOURCE(IDB_BITMAP1),
IMAGE_BITMAP,0,0,
LR_LOADMAP3DCOLORS);
m_resbmp.SetBitmap(hBitmap);
~~~
**第二种、文件位图方式显示BMP图片**
如果要显示的是一张BMP位图,也可以采用文件位图的方式,具体步骤如下:
(1)将BMP文件拷贝到工程的可执行文件目录下(如:Debug目录,beixin.bmp文件);
(2)在程序中获取可执行文件目录的全路径,代码如下:
~~~
CString exepath;//exe路径
char filepath[256];
char *pPath;
GetModuleFileName(AfxGetInstanceHandle(),filepath,256);
pPath = strrchr(filepath,'\\');
*pPath = 0;
exepath = filepath;
~~~
(3)在对话框中添加一个Picture Control控件,例如:ID为IDC_STATIC2,Type设为Bitmap;
(4)为IDC_STATIC2 Picture Control控件添加Control类型变量,例如:CStatic m_filebmp;
(5)在此控件上显示来自文件的BMP位图beixin.bmp,代码如下:
~~~
// 显示文件中的图像(仅限位图BMP)
HBITMAP hBitmap;
CString filebmppath;
filebmppath.Format("%s\\beixin.bmp",exepath);//位图文件全路径
hBitmap = (HBITMAP)LoadImage(AfxGetInstanceHandle(),_T(filebmppath),IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
m_filebmp.SetBitmap(hBitmap);
~~~
**第三种、文件图片方式显示JPG\PNG\BMP等图片**
如果要显示的是一种JPG图片、PNG图片或者BMP图片(亦可)等其他格式的静态图片,则可使用文件图片的方式,步骤如下:
(1)将图片文件拷贝到工程的可执行文件目录下(如:Debug目录,shoutao.jpg\shoutao.png\shoutao.bmp文件);
(2)在程序中获取可执行文件目录的全路径,同上(第二种(2));
(3)在对话框中添加一个Picture Control控件,例如:ID为IDC_STATIC3,Type设为Frame;
(4)为IDC_STATIC3 Picture Control控件添加Control类型变量,例如:CStatic m_fileimg;
(5)在此控件上显示来自文件的JPG\PNG\BMP图片shoutao.jpg\shoutao.png\shoutao.bmp,代码如下:
~~~
//.h文件中
CFileFind finder;
void showimg(char* imgpath);//显示不同格式图片的函数
//.cpp文件中
void CPoint34Dlg::showimg(char* imgpath)
{
// 显示文件中的图像(不限图像格式)
if (finder.FindFile(imgpath))
{
CRect rect;
m_fileimg.GetClientRect(&rect);
CImage img;
img.Load(imgpath);
CDC* pDC = m_fileimg.GetWindowDC();
img.Draw(pDC->GetSafeHdc(),rect);
ReleaseDC(pDC);
}
}
~~~
~~~
//.h文件中
CString fileimgpath;
//.cpp文件中,调用图片显示函数
srand((unsigned)time(NULL));
int rd = rand()%3;
switch (rd)
{
case 0:
fileimgpath.Format("%s\\shoutao.bmp",exepath);
break;
case 1:
fileimgpath.Format("%s\\shoutao.png",exepath);
break;
case 2:
fileimgpath.Format("%s\\shoutao.jpg",exepath);
break;
}
showimg(fileimgpath.GetBuffer());//调用
~~~
(6)这种在Picture Control控件中显示图片的方式,千万不要忘记在对话框的OnPaint()中添加窗口更新、重绘图像,否则,被对话框最小化或被遮挡后,图像不能正常显示,在OnPaint()中添加代码如下:
~~~
CDialog::OnPaint();
//对话框被最小化或被遮挡后,图像不能正常显示,需要更新、重绘窗口
UpdateWindow();
showimg(fileimgpath.GetBuffer());
~~~
效果图如下:
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-08-31_57c6b4a8da4ac.jpg)
';