MFC 在对话框显示图片的多种方法
MFC显示图片步骤

1、建立工程,并向工程中添加图像类.he文件和.cpp文件。
例如将DIB.h和DIB.cpp,一般都要成对添加2、在doc.h头文件添加图像类头文件(#include”DIB.h”),并在文档类(doc类)建立存图像类的变量,例如:public:CDIB m_Dib;3、doc文档类添加OnOpenDocumen函数,并编辑函数如下:BOOL CLianDoc::OnOpenDocument(LPCTSTR lpszPathName){if (!CDocument::OnOpenDocument(lpszPathName))return FALSE;// TODO: Add your specialized creation code herem_Dib.Read_8BitsGray_Image(lpszPathName);m_Dib.MakePalette();return TRUE;}加黑的代码是我们添加的。
该函数的意思是通过打开文档,获取图像的路径。
4、在view类添加图像类变量指针,并包含图形类头文件(DIB.h),如:public:CDIB *pDib;5、在view类添加消息相应函数***view::OnPain(),并编辑代码如下:void CTestno3View::OnPaint(){CPaintDC dc(this); // device context for painting// TODO: Add your message handler code hereCTestno3Doc* pDoc = GetDocument();ASSERT_VALID(pDoc);BeginWaitCursor();/********************显示图像*******************/if (pDoc->m_Dib.GetHandle() != NULL){CRect rcDIB; // 图像的实际像素大小rcDIB.top = rcDIB.left = 0;rcDIB.right = pDoc->m_Dib.GetWidth();rcDIB.bottom = pDoc->m_Dib.GetHeight();CRect rcClient; // 视图的实际像素大小GetClientRect(&rcClient);pDoc->m_Dib.Paint(dc.GetSafeHdc(),&rcDIB,&rcDIB,pDoc->m_Dib.m_p Pal);}EndWaitCursor();// Do not call CView::OnPaint() for painting messages}其中加黑的代码为我们添加的;6、切换到资源视图类(ResourceView),在菜单Menu里建立相应的图像操作相应菜单,并添加相应函数,例如:线性变换函数:void CTestno3View::OnXianxing(){// TODO: Add your command handler code hereCTestno3Doc* pDoc = GetDocument();ASSERT_VALID(pDoc);pDib=&(pDoc->m_Dib);LPSTR lpStartBit=pDib->GetPixelBit(); // 象素起始位置指针int iWidth=pDib->GetWidth(); // 图象宽度int iHeight=pDib->GetHeight(); // 图象高度unsigned char temp; // 临时交换变量int iBitsWidth=pDib->GetBitsWidth(); // 图象中每行的字节数unsigned char * lpPixel; // 指向源DIB图像象素位置的指针int i; // 循环变量int j;for (i=0;i<iHeight;i++){for (j=0;j<iWidth;j++){lpPixel=(unsignedchar*)lpStartBit+(iHeight-1-i)*iBitsWidth+j;temp=8*(*lpPixel);if (temp>255.0)*lpPixel=255;else if (temp<0.0)*lpPixel=0;else*lpPixel=(unsigned char)(temp+0.5);}}Invalidate();}至此,运行打开BMP图像,点击相应操作,可以看到效果。
MFC 读取并显示图片和彩色转灰度

By侯海艳(UCAS)
关于MFC读取BMP图片,相信对于很多初学者都是一头雾水,找不着头绪。那么就让我浅浅地说一说到底怎么样读取并显示BMP图片吧。因为我也是初学,摸索学习了四五天,由于有些MFC基础,因此大概理清了MFC读取图片的机理。说的不对请提出宝贵建议,高手请绕道。
C++的学习难就难在指针上面,我们必须很好地了解数据的存储方式和指针的基本知识。一般来说,数据存储在内存中是以内存块的形式存储的,即给变量分配一定大小的空间,这个空间就像书架一样,里面装满了一本一本的书,每本书就对应着一个数据单元。我们定义一个指针,指向这个内存块,指针的位置就在内存块的开头,即数据的第一个元素。当我们要获取后面的元素的时候就要移动指针获取。下面会具体说。
1.从新建MFC文档开始
新建MFC文档的时候,可以选择多文档类型,一般选择默认,但有一点需要注意,当新建这只到了第六步的时候,C*View类的Base Class要选择CScrollView,而不是默认的CView。如下图:Teeee是我随便命名的工程名
(旋转了90度)
这样打开文档就可以看到上图中有许多文件,我们所要编辑的主要是Doc.cpp、View.cpp和Header Files里面的Doc.h头文件。
if ( rowBytes!=pDoc->m_Width*pDoc->m_PxlBytes )
{
pBuf = new BYTE[pDoc->m_Height*rowBytes];
for (int i=0;i<pDoc->m_Height;i++ )
memcpy( pBuf+i*rowBytes,pDoc->pImgData+i*pDoc->m_Width*pDoc->m_PxlBytes,pDoc->m_Width*pDoc->m_PxlBytes );
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控件显示和处理图像

利用 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控件中显示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的声明过程。
MFC对话框里获取DC画图的几种方法

DeleteDC(dcCompatible);
三、
CPaintDC dc(this);
//CPaintDC只在 *pDC = m_pParentDlg->GetDC();
hDC = CreateCompatibleDC(pDC->GetSafeHdc());
1 确保操作系统中加入了com组件,调用com,利用IImage接口,显示BMP/JPG/GIF/PNG图片,不支持WBMP,GIF也只能显示一帧。
2 添加头文件要按顺序。
#include <INITGUID.h>
#include <imaging.h>
3 制作自己的读取文件函数,此函数返回HBITMAP,需要的地方可以自己放缩以及实现显示效果等等。
CDC dcCompatible;
dcCompatible.CreateCompatibleDC(pMemDC);
SelectObject(dcCompatible, hmap);
BitBlt(pMemDC->m_hDC, m_rcWindowRect.left, m_rcWindowRect.top, m_rcWindowRect.Width(), m_rcWindowRect.Height(), dcCompatible, 0, 0, SRCCOPY);
pDC->LineTo(500, 450);
ReleaseDC(pDC);
二、
CClientDC dc(this);
CDC dcCompatible;
dcCompatible.CreateCompatibleDC(&dc);
dcCompatible.SelectObject(&m_bitmap);
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;}这样运行后对话框背景色就变为蓝色。
MFC 对话框 背景图片 以及消除 字体重影 字体重叠

很多人都想改变对话框的背景图,其实很简单,只需要一个函数就可以了,不过还是有问题的,下面讲述。
只需要响应WM_ERASEBKGND消息,然后重载OnEraseBkgnd(CDC*pDC)这个函数就可以,首先我们要添加消息响应,由于该消息不能用MFC ClassWizard添加,因为ClassWizard 没有该消息添加的选项,我们需要手动添加,只需要在消息响应MAP添加一下ON_WM_ERASEBKGND(),如下所示:BEGIN_MESSAGE_MAP(CSerialTestDlg, CDialog)//{{AFX_MSG_MAP(CSerialTestDlg)ON_WM_ERASEBKGND()//添加重绘背景消息响应//}}AFX_MSG_MAPEND_MESSAGE_MAP()我们然后进行消息响应,添加消息响应函数,然后在对话框类的声明文件添加该函数的声明virtual BOOL OnEraseBkgnd(CDC*pDC);在实现文件中进行该函数的书写,如:BOOL CSerialTestDlg::OnEraseBkgnd(CDC*pDC){CBitmap m_bitmap;m_bitmap.LoadBitmap(IDB_DLGBK);//加载背景图片,选择你对应的图片IDCDC dcCompatible;dcCompatible.CreateCompatibleDC(pDC);dcCompatible.SelectObject(&m_bitmap);CRect rect;GetWindowRect(&rect);ScreenToClient(&rect);//选择客户区域BITMAP bmp;m_bitmap.GetBitmap(&bmp);pDC->StretchBlt(0,0,rect.Width(),rect.Height(),&dcCompatible,0,0,bmp.bmW idth,bmp.bmHeight,SRCCOPY);//绘制BMP背景图m_bitmap.DeleteObject();return TRUE;}但是这样做一般就可以,细心的人会发现字体有重叠,比如说静态文本框和EDIT控件,如果选择只读模式,作为输出,这时EDIT的背景是BMP背景图片,但是字体重叠,如下图,我这样就行消除。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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. 首先应该保证系统中有这个控件。
注意,它不能单独使用,必须和其他几个控件(特别是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 通过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;2[VC编程]在对话框显示图片的多种方法[zt] 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,c y,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}以上四种方法唯有KoDak可以支持多种图像,其它的只支持BMP。