ID #20622

用IPicture显示图片

用过 VC 的人都知道 VC 在图像显示方面不如 VB 方便,网上介绍了很多实现的方法,那些冗长的代码令许多初学者忘而却步。为此,本人将下列代码封装在一个函数中(有很强的可移值性),供各位参考。在调用函数的时候只要给定图片的文件名、输出窗口的 HWND和显示图片大小(是指实际想将图片放大或缩小后的尺寸)。

#include <ocidl.h>
#include <olectl.h>

// lpstrFile:文件名(最好是包含路径在内)
// hWnd
// nScrWidth:输出图片的宽度
// nScrHeight:输出图片的高度
// nScrWidth、nScrHeight是输出图片的实际大小,换而言之是指缩放后的尺寸

HRESULT ShowPic(char *lpstrFile,HWND hWnd,int nScrWidth,int nScrHeight)
{
HDC hDC_Temp=GetDC(hWnd);

IPicture *pPic;
IStream *pStm;

BOOL bResult;

HANDLE hFile=NULL;
DWORD dwFileSize,dwByteRead;

//打开硬盘中的图形文件
hFile=CreateFile(lpstrFile,GENERIC_READ,
FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);

if (hFile!=INVALID_HANDLE_value)
{
dwFileSize=GetFileSize(hFile,NULL);//获取文件字节数

if (dwFileSize==0xFFFFFFFF)
return E_FAIL;
}
else
{
return E_FAIL;
}

//分配全局存储空间
HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, dwFileSize);
LPVOID pvData = NULL;

if (hGlobal == NULL)
return E_FAIL;

if ((pvData = GlobalLock(hGlobal)) == NULL)//锁定分配内存块
return E_FAIL;

ReadFile(hFile,pvData,dwFileSize,&dwByteRead,NULL);//把文件读入内存缓冲区

GlobalUnlock(hGlobal);

CreateStreamOnHGlobal(hGlobal, TRUE, &pStm);

//装入图形文件
bResult=OleLoadPicture(pStm,dwFileSize,TRUE,IID_IPicture,(LPVOID*)&pPic);

if(FAILED(bResult))
return E_FAIL;

OLE_XSIZE_HIMETRIC hmWidth;//图片的真实宽度
OLE_YSIZE_HIMETRIC hmHeight;//图片的真实高度
pPic->get_Width(&hmWidth);
pPic->get_Height(&hmHeight);

//将图形输出到屏幕上(有点像BitBlt)
bResult=pPic->Render(hDC_Temp,0,0,nScrWidth,nScrHeight,
0,hmHeight,hmWidth,-hmHeight,NULL);

pPic->Release();

CloseHandle(hFile);//关闭打开的文件

if (SUCCEEDED(bResult))
{
return S_OK;
}
else
{
return E_FAIL;
}
}

以上代码通过了 VC6.0 SDK 调试


网友对该文章的评论
网友: 匿名 发表于: 2004-6-9 14:10:49

首页 | 投稿




您的位置:PCVC.net >> 平台/系统 >> Console/Win32/SDK/DDK >> 正文

 
用IPicture显示图片

2002-12-23 13:17:02 PCVC.NET 海觅天 阅读次数: 6823
用过 VC 的人都知道 VC 在图像显示方面不如 VB 方便,网上介绍了很多实现的方法,那些冗长的代码令许多初学者忘而却步。为此,本人将下列代码封装在一个函数中(有很强的可移值性),供各位参考。在调用函数的时候只要给定图片的文件名、输出窗口的 HWND和显示图片大小(是指实际想将图片放大或缩小后的尺寸)。

#include <ocidl.h>
#include <olectl.h>

// lpstrFile:文件名(最好是包含路径在内)
// hWnd
// nScrWidth:输出图片的宽度
// nScrHeight:输出图片的高度
// nScrWidth、nScrHeight是输出图片的实际大小,换而言之是指缩放后的尺寸

HRESULT ShowPic(char *lpstrFile,HWND hWnd,int nScrWidth,int nScrHeight)
{
HDC hDC_Temp=GetDC(hWnd);

IPicture *pPic;
IStream *pStm;

BOOL bResult;

HANDLE hFile=NULL;
DWORD dwFileSize,dwByteRead;

//打开硬盘中的图形文件
hFile=CreateFile(lpstrFile,GENERIC_READ,
FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);

if (hFile!=INVALID_HANDLE_value)
{
dwFileSize=GetFileSize(hFile,NULL);//获取文件字节数

if (dwFileSize==0xFFFFFFFF)
return E_FAIL;
}
else
{
return E_FAIL;
}

//分配全局存储空间
HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, dwFileSize);
LPVOID pvData = NULL;

if (hGlobal == NULL)
return E_FAIL;

if ((pvData = GlobalLock(hGlobal)) == NULL)//锁定分配内存块
return E_FAIL;

ReadFile(hFile,pvData,dwFileSize,&dwByteRead,NULL);//把文件读入内存缓冲区

GlobalUnlock(hGlobal);

CreateStreamOnHGlobal(hGlobal, TRUE, &pStm);

//装入图形文件
bResult=OleLoadPicture(pStm,dwFileSize,TRUE,IID_IPicture,(LPVOID*)&pPic);

if(FAILED(bResult))
return E_FAIL;

OLE_XSIZE_HIMETRIC hmWidth;//图片的真实宽度
OLE_YSIZE_HIMETRIC hmHeight;//图片的真实高度
pPic->get_Width(&hmWidth);
pPic->get_Height(&hmHeight);

//将图形输出到屏幕上(有点像BitBlt)
bResult=pPic->Render(hDC_Temp,0,0,nScrWidth,nScrHeight,
0,hmHeight,hmWidth,-hmHeight,NULL);

pPic->Release();

CloseHandle(hFile);//关闭打开的文件

if (SUCCEEDED(bResult))
{
return S_OK;
}
else
{
return E_FAIL;
}
}

以上代码通过了 VC6.0 SDK 调试


网友对该文章的评论
网友: iam863([email protected]) 发表于: 2004-4-23 9:32:22

IID_IPicture 什么意思?

网友: 匿名 发表于: 2004-3-12 17:07:38

如果用这种方法把图像显示在屏幕上后,想把文件另存为另外一个名字,该怎么实现呢?

网友: chu_f([email protected]) 发表于: 2003-5-28 23:14:09

请教一下,是不是直接加一个函数就可以了?
能不能显示 *.gif图片呢?
有谁知道能不能帮忙一下,很急。先谢谢了。

网友: you([email protected]) 发表于: 2003-5-13 8:19:19

用IPicture显示图片

2002-12-23 13:17:02 PCVC.NET 海觅天 阅读次数: 2704
用过 VC 的人都知道 VC 在图像显示方面不如 VB 方便,网上介绍了很多实现的方法,那些冗长的代码令许多初学者忘而却步。为此,本人将下列代码封装在一个函数中(有很强的可移值性),供各位参考。在调用函数的时候只要给定图片的文件名、输出窗口的 HWND和显示图片大小(是指实际想将图片放大或缩小后的尺寸)。

#include <ocidl.h>
#include <olectl.h>

// lpstrFile:文件名(最好是包含路径在内)
// hWnd
// nScrWidth:输出图片的宽度
// nScrHeight:输出图片的高度
// nScrWidth、nScrHeight是输出图片的实际大小,换而言之是指缩放后的尺寸

HRESULT ShowPic(char *lpstrFile,HWND hWnd,int nScrWidth,int nScrHeight)
{
HDC hDC_Temp=GetDC(hWnd);

IPicture *pPic;
IStream *pStm;

BOOL bResult;

HANDLE hFile=NULL;
DWORD dwFileSize,dwByteRead;

//打开硬盘中的图形文件
hFile=CreateFile(lpstrFile,GENERIC_READ,
FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);

if (hFile!=INVALID_HANDLE_value)
{
dwFileSize=GetFileSize(hFile,NULL);//获取文件字节数

if (dwFileSize==0xFFFFFFFF)
return E_FAIL;
}
else
{
return E_FAIL;
}

//分配全局存储空间
HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, dwFileSize);
LPVOID pvData = NULL;

if (hGlobal == NULL)
return E_FAIL;

if ((pvData = GlobalLock(hGlobal)) == NULL)//锁定分配内存块
return E_FAIL;

ReadFile(hFile,pvData,dwFileSize,&dwByteRead,NULL);//把文件读入内存缓冲区

GlobalUnlock(hGlobal);

CreateStreamOnHGlobal(hGlobal, TRUE, &pStm);

//装入图形文件
bResult=OleLoadPicture(pStm,dwFileSize,TRUE,IID_IPicture,(LPVOID*)&pPic);

if(FAILED(bResult))
return E_FAIL;

OLE_XSIZE_HIMETRIC hmWidth;//图片的真实宽度
OLE_YSIZE_HIMETRIC hmHeight;//图片的真实高度
pPic->get_Width(&hmWidth);
pPic->get_Height(&hmHeight);

//将图形输出到屏幕上(有点像BitBlt)
bResult=pPic->Render(hDC_Temp,0,0,nScrWidth,nScrHeight,
0,hmHeight,hmWidth,-hmHeight,NULL);

pPic->Release();

CloseHandle(hFile);//关闭打开的文件

if (SUCCEEDED(bResult))
{
return S_OK;
}
else
{
return E_FAIL;
}
}

以上代码通过了 VC6.0 SDK 调试


网友对该文章的评论
网友: bcfy([email protected]) 发表于: 2003-2-18 9:43:10

怎么图象显示不出来!

网友: Awing([email protected]) 发表于: 2003-2-12 21:54:51

一个英文版的应用程式(POWERPCB),是用来设计线路板的;我想在其窗口中放进中文,也就是在线路板上放中文;请问用VC++如何实现?
用c语言有很多办法,但都是在DOS下的。请指点。

另外,汉化菜单是怎样实现的?

菜鸟Awing.

网友: Martin([email protected]) 发表于: 2003-1-27 9:10:37

I have a question for your help,thanks!
I want display image use ipicture by a byte stream not a file and use in VB, how can i realize?

网友: norsd 发表于: 2003-1-20 16:59:16

GDI+

网友: SEABLUES 发表于: 2002-12-24 21:30:24

把它封装成类CPicture比较好用.



网友: bcfy([email protected]) 发表于: 2003-2-18 9:43:10

怎么图象显示不出来!

网友: Awing([email protected]) 发表于: 2003-2-12 21:54:51

一个英文版的应用程式(POWERPCB),是用来设计线路板的;我想在其窗口中放进中文,也就是在线路板上放中文;请问用VC++如何实现?
用c语言有很多办法,但都是在DOS下的。请指点。

另外,汉化菜单是怎样实现的?

菜鸟Awing.

网友: Martin(mar[email protected]) 发表于: 2003-1-27 9:10:37

I have a question for your help,thanks!
I want display image use ipicture by a byte stream not a file and use in VB, how can i realize?

网友: norsd 发表于: 2003-1-20 16:59:16

GDI+

网友: SEABLUES 发表于: 2002-12-24 21:30:24

把它封装成类CPicture比较好用.

+欢迎加入+

笔名: E-Mail:


 

--------------------------------------------------------------------------------

关于本站 | 版权声明 | 联系方式 | SaySentence.com

Copyright (C) 2001 - 2002 PCVC.NET, QingB Studio. All Rights Reserved.



网友: iam863([email protected]) 发表于: 2004-4-23 9:32:22

IID_IPicture 什么意思?

网友: 匿名 发表于: 2004-3-12 17:07:38

如果用这种方法把图像显示在屏幕上后,想把文件另存为另外一个名字,该怎么实现呢?

网友: chu_f([email protected]) 发表于: 2003-5-28 23:14:09

请教一下,是不是直接加一个函数就可以了?
能不能显示 *.gif图片呢?
有谁知道能不能帮忙一下,很急。先谢谢了。

网友: you([email protected]) 发表于: 2003-5-13 8:19:19

用IPicture显示图片

2002-12-23 13:17:02 PCVC.NET 海觅天 阅读次数: 2704
用过 VC 的人都知道 VC 在图像显示方面不如 VB 方便,网上介绍了很多实现的方法,那些冗长的代码令许多初学者忘而却步。为此,本人将下列代码封装在一个函数中(有很强的可移值性),供各位参考。在调用函数的时候只要给定图片的文件名、输出窗口的 HWND和显示图片大小(是指实际想将图片放大或缩小后的尺寸)。

#include <ocidl.h>
#include <olectl.h>

// lpstrFile:文件名(最好是包含路径在内)
// hWnd
// nScrWidth:输出图片的宽度
// nScrHeight:输出图片的高度
// nScrWidth、nScrHeight是输出图片的实际大小,换而言之是指缩放后的尺寸

HRESULT ShowPic(char *lpstrFile,HWND hWnd,int nScrWidth,int nScrHeight)
{
HDC hDC_Temp=GetDC(hWnd);

IPicture *pPic;
IStream *pStm;

BOOL bResult;

HANDLE hFile=NULL;
DWORD dwFileSize,dwByteRead;

//打开硬盘中的图形文件
hFile=CreateFile(lpstrFile,GENERIC_READ,
FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);

if (hFile!=INVALID_HANDLE_value)
{
dwFileSize=GetFileSize(hFile,NULL);//获取文件字节数

if (dwFileSize==0xFFFFFFFF)
return E_FAIL;
}
else
{
return E_FAIL;
}

//分配全局存储空间
HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, dwFileSize);
LPVOID pvData = NULL;

if (hGlobal == NULL)
return E_FAIL;

if ((pvData = GlobalLock(hGlobal)) == NULL)//锁定分配内存块
return E_FAIL;

ReadFile(hFile,pvData,dwFileSize,&dwByteRead,NULL);//把文件读入内存缓冲区

GlobalUnlock(hGlobal);

CreateStreamOnHGlobal(hGlobal, TRUE, &pStm);

//装入图形文件
bResult=OleLoadPicture(pStm,dwFileSize,TRUE,IID_IPicture,(LPVOID*)&pPic);

if(FAILED(bResult))
return E_FAIL;

OLE_XSIZE_HIMETRIC hmWidth;//图片的真实宽度
OLE_YSIZE_HIMETRIC hmHeight;//图片的真实高度
pPic->get_Width(&hmWidth);
pPic->get_Height(&hmHeight);

//将图形输出到屏幕上(有点像BitBlt)
bResult=pPic->Render(hDC_Temp,0,0,nScrWidth,nScrHeight,
0,hmHeight,hmWidth,-hmHeight,NULL);

pPic->Release();

CloseHandle(hFile);//关闭打开的文件

if (SUCCEEDED(bResult))
{
return S_OK;
}
else
{
return E_FAIL;
}
}

以上代码通过了 VC6.0 SDK 调试


2005-03-14 00:00
阅读:
I'm VC , Just U know Y
本站部分文章来源于互联网,版权归原作者所有。

延伸阅读:

从32位应用程序到64位应用程序

使用VC++开发考场随机排座系统

VC6下用控件进行串口通信

通用的应用程序高级日志系统

用VC6实现IE工具栏