MFC中picture控件显示图片

合集下载

picturebox的使用方式

picturebox的使用方式

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自适应控件大小显示图片,失真和不失真

MFCPictureControl自适应控件大小显示图片,失真和不失真

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使用在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。

VS2010利用MFC的Picture控件显示和处理图像

VS2010利用MFC的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控件中显示

MFC利用图像数据在Picture控件中显示

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 Control

常用控件:图片控件Picture Control

上一节中鸡啄米讲的是滚动条控件,本节主要讲一种简单实用的控件,图片控件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。

MFC 通过Picture control 显示图片

MFC 通过Picture control 显示图片

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);}。

MFC对话框背景---图片背景---背景色

MFC对话框背景---图片背景---背景色

对话框的背景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;}这样运行后对话框背景色就变为蓝色。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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里面画。

相关文档
最新文档