MFC中picture控件显示图片
- 格式:doc
- 大小:50.50 KB
- 文档页数:5
picturebox的使用方式PictureBox是.NET Framework中的一种控件,用于在Windows窗体应用程序中显示图片。
以下是PictureBox的使用方式:1.添加PictureBox控件:在Visual Studio中,从工具箱拖拽PictureBox控件到窗体上。
2.加载图片:在设计阶段,可以通过Picture属性加载图片。
单击Picture属性后的“…”按钮,弹出“加载图片”对话框,选择所需的图片文件后加载。
另外,也可以在代码中通过LoadPicture函数加载图片。
例如:c#pictureBox1.Image = Image.FromFile("D:\\MyGif\\AniGif0562.gif");或c#pictureBox1.Image = new Bitmap("D:\\MyGif\\AniGif0562.gif");3.显示图片:通过PictureBox控件的SizeMode属性设置图片的显示模式。
SizeMode属性有9种模式,可以根据实际需求进行选择。
4.保存图片:可以通过访问PictureBox的Image属性,使用Bitmap类的Save方法将图片保存到文件中。
例如:c#pictureBox1.Image.Save("D:\\MyGif\\AniGif0562.gif",System.Drawing.Imaging.ImageFormat.Gif);5.删除图片:在设计阶段,可以通过按Delete键删除PictureBox控件,然后从工具箱拖拽一个新的PictureBox控件到窗体上。
或在属性对话框里的Picture属性,把“(位图)”这几个反白,或是移到“(”的最前端,按一下键盘的Delete键即可移除图片。
6.响应鼠标事件:可以通过编写事件处理程序,响应PictureBox控件的鼠标事件,例如单击、双击、鼠标移动等。
MFCPictureControl自适应控件大小显示图片,失真和不失真MFC Picture Control 自适应控件大小显示图片,失真和不失真StretchBlt和BitBlt都用在双缓冲视图中,用来显示一幅图像一、StretchBlt函数从源矩形中复制一个位图到目标矩形,必要时按目标设备设置的模式进行图像的拉伸或压缩。
也即是将内存中的位图拷贝到屏幕上,并且可以根据屏幕画图区的大小来进行伸缩,适应响应的屏幕(或图像控件)BOOL StretchBlt( int x, int y, int nWidth, int nHeight, CDC* pSrcDC, int xSrc, int ySrc, int nSrcWidth, int nSrcHeight, DWORD dwRop );x:逻辑单元x轴左上角坐标;(获取图像控件的DC后,该值一般设为0 )y:逻辑单元y轴左上角坐标;(获取图像控件的DC后,该值一般设为0 )nWidth:设备矩形宽度;(即是图像控件的宽度,通过int rcWidth = rc.right - rc.left;来获得,rc为保存了图像控件矩形区坐标信息)nHeight:设备矩形高度;(即是图像控件的高度,通过int rcHeight = rc.bottom - rc.top;来获得)pSrcDC:源设备上下文;(就是我们定义的内存DC,然后取地址)xSrc :源矩形x轴左上角坐标;(一般都是整幅图片拷贝,所以该值为0 )ySrc:源矩形y轴左上角坐标;(一般都是整幅图片拷贝,所以该值为0 )Specifies the x-coordinate (in logical units) of the upper-left corner of the source rectangle.nSrcWidth:源矩形宽度;(如果我们定义了一个结构体BITMAP 类型m_bmp保存位图信息,那么可以用m_bmp.bmWidth 获取宽度)nSrcHeight:源矩形高度(如果我们定义了一个结构体BITMAP 类型m_bmp保存位图信息,那么可以用m_bmp.bmHeight 获取宽度)dwRop:指定要进行的光栅操作。
mfc中picture control使用在MFC中,Picture Control是一个用于显示图片的用户界面控件。
它通常用于在应用程序中展示图像内容。
以下是使用MFC中的Picture Control控件的步骤:1、添加Picture Control控件:在Visual Studio的设计视图中,打开你的对话框资源。
在工具箱中,找到Picture Control 控件并将其拖动到对话框上。
2、关联Picture Control控件与变量:选中Picture Control控件,在属性窗口中找到IDC_STATIC对应的ID,然后将其改为一个唯一的ID,比如IDC_PICTURE。
同时,在Class View中为该控件添加一个对应的变量,类型选择为CStatic。
3、加载并显示图片:在代码中找到对应的消息处理函数(例如OnInitDialog),然后使用以下代码加载并显示图片:cpp// 加载图片资源HRSRC hResource = FindResource(AfxGetResourceHandle(),MAKEINTRESOURCE(IDB_PICTURE), RT_RC);HGLOBAL hGlobal = LoadResource(AfxGetResourceHandle(), hResource);// 获取图片数据的指针LPCTSTR lpData = (LPCTSTR)LockResource(hGlobal);// 计算图片大小DWORD dwSize = SizeofResource(AfxGetResourceHandle(), hResource);// 创建位图对象CBitmap bitmap;bitmap.CreateFromBase(lpData, dwSize, NULL, LR_CREATEDIBSECTION);// 获取Picture Control控件的句柄HWND hWndPicture = GetDlgItem(IDC_PICTURE);// 创建兼容的DC(设备上下文)对象CDC compatibleDC;compatibleDC.CreateCompatibleDC(&compatibleDC);// 创建位图对象兼容的位图CBitmap* pOldBitmap = compatibleDC.SelectObject(&bitmap);// 将位图绘制到Picture Control控件上BitBlt(hWndPicture, 0, 0, bitmap.GetWidth(), bitmap.GetHeight(), &compatibleDC, 0, 0, SRCCOPY);// 释放资源compatibleDC.SelectObject(pOldBitmap);FreeResource(hGlobal);上述代码假设你的图片资源已经添加到资源文件中,并且资源的ID为IDB_PICTURE。
利用 MFC 的 Picture 控件显示和处理图像在《OpenCV 教程-基础篇》的 2.8 节中,所创建的 MFC 图像显示是直接放在对话框面板的左上 角的,感觉不大美观;《MFC 中快速应用 OpenCV》 则是介绍用 SDI(单文档界面)来显示图 像,《A step-by-step guide to the use of Microsoft Visual C++ and the Intel OpenCV library》 使用 VS2005 来进行图像和视频的读取和处理,但是其图像和视频的显示界面不是在对话框里面 的,而是新建一个窗口来做。
所以下面我们就来看看怎么在对话框里使用 Picture 控件来显示和 处理图像。
[编辑]创建 MFC首先创建一个 MFC 对话框应用程序(Dialog-based Application)如下:在 VS2005 和 2008 里,我们可以用一个 Solution 来组合几个 Project (每个 Project 基本上 只包含一个 Program),当我们要构建一个多 Program 的应用时(例如一个客户端程序加一个 服务器应用程序),利用 Solution 可以将这些 Projects 组合起来、并且共享文件和函数库。
通常需要为 Solution 创建一个主路径,其中包含了所有 Projects 的路径。
不过在这篇文章里, 我们只构建一个简单的 Project,所以在创建 MFC 的 New Project 对话框里,不用勾选“Create directory for solution”这个选项。
点击 OK -- Next 进入下一步,在这里我们创建一个 Dialog-based Application,大部分选项按默 认设置就行,不过最下面的“Use Unicode libraries”最好去掉。
如果勾选了这个选项,程序代码 就会使用 16bit 的 Unicode 字符集来编码,但是很多函数虽然使用 char* (ASCII stings) 类型字 符,而将字符串从 Unicode 转换到 ASCII 是非常麻烦的。
MFC利用图像数据在Picture控件中显示2011-06-15 19:55:21| 分类:默认分类| 标签:mfc 数据数组显示|举报|字号大中小订阅在网上一直搜不到利用图像数据显示的代码,后来自己忙活了几天总算是搞定了。
CDC* pDC=GetDC(); //获得当前窗口句柄CRect rcBmp;GetDlgItem(IDC_IMAGEVIEW)->GetWindowRect(rcBmp); //IDC_IMAGEVIEW是picture控件IDScreenToClient(&rcBmp);BITMAPINFO *m_pBMI = (BITMAPINFO*)new BYTE[sizeof(BITMAPINFOHEADER)+256*sizeof(RGBQUAD)];m_pBMI->bmiHeader.biBitCount = 24;// 24位图像数据结构,需要用3个BYTE的数据类型构造m_pBMI->bmiHeader.biClrImportant = 0;m_pBMI->bmiHeader.biCompression = 0;m_pBMI->bmiHeader.biHeight = -image_rawHeight; //负号使显示的图像不出现倒置情况,因为图像是自底向上填写的m_pBMI->bmiHeader.biClrUsed =256;//0;m_pBMI->bmiHeader.biPlanes = 1;m_pBMI->bmiHeader.biSize = 40;m_pBMI->bmiHeader.biSizeImage = image_rawHeight*image_rawWidth*3;//m_pBMI->bmiHeader.biWidth = image_rawWidth;m_pBMI->bmiHeader.biXPelsPerMeter = 0;m_pBMI->bmiHeader.biYPelsPerMeter =0;for(int i = 0; i<256;i++){m_pBMI->bmiColors[i].rgbBlue =i;m_pBMI->bmiColors[i].rgbGreen =i;m_pBMI->bmiColors[i].rgbRed =i;m_pBMI->bmiColors[i].rgbReserved = 0;}SetDIBitsToDevice(pDC->m_hDC,rcBmp.left,rcBmp.top,rcBmp.Width(),rcBmp.Height(),0,0,0,image_rawHeight,Gray,m_pBMI,DIB_RGB_COLORS); ////////struct Pixel{BYTE gray[3];};Pixel *Gray=new Pixel[numPixels];上述Gray的声明过程。
上一节中鸡啄米讲的是滚动条控件,本节主要讲一种简单实用的控件,图片控件Picture C ontrol。
我们可以在界面某个位置放入图片控件,显示图片以美化界面。
图片控件简介图片控件和前面讲到的静态文本框都是静态文本控件,因此两者的使用方法有很多相同之处,所属类都是CStatic类,有关成员函数已在前面介绍,这里就不重复了。
图片控件静态和动态加载图片鸡啄米下面为大家演示如何为图片控件静态和动态加载位图图片。
1. 图片控件静态加载图片1)创建一个基于对话框的MFC工程,名称设置为“Example27”。
2)准备一张Bitmap图片,名称设为“test.bmp”,放到工程的res文件夹中,res文件夹路径为...\Example27\Example27\res。
鸡啄米在这里用的是一张鸡啄米网站的截图。
3)在Resource View中的“Example27.rc*”节点上点右键,选择“Add Resource...”,弹出“Add Resource”对话框:然后在左侧的“Resource Type”中选择“Bitmap”,点按钮“Import”,显示一个文件对话框,我们选择res文件夹中的test.bmp图片文件,导入成功后会在Resource View的Exa mple27.rc*节点下出现一个新的子节点“Bitmap”,而在“Bitmap”节点下可以看到刚添加的位图资源IDB_BITMAP1,这里的默认ID就不修改了。
4.)在自动生成的对话框模板IDD_EXAMPLE27_DIALOG中,删除“TODO: Place di alog controls here.”静态文本控件、“OK”按钮和“Cancel”按钮。
添加一个Picture Control 控件,在图片控件的属性页中有一个Type属性,Type属性下拉列表中有8种类型,下面分别介绍下:Frame:显示一个无填充的矩形框,边框颜色可以通过Color属性的下拉列表设定Etched Horz:显示一条横分割线Etched Vert:显示一条竖分割线Rectangle:显示一个填充的矩形框,矩形颜色可通过Color属性的下拉列表设定Icon:显示一个图标(Icon),图标通过Image 下拉列表来设置图标资源IDBitmap:显示一个位图(Bitmap),位图通过Image 下拉列表来设置位图资源IDEnhanced Metafile:显示一个加强的元数据文件(Metafile)Owner Draw:自绘因为我们要加载的是位图图片,所以Type属性选择Bitmap。
void CreadpictureDlg::OnBnClickedButtonImageimport(){//指定路径,动态载入图片// TODO: 在此添加控件通知处理程序代码CString FilePathName; //定义一个字符串,来保存文件的路径CFileDialogdlg(TRUE,_T("*.bmp"),NULL,OFN_FILEMUSTEXIST|OFN_PATHMUSTEXIST|OFN_HIDEREADONLY, _T("image files(*.bmp;*.jpg)|*.bmp;*.jpg|ALL file(*.*)|*.*||"),NULL );dlg.m_ofn.lpstrTitle=_T("Open Image"); //CFileDialog类封装了Windows常用的文件对话框。
常用的文件对话框提供了一种简单的与Windows标准相一致的文件打开和文件存盘对话框功能。
if(dlg.DoModal()!=IDOK) //调用DoModal成员函数显示对话框并使用户输入路径和文件return;FilePathName=dlg.GetPathName();IplImage* ipl=cvLoadImage(FilePathName,1);//读取文件的文件名和深度//读取图片缓冲到局部变量里if (!ipl) //判断是否成功载入图片{return;}//cvReleaseImage(ipl); // 对读入的图片进行缩放,使其宽或高最大值者刚好等于256,再复制到 TheImage 中ImageShow(ipl);cvReleaseImage(&ipl); //释放指针占用的内存}void CreadpictureDlg::ImageShow(IplImage *tmp){CDC*pDC=GetDlgItem(IDC_STATIC_IAMGESHOW)->GetDC(); // 获得显示控件的 DCHDC hDC=pDC->GetSafeHdc(); // 获取 HDC(设备句柄) 来进行绘图操作GetDlgItem(IDC_STATIC_IAMGESHOW)->GetClientRect(&rect);cimg.CopyOf(tmp,IPL_DEPTH_8U);cimg.DrawToHDC(hDC,&rect);ReleaseDC(pDC);}void CreadpictureDlg::ImageShow2(IplImage *tmp) //再定义一个PictureControl控件,获取句柄显示图片{CDC*pDC=GetDlgItem(IDC_STATIC_IMAGESHOW2)->GetDC(); // 获得显示控件的 DCHDC hDC=pDC->GetSafeHdc(); // 获取 HDC(设备句柄) 来进行绘图操作GetDlgItem(IDC_STATIC_IMAGESHOW2)->GetClientRect(&rect);cimg.CopyOf(tmp,IPL_DEPTH_8U);cimg.DrawToHDC(hDC,&rect);ReleaseDC(pDC);}。
对话框的背景1、添加位图背景首先在资源视图中添加bmp图片:选择项目名右击---添加—添加资源---Bitmap---导入---选择res文件中的位图(如果res文件中无位图请提前添加),此时可以知道位图ID为IDB_BITMAP1(1)picture控件添加背景在对话框中添加picture控件,并修改其属性,选中picture控件在属性表中修改Type为Bitmap,Image为IDB_BITMAP1。
此时图片就显示在对话框中(2)在CPP文件中初始化显示位图添加位图后,在源文件XXXDlg.cpp的void C XXX Dlg::OnPaint()函数中添加初始化代码如下:void CbeijingDlg::OnPaint(){if (IsIconic()){CPaintDC dc(this); // 用于绘制的设备上下文SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);// 使图标在工作区矩形中居中int cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2;// 绘制图标dc.DrawIcon(x, y, m_hIcon);}else{CPaintDC dc(this);CRect rect;GetClientRect(&rect);CDC dcMem;dcMem.CreateCompatibleDC(&dc);CBitmap bmpBackground;bmpBackground.LoadBitmap(IDB_BITMAP1);BITMAP bitmap;bmpBackground.GetBitmap(&bitmap);CBitmap *pbmpPri=dcMem.SelectObject(&bmpBackground);dc.StretchBlt(0,0,rect.Width(),rect.Height(),&dcMem,0,0,bitmap.bmWidth,bitmap.bmHeight,SRCCOPY);}}2、设置纯色背景点击对话框添加成员变量CBrush m_brush,然后在源文件XXXDlg.cpp初始化位置添加如下代码:// TODO: 在此添加额外的初始化代码?m_brush.CreateSolidBrush(RGB(0,0,255)); /////添加的代码,用于创建蓝色画刷return TRUE; // 除非将焦点设置到控件,否则返回TRUE然后找到WM_CTLCOLOR消息,添加对应的函数OnCtlColor()添加如下代码:HBRUSH CbeijingsehewenziDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor){HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);// TODO: 在此更改DC 的任何特return m_brush;// TODO: 如果默认的不是所需画笔,则返回另个画笔// return hbr;}这样运行后对话框背景色就变为蓝色。
MFC 在对话框显示图片的多种方法我们先从简单的开始吧.先分一个类:(一) 非动态显示图片(即图片先通过资源管理器载入,有一个固定ID)(二) 动态载入图片(即只需要在程序中指定图片的路径即可载入)为方便说明,我们已经建好一个基于对话框的工程,名为Ttest.对话框类为CTestDlg(一) 非动态载入图片.方法1.先从最简单的开始,用picture 控件来实现. 步骤:先在资源里Import一张图片,ID为IDB_BITMAP2 然后在对话框上添加一个picture控件,右键点击打开属性,将type下拉框选择BITMAP,紧跟着下面就出现一个Image下拉框,拉开就会看到所有已经载入好的图片,选择你要的图片.运行程序即可看到.方法2.通过背景图同样如上,先载入一张图片,ID为IDB_BITMAP2 TestDlg.h中CBrush m_brBk;//在public中定义TestDlg.cpp中在初始化函数OnInitDialog()中加入:BOOL CTestDlg::OnInitDialog(){CDialog::OnInitDialog();CBitmap bmp;bmp.LoadBitmap(IDB_BITMAP2);m_brBk.CreatePatternBrush(&bmp);bmp.DeleteObject();...return TRUE; // return TRUE unless you set the focus to a control}在打开类向导,找到WM_CTLCOLOR消息,重载得对应函数OnCtlColor(),添加如下:HBRUSH CTestDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor){HBRUSH hbr =CDialog::OnCtlColor(pDC, pWnd, nCtlColor);if (pWnd == this){return m_brBk;}return hbr;}(二) 动态载入图片.方法3 图像控件(本例用KoDak 图像编辑控件)1. 首先应该保证系统中有这个控件。
学了MFC一段时间后,试着要用对话框打开一幅bmp图像并保存,结果发现网上这些资料太少了,而且有的也讲不清,讲不全,所以自己磕磕碰碰捣鼓了好久,期间也谢谢各位大神的指导,现在我终于完成,特意写出来与大家分享,各位菜鸟共勉。
一、首先要先了解bmp位图结构可以去看看,内容不多但是够看,也容易懂二、了解位图的显示函数SetStretchBltMode()StretchDIBits()具体函数介绍自己百度一下,我就不多说了三、开始做啦1、新建一个MFC对话框文档默认其他设置,点击完成后会出现这个界面&在按钮上单击鼠标右键,在弹出的列表中选择属性把标题改为读取图片再添加一个按钮,把ID改为IDC_SAVE,标题改为保存图片在控件中选择图像,然后在对话框画一个大小适宜的矩形框,在选中对话框点击右键,选择属性,把ID改为IDC_PICTURE回到对话框界面,双击读取图片按钮,这时会弹出一个对话框,点确定然后就会跳到关联函数这边了先把CDialog::OnOK();注释起来,这个是点击按钮后对话框就会关闭的函数【然后在MP", NULL, NULL,"位图文件(*.BMP)|*.bmp;*.BMP|",this);CFile bmpFile;pp文件头处添加BITMAPINFO* pBmpInfo;MP", NULL, NULL,"位图文件(*.BMP)|*.bmp;*.BMP|");if (!() == IDC_SAVE) return;strFileName = ();if (strFileName, CFile::modeCreate | CFile::modeReadWrite) == 0) return ;Widthbytes = (iBmpWidth*3+3)/4*4;//位图对齐,确保为4的倍数/* BITMAPFILEHEADER结构填写 */`= 0x4d42;=sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);= + Widthbytes *iBmpHeight;= 0;= 0;/* BITMAPINFOHEADER结构填写 */= sizeof(BITMAPINFOHEADER);= iBmpWidth;=iBmpHeight;= 1;\= 24;//24位= BI_RGB;=0;= 0;= 0;= 0;= 0;(&bmpf,sizeof(bmpf));//写文件头;(&bmpi,sizeof(bmpi));//写信息头;|(pBmpData,Widthbytes*iBmpHeight);//写图像数据信息;();OK全部完成了,编译运行一下,点击打开图片按钮就能显示图片了呵呵,写得不够专业,还望大家不吝赐教。
MFC控件使用详细教程一、 Picture Control控件1、Picture Control控件功能简介Picture Control是Visual Basic提供的一种使用图像替换文本的控件,可以方便地将图像放入Visual Basic中,然后可以通过控件来显示图像,还可以处理图像的改变、放大、缩小等功能,可以很好地满足窗体应用程序中对图像处理的需求。
2、Picture Control控件实现步骤(1) 将Picture Control控件放入窗体中在Visual Basic的工具箱中,将Picture Control控件拖放放到工作表窗体中,即可实现Picture Control控件。
(2) 设置Picture Control控件设置Picture Control控件属性,包括Picture、BackStyle、BorderStyle等属性,将图像加入控件中,可以通过以下几种方式实现:a. 通过LoadPicture方法加载图像Picture1.LoadPicture("C:\MyDocuments\Pictures\MyPicture.bmp")b. 通过Picture属性加载图像Picture1.Picture=LoadPicture("C:\MyDocuments\Pictures\MyPict ure.bmp")(3) Picture Control控件的使用Picture Control控件最常用的是将图像放入控件中,通过设置Picture属性即可实现:Picture1.Picture=LoadPicture("C:\MyDocuments\Pictures\MyPict ure.bmp")Picture Control控件还可以处理图像的改变、放大、缩小等功能:'放大图像Picture1.Stretch = TruePicture1.Width = Picture1.Width * 2Picture1.Height = Picture1.Height * 2'缩小图像Picture1.Width = Picture1.Width / 2Picture1.Height = Picture1.Height / 2'改变图像Picture1.Picture =LoadPicture("C:\MyDocuments\Pictures\NewPicture.bmp")二、 Listbox Control控件1、Listbox Control控件功能简介Listbox Control是Visual Basic提供的一种使用列表显示内容的控件,可以将多个字符串文本放在一个列表中,用户可以在列表框中进行选择,进行操作,也可以设置列表框的属性。
如何使用MFC显示多张图片1、打开VS2008软件,创建一个MFC对话框应用程序(Dialog-based Application),在名称栏输入创建项目的名称,点击“确定”。
如下图所示:在出现的“MFC应用程序向导”对话框内,选择“基于对话框”,并取消“使用Unicode库(N)”其他选项不做修改,单击“下一步”,如下图所示:一直点击“下一步”到“生成的类”对话框,选择基类为“CDialog”单击完成即可创建一个MFC对话框。
如下图所示:2、点击删除3、添加控件并导入图片生成如下图所示的初始的GUI界面,在工具箱中单击“Picture Control”,将鼠标移动到GUI界面内,这样就在此界面添加了一个Picture控件。
并修改其类型为,ID改为IDC_PICTURE。
4、接着,在“资源视图”下,右击选择“添加资源”,在“添加资源”对话框的“资源类型”下选择“Bitmap”,再单击“导入(M)”,打开BMP图片。
如下图所示:5、导入图片后,如图,同时修改第四张图的ID为IDB_busyman(点击第四张图在其属性栏中修改)如图,6、点击图中青色图标在其属性栏中的“Image”中后面填上IDB_busyman7、点击运行,检验MFC显示一张图片是否正确,运行后如图8、说明正确,点击确定。
然后点击工具栏中的往上图中添加此按钮如图9、修改其ID为IDC_COMBO_SELECTPIC,点击控制事件按钮,并在添加OnCbnSelchangeComboSelectpic()10、右击图中添加变量名为m_choice11、右击类视图下的添加变量类型都为CBitmap,变量名分别为m_Bmp1,m_Bmp2,m_Bmp3,m_Bmp4的四个变量。
12、右击上图中的照片右击添加变量,变量名为m_PicChoiced13、在解决方案管理器中选择,在下面添加:CString strTemp;((CComboBox*)GetDlgItem(IDC_COMBO_SELECTPIC))->ResetContent();for(int i = 1; i<5; i++){strTemp.Format("Picture %d",i);((CComboBox*)GetDlgItem(IDC_COMBO_SELECTPIC))->AddString(strTemp);}m_choice.SetCurSel(0);m_Bmp1.LoadBitmap(IDB_busyman);m_Bmp2.LoadBitmap(IDB_BITMAP1);m_Bmp3.LoadBitmap(IDB_BITMAP2);m_Bmp4.LoadBitmap(IDB_BITMAP3);14、在OnCbnSelchangeComboSelectpic()下添加:int CurSel = m_choice.GetCurSel();switch (CurSel){case 0:m_PicChoiced.SetBitmap(m_Bmp1);break;case 1:m_PicChoiced.SetBitmap(m_Bmp2);break;case 2:m_PicChoiced.SetBitmap(m_Bmp3);break;case 3:m_PicChoiced.SetBitmap(m_Bmp4);break;default:break;} // TODO: 在此添加控件通知处理程序代码15、点击运行即可见到如下图:。
在MFC中显示一幅图像的步骤:1.创建一个位图对象CBitmap bitmap;2.载入位图bitmap.loadbitmap();3.创建一个矩形对象CRect rect;获取客户区矩形窗口getwindrect4.创建客户区DC并且获取客户区DCCCLientdc dc(this);5.创建设备描述表:CDC memdc;6.创建兼容DC memdc.creatcompatibleDC(关联客户DC)7.创建一个位图结构体用来获取要显示的位图信息BITMAP bm;bitmap.Getbitmap(&bm);8.选择对象Cbitmap *poldbitmap=memdc.selectobject(&bitmap); 9.显示位图用这个函数:BitBlt(int x,int y,int nWidth,int nHeight,CDC*pSrcDC,int xSrc,int ySrc, DWORD dwRop);或者用这个函数StretchBlt(int x,int y,int nWidth,int nHeight,CDC*pSrcDC,int xSrc,int ySrc, int nSrcWidth,int nSrcHeight,DWORD dwRop);10.再次选择位图Memdc.selectobject(&pOldbitmap);下面是整个程序:先创建一个MFC程序,单文档的,其他的都默认设置。
点击完成即可点击插入或者按下ctral+r,接着插入位图资源选择要显示的位图资源接着进入OnDraw 函数,编程添加如下代码:void CPicturedlgView::OnDraw(CDC* pDC){CPicturedlgDoc* pDoc = GetDocument();ASSERT_V ALID(pDoc);// TODO: add draw code for native data hereCBitmap bitmap;//创建位图对象bitmap.LoadBitmap(IDB_BITMAP1);//载入位图资源CRect rect;GetWindowRect(&rect);//创建一个矩形结构体,获取显示窗口的边界数据,传递给rect结构体///////////创建客户区DCCClientDC dc(this);////////创建暂存DCCDC memdc;//////创建兼容DCmemdc.CreateCompatibleDC(&dc);BITMAP bm;//////创建位图结构体bm;bitmap.GetBitmap(&bm);/////////获取位图信息CBitmap *pOldbitmap=memdc.SelectObject(&bitmap);////////选择位图/////////显示位图dc.SetStretchBltMode(COLORONCOLOR);dc.StretchBlt(5,5,rect.right-rect.left-10,rect.bottom-rect.top,&memdc,0,0,bm.bmWidth,b m.bmHeight,SRCCOPY);dc.SelectObject(pOldbitmap);///////在此选择位图}运行后显示如下:。
学了MFC一段时间后,试着要用对话框打开一幅bmp图像并保存,结果发现网上这些资料太少了,而且有的也讲不清,讲不全,所以自己磕磕碰碰捣鼓了好久,期间也谢谢各位大神的指导,现在我终于完成,特意写出来与大家分享,各位菜鸟共勉。
一、首先要先了解bmp位图结构/d06c23543c1ec5da50e2706d.html可以去看看,内容不多但是够看,也容易懂二、了解位图的显示函数SetStretchBltMode()StretchDIBits()具体函数介绍自己百度一下,我就不多说了三、开始做啦1、新建一个MFC对话框文档默认其他设置,点击完成后会出现这个界面在按钮上单击鼠标右键,在弹出的列表中选择属性把标题改为读取图片再添加一个按钮,把ID改为IDC_SA VE,标题改为保存图片在控件中选择图像,然后在对话框画一个大小适宜的矩形框,在选中对话框点击右键,选择属性,把ID改为IDC_PICTURE回到对话框界面,双击读取图片按钮,这时会弹出一个对话框,点确定然后就会跳到关联函数这边了先把CDialog::OnOK();注释起来,这个是点击按钮后对话框就会关闭的函数然后在// CDialog::OnOK();下面添加以下代码代码都有注释,不懂的地方可以自己再百度//CFileDialog为VC中打开文件对话框类BITMAPFILEHEADER bmpHeader;//文件头BITMAPINFOHEADER bmpInfo;//信息头CFileDialog dlg(TRUE, "*.BMP", NULL, NULL,"位图文件(*.BMP)|*.bmp;*.BMP|",this);CFile bmpFile;//记录打开文件CString strFileName;//记录选择文件路径if (!dlg.DoModal() == IDOK) return;strFileName = dlg.GetPathName();//以只读的方式打开文件if(!bmpFile.Open(strFileName, CFile::modeRead|CFile::typeBinary)) return;if(bmpFile.Read(&bmpHeader,sizeof(BITMAPFILEHEADER)) != sizeof(BITMAPFILEHEADER)){AfxMessageBox("read bmp header failed!");return;}if (bmpHeader.bfType != 0x4d42){AfxMessageBox("invalid file type!");return;}if(bmpFile.Read(&bmpInfo,sizeof(BITMAPINFOHEADER)) != sizeof(BITMAPINFOHEADER)){AfxMessageBox("read bmp infor header failed!");return;}if (bmpInfo.biBitCount != 24){AfxMessageBox("File is not 24 bit.Application doesn't support this kind of file!");return;}pBmpInfo = (BITMAPINFO *)new char[sizeof(BITMAPINFOHEADER)];if (!pBmpInfo){AfxMessageBox("memory error!");return;}//为图像数据申请空间memcpy(pBmpInfo,&bmpInfo,sizeof(BITMAPINFOHEADER));DWORD dataBytes = bmpHeader.bfSize - bmpHeader.bfOffBits;pBmpData = (BYTE*)new char[dataBytes];if (!pBmpData){AfxMessageBox("memory error!");delete pBmpData;return;}if (bmpFile.Read(pBmpData,dataBytes) != dataBytes){AfxMessageBox("Read bmp data failed!");delete pBmpInfo;delete pBmpData;return;}bmpFile.Close();CWnd *pWnd=GetDlgItem(IDC_PICTURE);//获得pictrue控件窗口的句柄CRect rect;pWnd->GetClientRect(&rect);//获得pictrue控件所在的矩形区域CDC *pDC=pWnd->GetDC();//获得pictrue控件的DC//显示图片pDC->SetStretchBltMode(COLORONCOLOR);StretchDIBits(pDC->GetSafeHdc(),0,0,rect.Width(),rect.Height(),0,0,bmpInfo.biWidth,bmpI nfo.biHeight,pBmpData,pBmpInfo,DIB_RGB_COLORS,SRCCOPY);iBmpWidth=bmpInfo.biWidth;iBmpHeight=bmpInfo.biHeight;然后在这个.cpp文件头处添加BITMAPINFO* pBmpInfo; //记录图像细节BYTE* pBmpData; //图像数据int iBmpWidth; // 输入的宽度,以像素为单位int iBmpHeight; // 输入的高度,以像素为单位这些是全局变量,主要是为了后面图像保存可以用的再回到对话框界面,双击保存图片按钮,这时会弹出一个对话框,点确定然后就会跳到关联函数这边了在// TODO: Add your control notification handler code here下添加下面这些代码BITMAPFILEHEADER bmpf;//文件头BITMAPINFOHEADER bmpi;//信息头int Widthbytes;CFile bmpFile;CString strFileName;CFileDialog dlg(FALSE, "*.BMP", NULL, NULL,"位图文件(*.BMP)|*.bmp;*.BMP|");if (!dlg.DoModal() == IDC_SA VE) return;strFileName = dlg.GetPathName();if (bmpFile.Open(strFileName, CFile::modeCreate | CFile::modeReadWrite) == 0) return ;Widthbytes = (iBmpWidth*3+3)/4*4;//位图对齐,确保为4的倍数/* BITMAPFILEHEADER结构填写*/bmpf.bfType = 0x4d42;bmpf.bfOffBits =sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);bmpf.bfSize = bmpf.bfOffBits + Widthbytes *iBmpHeight;bmpf.bfReserved1 = 0;bmpf.bfReserved2 = 0;/* BITMAPINFOHEADER结构填写*/bmpi.biSize = sizeof(BITMAPINFOHEADER);bmpi.biWidth = iBmpWidth;bmpi.biHeight =iBmpHeight;bmpi.biPlanes = 1;bmpi.biBitCount = 24;//24位bmpi.biCompression = BI_RGB;bmpi.biSizeImage =0;bmpi.biXPelsPerMeter = 0;bmpi.biYPelsPerMeter = 0;bmpi.biClrUsed = 0;bmpi.biClrImportant = 0;bmpFile.Write(&bmpf,sizeof(bmpf));//写文件头;bmpFile.Write(&bmpi,sizeof(bmpi));//写信息头;bmpFile.Write(pBmpData,Widthbytes*iBmpHeight);//写图像数据信息;bmpFile.Close();OK全部完成了,编译运行一下,点击打开图片按钮就能显示图片了呵呵,写得不够专业,还望大家不吝赐教。
VS2010中MFC利用CImage类显示图像我们知道,Visual C++的CBitmap类和静态图片控件的功能是比较弱的,它只能显示出在资源中的图标、位图、光标以及图元文件的内容,而不像VB中的Image控件可以显示出绝大多数的外部图像文件(BMP、GIF、JPEG等)。
因此,想要在对话框或其他窗口中显示外部图像文件则只能借助于第三方提供的控件或代码。
现在,MFC和ATL共享的新类CImage为图像处理提供了许多相应的方法,这使得Visual C++在图像方面的缺憾一去不复返了。
一、CImage类概述CImage是MFC和ATL共享的新类,它能从外部磁盘中调入一个JPEG、GIF、BMP和PNG格式的图像文件加以显示,而且这些文件格式可以相互转换。
由于CImage在不同的Windows操作系统中其某些性能是不一样的,因此在使用时要特别注意。
例如,CImage::PlgBlt和CImage::MaskBlt只能在Windows NT 4.0 更高版本中使用,但不能运行在Windows 95/98 应用程序中。
CImage::AlphaBlend和CImage::TransparentBlt也只能在Windows 2000/98或其更高版本中使用。
即使在Windows 2000运行程序还必须将stdafx.h文件中的WINVER和_WIN32_WINNT的预定义修改成0x0500才能正常使用。
二、MFC中使用CImage类显示图像在图像控件(pictureControler)上(1)环境:Visual Studio 2010(2)如何使用?在使用的类头文件中,加入头文件“#include "atlimage.h"”(3)解决:1.类试图中,通过向导为Picture控件添加变量,如果不成功,则手动添加。
参考(VS2010为Picture Control手动添加变量)2.在对应的函数里添加如下代码:CImage image; //创建图片类image.Load(rphoto); //根据图片路径加载图片CRect rect;//定义矩形类int cx = image.GetWidth();//获取图片宽度int cy = image.GetHeight();//获取图片高度GetDlgItem(IDC_PICTURE)->GetWindowRect(&rect);//将窗口矩形选中到picture控件上ScreenToClient(&rect);//将客户区选中到Picture控件表示的矩形区域内GetDlgItem(IDC_PICTURE)->MoveWindow(rect.left, rect.top, cx, cy, TRUE);//将窗口移动到Picture控件表示的矩形区域CWnd *pWnd=GetDlgItem(IDC_PICTURE);//获得pictrue控件窗口的句柄pWnd->GetClientRect(&rect);//获得pictrue控件所在的矩形区域CDC *pDC=pWnd->GetDC();//获得pictrue控件的DCimage.Draw(pDC->m_hDC, rect); //将图片画到Picture控件表示的矩形区域18. ReleaseDC(pDC);//释放picture控件的DC CImage image; //创建图片类image.Load(rphoto); //根据图片路径加载图片CRect rect;//定义矩形类int cx = image.GetWidth();//获取图片宽度int cy = image.GetHeight();//获取图片高度GetDlgItem(IDC_PICTURE)->GetWindowRect(&rect); //将窗口矩形选中到picture控件上ScreenToClient(&rect);//将客户区选中到Picture控件表示的矩形区域内GetDlgItem(IDC_PICTURE)->MoveWindow(rect.left, rect.top, cx, cy, TRUE);//将窗口移动到Picture控件表示的矩形区域CWnd *pWnd=GetDlgItem(IDC_PICTURE);//获得pictrue控件窗口的句柄pWnd->GetClientRect(&rect);//获得pictrue控件所在的矩形区域CDC *pDC=pWnd->GetDC();//获得pictrue控件的DC image.Draw(pDC->m_hDC, rect); //将图片画到Picture控件表示的矩形区域ReleaseDC(pDC);//释放picture 控件的DC3.编译,运行。
OpenCV學習筆記(9)利用MFC的Picture控件顯示圖像+播放視頻和捕獲攝像頭畫面收藏人:彦北2013-06-16 | 阅:2724 转:8 | 来源 | 分享/rocky69/article/details/7726553P.S.:後面又添加了播放視頻和捕獲攝像頭畫面的功能,其中播放視頻的功能只有'Play' 和'Stop',不能實現暫停,《A step-by-step guide to the use of Microsoft Visual C++ and the Intel OpenCV library》中好像有關於多線程防止任務沖突(Mutex)的內容,深入學習和了解那一部分後再嘗試做暫停的功能和其它更復雜的應用。
下面是新增功能後的項目文件(可直接運行):/source/2155367在《OpenCV教程-基礎篇》的2.8節中,所創建的MFC圖像顯示是直接放在對話框面板的左上角的,《A step-by-step 《MFC中快速應用OpenCV》則是介紹用SDI(單文檔界面)來顯示圖像,感覺不大美觀;guide to the use of Microsoft Visual C++ and the Intel OpenCV library》使用VS2005來進行圖像和視頻的讀取和處理,但是其圖像和視頻的顯示界面不是在對話框裡面的,而是新建一個窗口來做。
所以下面我們就來看看怎麼在對話框裡使用Picture控件來顯示和處理圖像。
一、創建MFC首先創建一個MFC對話框應用程序(Dialog-based Application)如下:在VS2005和2008裡,我們可以用一個Solution 來組合幾個Project (每個Project 基本上只包含一個Program),當我們要構建一個多Program的應用時(例如一個客戶端程序加一個服務器應用程序),利用Solution 可以將這些Projects 組合起來、並且共享文件和函數庫。
MFC怎么让图片适应picturecontrol控件的大小最近做项目时,遇到一个问题,想要让picture control中的图片显示与该控件的大小一致,用的环境是vs2008,添加一个控件后,更改其type为bitmap,此时的控件大小不能改变,需要将Center Image更改为True,此时即可更改控件的大小将控件关联一个CStatic的变量m_ctrlPic后,可以在OnInitDialog中使用SetImage,此时的图片可以居中显示,但是大小被缩减了,然后在OnInitDialog中使用了StretchBlt发现图片显示一下就不见了,后来查了查,发现了问题所在,对话框显示的时候会先调用OnInitDialog,然后调用OnPaint,而OnPaint中的CDialog::OnPaint();当对话框没有 WS_CLIPDRILDREN 属性CDialog::OnPaint(); 会给 pictrue 发窗口无效 (invalidate),如果这时画东西, 会被 pic 的 paint 覆盖掉.所以一定要让 pic 的窗口 ,有效后才能画.也就是说先要 pWnd->UpdateWindow();//或者:(pWnd->RedrawWindow())或者 pWnd->ValidateRect()使窗口有效.void CUWB_CoordinateDlg::OnPaint(){if (IsIconic()){CPaintDC dc(this); // 用于绘制的设备上下文SendMessage(WM_ICONERASEBKGND,reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);// 使图标在工作区矩形中居中int cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2;// 绘制图标dc.DrawIcon(x, y, m_hIcon);}else{CDialog::OnPaint();}UpdateWindow();int height, width;CRect rect;//定义矩形类CRect rect1;CImage image; //创建图片类image.Load(_T("1.jpg"));height = image.GetHeight();width = image.GetWidth();m_ctrlPic.GetClientRect(&rect); //获得pictrue控件所在的矩形区域CDC *pDc = m_ctrlPic.GetDC();//获得pictrue控件的DcSetStretchBltMode(pDc->m_hDC,STRETCH_HALFTONE);image.StretchBlt(pDc->m_hDC,rect,SRCCOPY); ReleaseDC(pDc);//释放picture控件的Dc}。
PictureBox控件的主要作用是为用户显示图片。
实际显示图片由Picture属性决定。
Picture属性包括被显示的图片的文件名(及可选的路径名)。
注意窗体对象也具有Picture属性,通过设置该属性可直接在窗体背景上显示图片。
要在运行时显示或替换图片,可利用函数LoadPicture来设置Picture属性。
提供图片文件名和可选路径名,由LoadPicture函数处理加载和显示图片的细节。
picMain.Picture = LoadPicture("VANGOGH.BMP")PictureBox控件具有AutoSize属性,当该属性设置为True时,PictureBox能自动调整大小与显示的图片匹配。
如果要用AutoSize属性设置为True的PictureBox,设计窗体时就需要特别小心。
图片将不考虑窗体上的其它控件而调整大小,这可能导致意想不到的后果,如覆盖其它控件。
设计时应通过加载每一幅图片来检查是否有这种现象发生。
vc picture控件的分类进行拉总结,(一) 非动态显示图片(即图片先通过资源管理器载入,有一个固定ID)(二) 动态载入图片(即只需要在程序中指定图片的路径即可载入)为方便说明,我们已经建好一个基于对话框的工程,名为Ttest.对话框类为CTestDlg(一) vc picture控件非动态载入图片.方法1.先从最简单的开始,用picture 控件来实现.步骤:先在资源里Import一张图片,ID为IDB_BITMAP2,然后在对话框上添加一个picture控件,右键点击打开属性,将type下拉框选择BITMAP,紧跟着Image下面就出现一个下拉框,拉开就会看到所有已经载入好的图片,选择你要的图片.运行程序即可看到.方法2vc picture控件.通过背景图同样如上,先载入一张图片,ID为IDB_BITMAP2TestDlg.h中CBrush m_brBk;//在public中定义TestDlg.cpp中在初始化函数OnInitDialog()中加入:BOOL CTestDlg::OnInitDialog(){CDialog::OnInitDialog();CBitmap bmp;bmp.LoadBitmap(IDB_BITMAP2);m_brBk.CreatePatternBrush(&bmp);bmp.DeleteObject();return TRUE; // return TRUE unless you set the focus to a control}在打开类向导,找到WM_CTLCOLOR消息,重载得对应函数OnCtlColor(),添加如下:HBRUSH CTestDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor){HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);if (pWnd == this){return m_brBk;}return hbr;}(二) vc picture控件动态载入图片.方法3 图像控件(本例用KoDak 图像编辑控件)1. 首先应该保证系统中有这个控件。
注意,它不能单独使用,必须和其他几个控件(特别是Imgcmn.dll)一同使用。
如果没有,从别的机器上copy过来即可。
这几个文件是Imgadmin.ocx,Imgcmn.dll,Imgedit.ocx,Imgscan.ocx,Imgshl.dll,Imgthumb.ocx,Imgutil.dll,把它们copy到windows/system目录下,然后用regsvr32.exe将它们分别注册。
2. 打开工程,进入资源管理器,在对话框上单击右键,单击Insert Activex control…选择Kodak图象编辑控件,大小任意。
3. 在对话框上选中该控件,为其添加变量:m_ctrlPicture。
4. 在BOOL CTestDlg::OnInitDialog()添加如下:BOOL CTestDlg::OnInitDialog(){CDialog::OnInitDialog();m_ctrlPicture.SetImage("aa.jpg"); //保证图像在工程目录下,也可以写绝对路径m_ctrlPicture.Display();return TRUE; // return TRUE unless you set the focus to a control// EXCEPTION: OCX Property Pages should return FALSE}编译运行就OK了,此种方法的好处就是可能针对多种图像格式.方法4 vc picture控件通过CBitmap,HBITMAP,直接用OnPaint()绘制首先在CTestDlg类中声明一个变量: CBitmap m_bmp;然后我们在对话框中加入一个picture 标签,名为IDC_STATIC1然后:BOOL CDisplayPic::OnInitDialog(){CDialog::OnInitDialog();if( m_bmp.m_hObject != NULL )//判断m_bmp.DeleteObject();/////////载入图片HBITMAP hbmp = (HBITMAP)::LoadImage(AfxGetInstanceHandle(),"c://aaa.bmp", IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION|LR_LOADFROMFILE);if( hbmp == NULL )return FALSE;///////////////////////该断程序用来取得加载的BMP的信息////////////////////////m_bmp.Attach( hbmp );DIBSECTION ds;BITMAPINFOHEADER &bminfo = ds.dsBmih;m_bmp.GetObject( sizeof(ds), &ds );int cx=bminfo.biWidth; //得到图像宽度int cy=bminfo.biHeight; //得到图像高度/////////////////// /////////////////////////////////////////////得到了图像的宽度和高度后,我们就可以对图像大小进行适应,即调整控件的大小,让它正好显示一张图片///////////////////////////CRect rect;GetDlgItem(IDC_STATIC1)->GetWindowRect(&rect);ScreenToClient(&rect);GetDlgItem(IDC_STATIC1)->MoveWindow(rect.left,rect.top,cx,cy,true);//调整大小return TRUE; // return TRUE unless you set the focus to a control// EXCEPTION: OCX Property Pages should return FALSE}图片加载成功了,标签大小也适应了,下面就是绘制绘制图像了,打开类向导,重载WM_PAINT消息void CDisplayPic::OnPaint(){//////////////以下三种情况任选一种会是不同效果(只能一种存在)/////////////CPaintDC dc(this); //若用此句,得到的是对话框的DC,图片将被绘制在对话框上.CPaintDC dc(GetDlgItem(IDC_STATIC1)); //用此句,得到picture控件的DC,图像将被绘制在控件上// CDC dc;// dc.m_hDC=::GetDC(NULL); //若用此两句,得到的是屏幕的DC,图片将被绘制在屏幕上///////////////////////////////////////////////////////CRect rcclient;GetDlgItem(IDC_STATIC1)->GetClientRect(&rcclient);CDC memdc;memdc.CreateCompatibleDC(&dc);CBitmap bitmap;bitmap.CreateCompatibleBitmap(&dc, rcclient.Width(), rcclient.Height());memdc.SelectObject( &bitmap );CWnd::DefWindowProc(WM_PAINT, (WPARAM)memdc.m_hDC , 0);CDC maskdc;maskdc.CreateCompatibleDC(&dc);CBitmap maskbitmap;maskbitmap.CreateBitmap(rcclient.Width(), rcclient.Height(), 1, 1, NULL);maskdc.SelectObject( &maskbitmap );maskdc.BitBlt( 0, 0, rcclient.Width(), rcclient.Height(), &memdc,rcclient.left, rcclient.top, SRCCOPY);CBrush brush;brush.CreatePatternBrush(&m_bmp);dc.FillRect(rcclient, &brush);dc.BitBlt(rcclient.left, rcclient.top, rcclient.Width(), rcclient.Height(),&memdc, rcclient.left, rcclient.top,SRCPAINT);brush.DeleteObject();// Do not call CDialog::OnPaint() for painting messages}基于MFC控件STATIC显示图片数据1. 在 OnInitDialog 中加入GetDlgItem(IDC_MY_PIC)->ModifyStyle ( SS_TYPEMASK, SS_OWNERDRAW );2. 在butto 按钮中加入以下,可以显示多中类型的图片资源void CDlgpicDlg::OnTest(){// TODO: Add your command handler code hereCFileDialog fileDlg(TRUE,NULL,NULL,OFN_ALLOWMULTISELECT,_T("Picture Files (*.bmp *.ico *.jpg)|*bmp;*.ico;*jpg|All Files (*.*)|*.*||"),AfxGetMainWnd());CString pathName;if(fileDlg.DoModal ()==IDOK){POSITION mPos=fileDlg.GetStartPosition();while(mPos!=NULL){pathName=fileDlg.GetNextPathName(mPos);if(m_pict.LoadPicture(pathName.GetBuffer(pathName.GetLength()))){// 防止有透明图片,消除已有的图片信息CPaintDC dc(this); // device context for paintingCRect rc;GetDlgItem(IDC_MY_PIC)->GetWindowRect(&rc);dc.FillSolidRect(rc, RGB(0, 0, 0));Invalidate();}}}}3.给父窗口增加ON_WM_DRAWITEM消息映射函数在OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)消息映射函数里面绘制控件void CDlgpicDlg::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct){// TODO: Add your message handler code here and/or call defaultif(nIDCtl == IDC_MY_PIC){if ( m_pict.m_pic){RECT rect;TRACE("--hell-- test---");HWND hwnd = ::GetDlgItem(this->GetSafeHwnd(), IDC_MY_PIC);HDC hDC = ::GetDC(::GetDlgItem(this->GetSafeHwnd(),IDC_MY_PIC));//Get the DC for the CPicture Box::GetClientRect(::GetDlgItem(this->GetSafeHwnd(), IDC_MY_PIC), &rect);//Get dimensions of itm_pict.DrawPicture(hDC, 0, 0, rect.right - rect.left ,rect.bottom - rect.top );::ReleaseDC(::GetDlgItem(this->GetSafeHwnd(),IDC_MY_PIC), hDC);}}CDialog::OnDrawItem(nIDCtl, lpDrawItemStruct);}总结:如果在static中需要显示图片,在ONPAINT 中绘画没有效果,需要这么画:1)给static控件增加SS_OWNERDRAW属性 GetDlgItem(IDC_MY_PIC)->ModifyStyle ( SS_TYPEMASK, SS_OWNERDRAW );2)给父窗口增加ON_WM_DRAWITEM消息映射函数3)在OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)消息映射函数里面绘制控件例如:下面给对话框里的IDC_STATIC_DRAW控件画个蓝色的背景void CMyDlg::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct){if(nIDCtl == IDC_STATIC_DRAW){CDC *pDC = CDC::FromHandle(lpDrawItemStruct->hDC);pDC->FillSolidRect(10, 10, lpDrawItemStruct->rcItem.right - 20,lpDrawItemStruct->rcItem.bottom - 20, RGB(0, 0, 255));return;}CDialog::OnDrawItem(nIDCtl, lpDrawItemStruct);}另外,还可以这么画,从CStatic继承一个新类,然后增加WM_PAINT消息处理,在OnPaint里面画。