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