//************************************

// 方法说明:    显示JPG和GIF、BMP图片

// 参数说明:    CDC * pDC           设备环境对象

// 参数说明:    CString strPath     要显示的图片路径

// 参数说明:    int x               要显示的X位置

// 参数说明:    int y               要显示的Y位置

// 返回值:      BOOL                成功返回TRUE,否则返回FALSE

//************************************

BOOL CShowJpgDlg::ShowJpgGif(CDC* pDC,CString strPath, int x, int y)

{

CFileStatus fstatus;

CFile file;

ULONGLONG cb;

// 打开文件并检测文件的有效性

if (!file.Open(strPath,CFile::modeRead))

{

return FALSE;

}

if (!file.GetStatus(strPath,fstatus))

{

return FALSE;

}

if ((cb =fstatus.m_size)<=0)

{

return FALSE;

}

// 根据文件大小分配内存空间,记得释放内存

HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, (unsigned int)cb);

if (hGlobal== NULL)

{

return FALSE;

}

// 锁定刚才分配的内存空间

LPVOID pvData = NULL;

pvData = GlobalLock(hGlobal);

if (pvData == NULL)

{

GlobalFree(hGlobal);  // 记得释放内存

return FALSE;

}

// 将文件放到流中

IStream *pStm;

file.Read(pvData,(unsigned int)cb);

GlobalUnlock(hGlobal);

CreateStreamOnHGlobal(hGlobal, TRUE, &pStm);

// 从流中加载图片

// 显示JPEG和GIF格式的图片,GIF只能显示一帧,还不能显示动画,

// 要显示动画GIF请使用ACTIVE控件。

IPicture *pPic;

if(OleLoadPicture(pStm,(LONG)fstatus.m_size,TRUE,IID_IPicture,(LPVOID*)&pPic)!=S_OK)

{

GlobalFree(hGlobal);  // 记得释放内存

return FALSE;

}

//获取图像宽和高,注意这里的宽和高不是图像的分辨率

OLE_XSIZE_HIMETRIC hmWidth;

OLE_YSIZE_HIMETRIC hmHeight;

pPic->get_Width(&hmWidth);

pPic->get_Height(&hmHeight);

// 将图像宽度和高度单位转化为像素单位

//#define HIMETRIC_PER_INCH 2540

//int nPicWidth =  MulDiv(hmWidth, GetDeviceCaps(GetDC()->m_hDC, LOGPIXELSX),2540);

//int nPicHeight = MulDiv(hmHeight, GetDeviceCaps(GetDC()->m_hDC, LOGPIXELSY),2540);

//HRESULT Render(

//    HDC hdc, //Handle of device context on which to render the image

//    long x,  //Horizontal position of image in hdc

//    long y,  //Vertical position of image in hdc

//    long cx, //Horizontal dimension of destination rectangle

//    long cy, //Vertical dimension of destination rectangle

//    OLE_XPOS_HIMETRIC xSrc,      //Horizontal offset in source picture

//    OLE_YPOS_HIMETRIC ySrc,      //Vertical offset in source picture

//    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

//    );

//use render function display image

RECT rtWnd;

pDC->GetWindow()->GetWindowRect(&rtWnd);

int iWndWidth=rtWnd.right-rtWnd.left;

int iWndHeight=rtWnd.bottom-rtWnd.top;

if(FAILED(pPic->Render(*pDC,x,y,iWndWidth,iWndHeight,0,hmHeight,hmWidth,-hmHeight,NULL)))

{

pPic->Release();

GlobalFree(hGlobal);  // 记得释放内存

return false;

}

pPic->Release();

GlobalFree(hGlobal);  // 记得释放内存

return true;

}

//************************************

// 方法说明:    显示JPG和GIF、BMP图片

// 参数说明:    CDC * pDC           设备环境对象

// 参数说明:    CString strPath     要显示的图片路径

// 参数说明:    int x               要显示的X位置

// 参数说明:    int y               要显示的Y位置

// 返回值:      BOOL                成功返回TRUE,否则返回FALSE

//************************************

BOOL CShowJpgDlg::ShowImage(CDC* pDC,CString strPath, int x, int y)

{

IPicture *pPic=NULL;

OleLoadPicturePath(CComBSTR(strPath.GetBuffer()), (LPUNKNOWN)NULL, 0, 0, IID_IPicture,(LPVOID*)&pPic);

if (NULL==pPic)

{

return FALSE;

}

// 获取图像宽和高,注意这里的宽和高不是图像的分辨率

OLE_XSIZE_HIMETRIC hmWidth;

OLE_YSIZE_HIMETRIC hmHeight;

pPic->get_Width(&hmWidth);

pPic->get_Height(&hmHeight);

// 将图像宽度和高度单位转化为像素单位

//#define HIMETRIC_PER_INCH 2540

//int nPicWidth =  MulDiv(hmWidth, GetDeviceCaps(GetDC()->m_hDC, LOGPIXELSX),2540);

//int nPicHeight = MulDiv(hmHeight, GetDeviceCaps(GetDC()->m_hDC, LOGPIXELSY),2540);

// 获取显示图片窗口的宽度和高度

RECT rtWnd;

pDC->GetWindow()->GetWindowRect(&rtWnd);

int iWndWidth=rtWnd.right-rtWnd.left;

int iWndHeight=rtWnd.bottom-rtWnd.top;

if(FAILED(pPic->Render(*pDC,x,y,iWndWidth,iWndHeight,0,hmHeight,hmWidth,-hmHeight,NULL)))

{

pPic->Release();

return false;

}

//记得释放资源,不然会导致内存泄露

pPic->Release();

return true;

}

//************************************

// 方法说明:    浏览图片

// 返回值:      void

//************************************

void CShowJpgDlg::OnBnClickedBtnBrowse()

{

// TODO: Add your control notification handler code here

CFileDialog dlg(TRUE,"jpg","*.jpg", OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,

"JPEG文件(*.jpg)|*.jpg|GIF文件(*.gif)|*.gif|bmp文件(*.bmp)|*.bmp|",NULL);

if(dlg.DoModal()==IDOK)

{

SetDlgItemText(IDC_TXT_PATH,dlg.GetPathName());

//设置静态控件的样式,使其可以使用位图,并使位图显示居中

((CStatic*)GetDlgItem(IDC_STATIC_IMG))-> ModifyStyle(0xF,SS_BITMAP|SS_CENTERIMAGE);

CDC *pDC=NULL;

pDC=GetDlgItem(IDC_STATIC_IMG)->GetDC();

//ShowJpgGif(pDC,dlg.GetPathName(),0,0);

ShowImage(pDC,dlg.GetPathName(),0,0);

ReleaseDC(pDC);// 记得释放资源,不然会导致内存泄露

}

}

1、MFC对话框显示BMP图片

我们先从简单的开始吧.先分一个类:

(一) 非动态显示图片(即图片先通过资源管理器载入,有一个固定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;

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,图像将被绘制在控件上

//若用以下两句,得到的是屏幕的DC,图片将被绘制在屏幕上/////////////////////////////////////////////////////
      
       //  CDC dc;

//  dc.m_hDC=::GetDC(NULL);

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

以上转自:http://blog.csdn.net/cecilia214/article/details/5346302

以下转自:http://topic.csdn.net/u/20090410/10/ad7a5afe-c906-45ff-a673-f601e2ec05be.html

2、MFC对话框显示JPEG图片

放在对话框的OnPaint里

                                                 } 

MFC对话框中显示BMP,JPG图片的更多相关文章

  1. MFC对话框中显示背景图片

    在MFC对话框中显示图片,四个步骤. 1.首先得在VC6.0或者VS2008(其他版本也是一样)中导入GDI文件.(网上下载:) GDI含义是图形设备接口,主要任务是负责系统与绘图程序之间的信息交换, ...

  2. MFC对话框中使用CHtmlEditCtrl

    MFC对话框中使用CHtmlEditCtrl 感谢原帖作者: http://blog.csdn.net/tingya/article/details/2028172 我在VS2008校正了一些代码. ...

  3. 在MFC对话框中添加状态栏

    如果我们想实现在MFC对话框中添加状态栏显示,如何例如分状态栏为两列,第一列显示鼠标的当前位置,第二列显示当前的时间,(如上图). 1. 首先,打开在资源视图的String Table并添加两个ID: ...

  4. Android中显示gif动态图片

    在android中显示一个静态图片比如png jpg等等都很方便,但是如果要显示一个gif 动态图片就需要进行一些处理. 本文是采用自定义view 然后进行重新onDraw方法来实现 首先自定义Vie ...

  5. C#.NET中使用BackgroundWorker在模态对话框中显示进度条

    这里是一个示例,其中展示了如何使用Backgroundworker对象在模态对话框中显示后台操作的实时进度条. 首先是主窗体代码: using System; using System.Collect ...

  6. MFC中显示 .bmp格式的位图

    最近在看VisualC++ 图像处理的书籍,表示一直在从基础做起,今天就记录一个简单功能的实现,显示.bmp格式的位图. 首先需要理解的是窗口创建的过程包括两个步骤:首先擦除窗口的背景,然后在对窗口进 ...

  7. MFC 对话框不显示,返回-1 原因

    DoModal失败原因 1.MFC 通常对话框不显示的原因有 1 父窗口HWND无效 2 在ONINITDIALOG里用了ENDDIALOG 3 无效的对话框资源ID 4 使用没有注册的的自定义控件 ...

  8. 在MFC对话框中快速集成三维控件

    在MFC的对话框中可以方便的集成AnyCAD三维控件(c++版本),遵循一下几步: 1.在对话框资源中增加一个Static控件,ID为IDC_STATIC_3D,并且把它的Notify属性设置为Tru ...

  9. Flash图表控件FusionCharts如何在图表中显示标识和图片

    在FusionCharts的图表中显示外部商标 使用FusionCharts之后,用户可以在运行时加载需要在图表中显示的外部标识/图片/图像.这个标识可以GIF / JPEG / PNG或SWF文件格 ...

随机推荐

  1. Android 用HorizontalScrollView实现ListView的Item滑动删除 ,滑动错乱 冲突

    用HorizontalScrollView实现类似微信的滑动删除 测试于:Android2.2+ 对于Android来说按键操作已经在减少,越来越多的手势操作层出不穷,今天介绍一款LIstView的I ...

  2. hive内部表、外部表、分区表、视图

    1.Table 内部表 1).与数据库中的Table在概念上是类似的 2).每一个Table在Hive中都有一个相应的目录存储数据 3).所有的Table数据(不包括 External Table) ...

  3. 关于ckeditor ajax提交到后台 问题

    ckeditor 提交时 如果有带有html时是提交不了的 解决办法就是 你在提交的时候 将ckeditor获取的只编码(encodeURI) 然后在传到后台提交的时候 在解码 就ok了 ckname ...

  4. ACM知识点

    基础算法 高精 模拟 分治 贪心 排序 DFS 迭代加深搜索 BFS 双向BFS 动态规划 DAG上DP 树上DP 线性DP 图算法 最短路 FLYD DJATL BF 最大流 Dinic ISAP ...

  5. MFC 编辑框中字体大小改变,行高不能改变,只能显示一半的问题,已解决。

    CKagulaCEdit是CEdit的一个继承类,m_edit的CKagulaCEdit类型的一个变量 调用的时候,是这样的: 编辑框中字体大小改变,行高不能改变,只能显示一半的问题,问题如下: 这时 ...

  6. linux系统limit知识

    1.limit限制每个shell进程和它的子进程对资源的占用.每个登录,还是每个进程? 比如ulimit -n 10240 可以临时改变当前session的shell进程的文件句柄数限制,退出当前窗口 ...

  7. NPOI操作Excel导入DataTable中

    using NPOI.HSSF.UserModel; using NPOI.SS.UserModel; using System.Data; using System.IO; using NPOI.X ...

  8. jquery中的ajax参数

    jquery中将ajax封装成了函数,我们使用起来非常方便,jquery会自动根据内容选择post还是get方式提交数据,并且会自动编码,但是要想完全掌握jquery中的ajax,我们必须将它的各个参 ...

  9. 用CMake构建Qt5的Visual Studio工程

    使用Visual Studio构建Qt工程的方法有很多种,可以使用Visual Studio自带的功能手动创建配置工程,也可以创建pro文件,然后通过VS的Qt插件导入进行创建.还有一种方式是通过CM ...

  10. 常用到的git,mvn,postgres,vim命令总结

    mvn: 打包: mvn package 如果想在打包的时候跳过测试: mvn package -Dmaven.test.skip=true 使用的junit测试框架, 测试: mvn test 如果 ...