mfc载入图片
MFC中加载和显示图片的几个函数与例子

MFC中加载和显示图片的几个函数与例子使用IPicture::Render 绘制图片的方法说明:HRESULT Render(HDC hdc, //Handle of device context on which to render the image//绘图设备long x, //Horizontal position of image in hdc//绘图设备上的X起始坐标long y, //Vertical position of image in hdc//绘图设备上的Y起始坐标long cx, //Horizontal dimension of destination rectangle//绘图设备上的水平像素单位数(宽)long cy, //Vertical dimension of destination rectangle//绘图设备上的垂直像素单位数(高)OLE_XPOS_HIMETRIC xSrc,//Horizontal offset in source picture//原图的X起始坐标OLE_YPOS_HIMETRIC ySrc,//Vertical offset in source picture//原图的Y起始坐标OLE_XSIZE_HIMETRIC cxSrc,//Amount to copy horizontally in source picture//总计拷贝的水平像素单位数(宽)OLE_YSIZE_HIMETRIC cySrc,//Amount to copy vertically in source picture//总计拷贝的垂直像素单位数(高)LPCRECT prcWBounds//Pointer toposition of destination for a metafile hdc//图源文件指针);范例:HRESULThr=m_lppi->Render(pDC->m_hDC,0,0,100,100,0,0,11774,20320,&rc);使用CreateFile取得文件句柄的方法说明HANDLE WINAPI CreateFile(LPCTSTR lpFileName,//The name of the object to be created or opened.//打开或者新建的文件名DWORD dwDesiredAccess,// The access to the object, which can be read, write, or both.// 文件访问权限常用的是 GENERIC_EXECUTE / GENERIC_READ /GENERIC_WRITEDWORD dwShareMode,// The sharing mode of an object, which can be read, write, both, or none文件的共享模式,常用的是 FILE_SHARE_DELETE / FILE_SHARE_READ /FILE_SHARE_WRITE ,0表示不共享LPSECURITY_ATTRIBUTES lpSecurityAttributes,// A pointer to a SECURITY_ATTRIBUTES structure that determines whether or not the returned handle can be inherited by child processes.// 详细内容,参见 msdn 的相关描述,我就不翻译了DWORD dwCreationDisposition,// An action to take on files that exist and do not exist.// 详细内容,参见 msdn 的相关描述,我就不翻译了DWORD dwFlagsAndAttributes,// The file attributes and flags.// 详细内容,参见 msdn 的相关描述,我就不翻译了HANDLE hTemplateFilehandle to a template file with the GENERIC_READ access right. The template file supplies file attributes and extended attributes for the file that is being created. This parameter can be NULL.// 详细内容,参见 msdn 的相关描述,我就不翻译了);范例:HANDLEhFile=CreateFile(_T("\\aaa.jpg"),GENERIC_READ,0,NULL,OPEN_EXI STING,0,NULL);使用IPersistStream::Load获取LPPICTURE对象的方法: STDAPI OleLoadPicture(IStream * pStream,//Point er to the stream that contains picture's dataLONG lSize, //Number of bytes read from the streamBOOL fRunmode,//Theopposite of the initial value of the picture's// propertyREFIID riid, //Reference to the identifier of the interface// describing the type of interface pointer to returnVOID ppvObj //Address of output variable that receives interface// pointer requested in riid);其他方法://按文件大小分配内存LPVOID pvData;HGLOBALhGlobal=GlobalAlloc(GMEM_MOVEABLE,dwFileSize);//锁定内存pvData=GlobalLock(hGlobal);//读取文件到内存DWORD dwFileRead=0;BOOLbRead=ReadFile(hFile,pvData,dwFileSize,&dwFileRead,NULL);//从已分配内存生成IStream流HRESULThr=CreateStreamOnHGlobal(hGlobal,TRUE,&pstm);hr=OleLoadPicture(pstm,dwFileSize,F ALSE,IID_IPicture,(LPVOID*)&(*lppi));pstm->Release();一个相对完整的步骤//加载图片BOOL CPicTestDlg::LoadMyJpegFile(CString fname,LPPICTURE *lppi) {HANDLEhFile=CreateFile(fname,GENERIC_READ,0,NULL,OPEN_EXISTING,0,NU LL);if(hFile==INVALID_HANDLE_VALUE){CString str;str.Format(_T("%s无法被打开"),fname);MessageBox(str);return FALSE;}//取得文件大小DWORD dwFileSize=GetFileSize(hFile,NULL);if((DWORD)-1==dwFileSize){CloseHandle(hFile);MessageBox(_T("图像文件是空的"));return FALSE;}//读取图像文件LPVOID pvData;//按文件大小分配内存HGLOBALhGlobal=GlobalAlloc(GMEM_MOVEABLE,dwFileSize);if(NULL==hGlobal){CloseHandle(hFile);MessageBox(_T("内存不足,无法分配足够内存"));return FALSE;}pvData=GlobalLock(hGlobal);if(NULL==pvData){GlobalUnlock(hGlobal);CloseHandle(hFile);MessageBox(_T("无法锁定内存"));return FALSE;}DWORD dwFileRead=0;BOOLbRead=ReadFile(hFile,pvData,dwFileSize,&dwFileRead,NULL);GlobalUnlock(hGlobal);CloseHandle(hFile);if(FALSE==bRead){MessageBox(_T("读文件出错"));return FALSE;}LPSTREAM pstm=NULL;//从已分配内存生成IStream流HRESULThr=CreateStreamOnHGlobal(hGlobal,TRUE,&pstm);if(!SUCCEEDED(hr)){MessageBox(_T("生成流操作失败"));if(pstm!=NULL)pstm->Release();return FALSE;}else if(pstm==NULL){MessageBox(_T("生成流操作失败"));return FALSE;}if(!*lppi)(*lppi)->Release();hr=OleLoadPicture(pstm,dwFileSize,FALSE,IID_IPict ure,(LPVOID*)&(*lppi));pstm->Release();if(!SUCCEEDED(hr)){MessageBox(_T("加载操作失败"));return FALSE;}else if(*lppi==NULL){MessageBox(_T("加载操作失败"));return FALSE;}return TRUE;}//绘制图片TCHAR strPath[MAX_PATH];memset(strPath,0,MAX_PATH);//得到当前路径GetCurrentDirectory(MAX_PATH,strPath);//定义图片路径wcscat_s(strPath,MAX_PATH,_T("\\145.bmp")); //加载图片到 m_lppim_bHadLoad=LoadMyJpegFile(strPath,&m_lppi); //取得绘图设备CDC *pDC=GetDC();//定义绘图矩形区域CRect rc;//得到图片长宽long hmWidth=0;long hmHeight=0;m_lppi->get_Height(&hmHeight);m_lppi->get_Width(&hmWidth);//定义区域与设备关联GetClientRect(&rc);int nWidth,nHeight;//得到设备的长宽nWidth=rc.Width();nHeight=rc.Height();//绘制图片到设备区域HRESULThr=m_lppi->Render(pDC->m_hDC,nWidth,0,-nWidth,nHeight,hmWidth ,hmHeight,-hmWidth,-hmHeight,&rc);使用以上内容可以在mfc的窗体中的任何地方绘制图片,重绘的时候,需要在方法OnPaint()中加以定义,另外可以在OnInitDialog()中提前加载图片到内存中.。
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。
MFC 在对话框显示图片的多种方法

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对话框中任意显示图片

MFC对话框中任意显示图片3. Microsoft Web浏览器Web浏览器又称为Web客户程序。
它是一种用于Internet网上资源的应用程序,是查看WWW(万维网)中超文本文档(也包括图像及多媒体)的重要工具。
在MFC中,可以将Web浏览器控件插入到应用程序中,用来显示图像文件,如下面的示例过程。
(1)用MFC AppWizard(exe)创建一个默认的基于对话框的应用程序Ex_WebImage。
(2)删除对话框资源中的静态文本控件“TODO:在这里设置对话控制。
”和“确定”按纽,并将“取消”按纽的标题改为“退出”。
(3)选择“工程|添加工程|Components and Controls”菜单命令,弹出Components and Control对话框。
在对话框中选择Registered ActiveX Controls,找到并选择Microsoft Web浏览器,单击Insert按纽,添加Microsoft Web浏览器控件类,然后关闭Components and Control 对话框。
(4)在对话框资源模板中添加一个“Web浏览器”控件,保留其默认的ID号IDC_EXPLORER1,再添加一个“打开”按纽,将其ID 号设为IDC_IMAGE_OPEN。
(5)用MFC ClassWizard为“Web浏览器”控件IDC_EXPLORER1添加控件变量m_WebBrowser,为“打开”按纽IDC_IMAGE_OPEN增加BN_CLICKED消息处理,并添加下列代码:void CEx_WebImageDlg::OnImageOpen(){CFileDialog dlg(TRUE);dlg.m_ofn.lpstrFilter="所有图像文件\\0*.gif;*.jpg;*.jpeg\\0所有文件\\0*.*\\0\\0";if(dlg.DoModal()!=IDOK) return;COleVariant vt(dlg.GetPathName());VARIANT bt;m_WebBrowser.Navigate2(vt,&bt,&bt,&bt,&bt);}(6)编译运行并测试,单击“打开按纽,调入一个图像文件,结果如下图所示。
MFC图片加载方法参考

加背景图片的一种方法Windows 在向窗口发送WM_PAINT 消息之前,总会发送一个WM_ERASEBKGND 消息通知该窗口擦除背景,默认情况下,Windows 将以窗口的背景色清除该窗口。
可以响应窗口(包括子元素)的WM_ERASEBKGND ,以更改它们的背景。
WM_ERASEBKGND 的映射函数原型如下:afx_msg BOOL OnEraseBkgnd( CDC* pDC );返 回 值:指定背景是否已清除,如果为FALSE ,系统将自动清除参 数:pDC 指定了绘制操作所使用的设备环境。
大致代码时:BOOL CUi4Dlg::OnInitDialog() { //加载位图 //CBitmap m_Back; m_Back.LoadBitmap(IDB_BACK); }BOOL CUi4Dlg::OnEraseBkgnd(CDC* pDC){CDC dc;dc.CreateCompatibleDC(pDC); dc.SelectObject(&m_Back); //获取BITMAP 对象 BITMAP hb; m_Back.GetBitmap(&hb); //获取窗口大小 CRect rt;GetClientRect(&rt);//显示位图pDC->StretchBlt(0, 0, rt.Width(), rt.Height(),&dc,0,0, hb.bmWidth, hb.bmHeight, SRCCOPY);return TRUE;}HBRUSH CUi4Dlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor){ //设置透明背景模式pDC->SetBkMode(TRANSPARENT);//设置背景刷子为空return (HBRUSH)::GetStockObject(HOLLOW_BRUSH);}显示位图原理: 1、声明一个CBitmap 对象,并从资源中加位图。
MFC窗口程序添加bmp图片

MFC窗口程序添加bmp图片2010-11-29 22:26最近重新开始学习MFC。
想往窗口里画张图,折腾了一个多小时。
(唉,欲善其事,先利其器.....我资料太少了)以后写点东西就往这里传了,一来方便以后自己参阅,另一方面希望帮到遇到同样问题的兄弟姐妹们。
参考资料 MFC windows 编程(第二版)Step 1 :新建一个空白窗口 VC 6.0 工程:Win32 Application添加头文件:lonewolf_mm.h 名字取个你喜欢的把下面的代码拷进去,没关系,编程一开始都是抄别人的 : )/****************************************************************************** * File Name : lonewolf_mm.h* Description :* Author : lonewolf******************************************************************************/class CMyApp :public CWinApp{public:virtual BOOL InitInstance();};class CMainWindow : public CFrameWnd{public:CMainWindow();protected:afx_msg void OnPaint();DECLARE_MESSAGE_MAP()};///////////////////////////////////////////////// file end//////////////////////////////////////////////////////////////////////////按下来是源文件了,同样的新建一个cpp,把下面的代码拷进去。
1.MFC-导入显示bmp图片

数字图像处理- MFC教程第一课建立MFC和打开bmp图片第一步:建立MFC工程文件--新建--MFC AppWizardd(exe)工程--单文档—确定。
第二步:设置打开函数查看--建立类导向(Ctrl+W)--CpictureXSView(类名)--ID_FILE_OPEN(IDs列表)--COMMAND(Messages列表)--默认成员函数名为OnFileOpen--Member Functions(成员函数)中双击该函数进入函数编辑。
建立如下函数:打开图片、保存图片为重点。
注意:在添加Messages列表中:ON_COMMAND是点了按钮或菜单项后的响应消息;ON_UPDATE_COMMAND_UI是用来表示对应的按钮和菜单项的状态的响应消息,比如你打开这个菜单时,处理这个菜单的状态,比如选中、变灰等。
UPDATE_COMMAND_UI处理程序的参数是个「指向CCmdUI对象的指针」,而CCmdUI对象就代表着对应的选单命令项,因此你只需呼叫 CCmdUI 所准备的,专门用来处理命令项外观的函式(如Enable或SetCheck)即可。
第三步:View类添加成员函数和成员变量//参数定义p u b l i c:C S t r i n g B mp N a me;//保存图像文件文件名C S t r i n g E n t N a me;//保存图像文件扩展名C B i t map m_b i t map;//创建位图对象v o i d S h o wB i t map(C D C*p D C,C S t r i n g B mp N a me);//用来显示指定位图b mp的函数B O O L S h o w Jp g G i f(CD C*p D C,C S t r i n g st r P a t h,i n t x,i n t y);//用来显示指定位图j p g、g i f的函数添加方法:选中ClassView区--选中View类右键--增加成员变量函数。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
我们先从简单的开始吧.先分一个类:(一) 非动态显示图片(即图片先通过资源管理器载入,有一个固定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_STATIC1int 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使用IPicture::Render 绘制图片的方法说明:HRESULT Render(HDC hdc, //Handle of device context on which to render the image//绘图设备long x, //Horizontal position of image in hdc//绘图设备上的X起始坐标long y, //Vertical position of image in hdc//绘图设备上的Y起始坐标long cx, //Horizontal dimension of destination rectangle//绘图设备上的水平像素单位数(宽)long cy, //Vertical dimension of destination rectangle//绘图设备上的垂直像素单位数(高)OLE_XPOS_HIMETRIC xSrc,//Horizontal offset in source picture//原图的X起始坐标OLE_YPOS_HIMETRIC ySrc,//Vertical offset in source picture//原图的Y起始坐标OLE_XSIZE_HIMETRIC cxSrc,//Amount to copy horizontally in source picture//总计拷贝的水平像素单位数(宽)OLE_YSIZE_HIMETRIC cySrc,//Amount to copy vertically in source picture//总计拷贝的垂直像素单位数(高)LPCRECT prcWBounds//Pointer to position of destination for a metafile hdc//图源文件指针);范例:HRESULThr=m_lppi->Render(pDC->m_hDC,0,0,100,100,0,0,11774,20320,&rc);使用CreateFile取得文件句柄的方法说明HANDLE WINAPI CreateFile(LPCTSTR lpFileName,//The name of the object to be created or opened.//打开或者新建的文件名DWORD dwDesiredAccess,// The access to the object, which can be read, write, or both.// 文件访问权限常用的是GENERIC_EXECUTE / GENERIC_READ /GENERIC_WRITEDWORD dwShareMode,// The sharing mode of an object, which can be read, write, both, or none// 文件的共享模式,常用的是FILE_SHARE_DELETE / FILE_SHARE_READ/FILE_SHARE_WRITE ,0表示不共享LPSECURITY_ATTRIBUTES lpSecurityAttributes,// A pointer to a SECURITY_ATTRIBUTES structure that determines whether or not the returned handle can be inherited by child processes.// 详细内容,参见msdn 的相关描述,我就不翻译了DWORD dwCreationDisposition,// An action to take on files that exist and do not exist.// 详细内容,参见msdn 的相关描述,我就不翻译了DWORD dwFlagsAndAttributes,// The file attributes and flags.// 详细内容,参见msdn 的相关描述,我就不翻译了HANDLE hTemplateFile// A handle to a template file with the GENERIC_READ access right. The template file supplies file attributes and extended attributes for the file that is being created. This parameter can be NULL.// 详细内容,参见msdn 的相关描述,我就不翻译了);范例:HANDLEhFile=CreateFile(_T("\\aaa.jpg"),GENERIC_READ,0,NULL,OPEN_E XISTING,0,NULL);使用IPersistStream::Load获取LPPICTURE对象的方法:STDAPI OleLoadPicture(IStream * pStream,//Pointer to the stream that contains picture's dataLONG lSize, //Number of bytes read from the streamBOOL fRunmode,//The opposite of the initial value of the picture's// propertyREFIID riid, //Reference to the identifier of the interface// describing the type of interface pointer to returnVOID ppvObj //Address of output variable that receives interface// pointer requested in riid);其他方法://按文件大小分配内存LPVOID pvData;HGLOBALhGlobal=GlobalAlloc(GMEM_MOVEABLE,dwFileSize);//锁定内存pvData=GlobalLock(hGlobal);//读取文件到内存DWORD dwFileRead=0;BOOLbRead=ReadFile(hFile,pvData,dwFileSize,&dwFileRead,NULL);//从已分配内存生成IStream流HRESULThr=CreateStreamOnHGlobal(hGlobal,TRUE,&pstm);hr=OleLoadPicture(pstm,dwFileSize,FALSE,IID_IPicture,( LPVOID*)&(*lppi));pstm->Release();一个相对完整的步骤//加载图片BOOL CPicTestDlg::LoadMyJpegFile(CString fname,LPPICTURE*lppi){HANDLEhFile=CreateFile(fname,GENERIC_READ,0,NULL,OPEN_EXISTING ,0,NULL);if(hFile==INVALID_HANDLE_VALUE){CString str;str.Format(_T("%s无法被打开"),fname);MessageBox(str);return FALSE;}//取得文件大小DWORD dwFileSize=GetFileSize(hFile,NULL);if((DWORD)-1==dwFileSize){CloseHandle(hFile);MessageBox(_T("图像文件是空的"));return FALSE;}//读取图像文件LPVOID pvData;//按文件大小分配内存HGLOBALhGlobal=GlobalAlloc(GMEM_MOVEABLE,dwFileSize);if(NULL==hGlobal){CloseHandle(hFile);MessageBox(_T("内存不足,无法分配足够内存"));return FALSE;}pvData=GlobalLock(hGlobal);if(NULL==pvData){GlobalUnlock(hGlobal);CloseHandle(hFile);MessageBox(_T("无法锁定内存"));return FALSE;}DWORD dwFileRead=0;BOOLbRead=ReadFile(hFile,pvData,dwFileSize,&dwFileRead,NULL);GlobalUnlock(hGlobal);CloseHandle(hFile);if(FALSE==bRead){MessageBox(_T("读文件出错"));return FALSE;}LPSTREAM pstm=NULL;//从已分配内存生成IStream流HRESULT hr=CreateStreamOnHGlobal(hGlobal,TRUE,&pstm);if(!SUCCEEDED(hr)){MessageBox(_T("生成流操作失败"));if(pstm!=NULL)pstm->Release();return FALSE;}else if(pstm==NULL){MessageBox(_T("生成流操作失败"));return FALSE;}if(!*lppi)(*lppi)->Release();hr=OleLoadPicture(pstm,dwFileSize,FALSE,IID_IPicture,(LPVO ID*)&(*lppi));pstm->Release();if(!SUCCEEDED(hr)){MessageBox(_T("加载操作失败"));return FALSE;}else if(*lppi==NULL){MessageBox(_T("加载操作失败"));return FALSE;}return TRUE;}//绘制图片TCHAR strPath[MAX_PATH];memset(strPath,0,MAX_PATH);//得到当前路径GetCurrentDirectory(MAX_PATH,strPath);//定义图片路径wcscat_s(strPath,MAX_PATH,_T("\\145.bmp"));//加载图片到m_lppim_bHadLoad=LoadMyJpegFile(strPath,&m_lppi);//取得绘图设备CDC *pDC=GetDC();//定义绘图矩形区域CRect rc;//得到图片长宽long hmWidth=0;long hmHeight=0;m_lppi->get_Height(&hmHeight);m_lppi->get_Width(&hmWidth);//定义区域与设备关联GetClientRect(&rc);int nWidth,nHeight;//得到设备的长宽nWidth=rc.Width();nHeight=rc.Height();//绘制图片到设备区域HRESULThr=m_lppi->Render(pDC->m_hDC,nWidth,0,-nWidth,nHeight,hmWidt h,hmHeight,-hmWidth,-hmHeight,&rc);使用以上内容可以在mfc的窗体中的任何地方绘制图片,重绘的时候,需要在方法OnPaint()中加以定义,另外可以在OnInitDialog()中提前加载图片到内存中.void CsymmetryImageDlg::OnBnClickedOpenimage(){CFileDialog fileDlg(true, (LPCTSTR)_T("BMP文件"), (LPCTSTR)_T("*.bmp"), OFN_HIDEREADONL Y, (LPCTSTR)_T("BMP文件|*.bmp"), NULL);if (fileDlg.DoModal() == IDOK){/// 获得图像文件路径m_imagePath.SetWindowText(fileDlg.GetPathName());/// 直接用PictureBox显示BMP图像HBITMAP hBitmap = (HBITMAP)::LoadImage(NULL, fileDlg.GetPathName(), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);m_pictureBox.SetBitmap(hBitmap);}UpdateData(FALSE);}void CsymmetryImageDlg::OnBnClickedButton1(){// TODO: 在此添加控件通知处理程序代码CFileDialog fileDlg(true, (LPCTSTR)_T("JPG文件"), (LPCTSTR)_T("*.jpg"), OFN_HIDEREADONL Y, (LPCTSTR)_T("JPG文件|*.jpg"), NULL);if (fileDlg.DoModal() == IDOK){GetDlgItem(IDC_EDIT1)->SetWindowText(fileDlg.GetPathName());/// 显示jpg图像CImage image;image.Load((LPCTSTR)(fileDlg.GetPathName()));HDC hdc = ::GetDC(this->m_hWnd);image.Draw(hdc, 300, 200);}UpdateData(FALSE);}本文来自CSDN博客,转载请标明出处:/jianuMan/archive/2010/09/19/5895625.aspx。