VC 中用 IPicture 在窗口中显示图片文件
2011年01月01日
想做个东西,用VC,希望是在程序界面上能把指定 URL 的图片显示出来,还没找到如何显示 HTTP 资源的图片,先还是让本地图片能在 VC 的窗口(包括各种控件)中显示出来吧。在网上搜索了一番,大家代码都如出一辙,我也不能生搬硬载,不由又亲手实践了一下,并连同原来学过的 Window SDK 做窗口程序也复习了一遍,没有使用到 MFC,只需存成单个源文件,甚至用 CL 命令来编译都无须打开 VC 的,在 VC6 中测试通过。
效果图如下:
代码如下:(仅需关键最后一个方法 ShowPic(char *lpstrFile, HWND hWnd))
#include // Windows SDK 要用到的
#include // 打开文件的窗口要包含这个头文件
//用到了 IPicture 接口,要包含下面两个 头文件
#include
#include
// 声明窗口函数的原型
LRESULT CALLBACK MainWndProc (HWND, UINT, WPARAM, LPARAM);
// 声明显示图片的函数原型
HRESULT ShowPic(char *lpstrFile,HWND hWnd) ;
//图片文件名
char lpstrFile[MAX_PATH]="";
int WINAPI WinMain (HINSTANCE hThisInstance,
HINSTANCE hPrevInstance,
LPSTR lpszArgument,
int nFunsterStil)
{
// 窗口类名
char szClassName[ ] = "ShowPicture";
WNDCLASSEX windclass;
//用描述主窗口的参数填充 WNDCLASSEX 结构
windclass.cbSize = sizeof(windclass); //结构大小
windclass.hInstance = hThisInstance; //实例句酚
windclass.lpszClassName = szClassName;
windclass.lpfnWndProc = MainWndProc; //窗口函数指针
windclass.style = CS_DBLCLKS; //捕获双击事件
windclass.cbSize = sizeof (WNDCLASSEX);
windclass.hIcon = LoadIcon (NULL, IDI_APPLICATION); //使用预定义图标
windclass.hIconSm = LoadIcon (NULL, IDI_APPLICATION); //使用预定义类的小图标
windclass.hCursor = LoadCursor (NULL, IDC_ARROW); //使用预定义光标
windclass.lpszMenuName = NULL; //不指定主菜单
windclass.cbClsExtra = 0; //没有额外的类内存
windclass.cbWndExtra = 0; //没有额外的窗口内存
windclass.hbrBackground = (HBRUSH) COLOR_BACKGROUND; //使用预定义背景画刷
//注册这个窗口类,如果失败直接退出程序
if (!RegisterClassEx (&windclass))
return 0;
//创建主窗口
HWND hWnd = CreateWindowEx (
0, //dwExStyle, 扩展样式
szClassName, //lpClassName, 类名
"显示图片 -- 鼠标双击浏览图片文件 -- Author:Unmi", //lpWindowName, 标题
WS_OVERLAPPEDWINDOW, //dwStyle, 窗口风格
CW_USEDEFAULT, //X, 初始 X 坐标
CW_USEDEFAULT, //Y, 初始 YX 坐标
640, //nWidth, 宽度
480, //nHeight, 高度
HWND_DESKTOP, //hWndParent, 父窗口句柄
NULL, //hMenu, 菜单句柄
hThisInstance, //hInstance, 程序实例句柄
NULL //lpParam, 用户数据
);
//显示窗口,刷新窗口客户区
ShowWindow (hWnd, nFunsterStil);
// 从消息队列中取出消息,交给窗口函数处理
// 直到 GetMessage 取出的消息是 WM_QUIT,即FALSE,则结束消息循环
MSG messages;
while (GetMessage (&messages, NULL, 0, 0))
{
//转换键盘消息,把虚拟键转换为字符消息
TranslateMessage(&messages);
//将消息发送到相应的窗口函数
DispatchMessage(&messages);
}
// GetMessage 返回 FALSE,程序结束 PostQuitMessage() 发出这一消息
return messages.wParam;
}
// 窗口函数,消息由 DispatchMessage 派发
LRESULT CALLBACK MainWndProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message) //处理消息
{
case WM_DESTROY:
//向消息队列投递一个 WM_QUIT 消息,促使 GetMessage 函数返回0,结束消息循环
PostQuitMessage (0);
break;
case WM_LBUTTONDBLCLK:
{
OPENFILENAME file = {0};
file.lStructSize = sizeof(file);
file.lpstrTitle = "请选择一个图片文件";
file.lpstrFile = lpstrFile;
file.nMaxFile = MAX_PATH;
file.lpstrFilter = "Pictures(*.jpg,*.gif,*.bmp)*.jpg;*.gif;*.bmp";
if(::GetOpenFileName(&file))
{
//清除原来的图像
HDC hdc=GetDC(hWnd);
RECT rect;
::GetWindowRect(hWnd,&rect);
::FillRect(hdc,&rect,(HBRUSH) COLOR_BACKGROUND);
::SendMessage(hWnd,WM_PAINT,NULL,NULL);
}
}
break;
case WM_PAINT:
ShowPic(lpstrFile,hWnd);
break;
default:
//将我们不处理的消息交给系统 做默认处理
return DefWindowProc (hWnd, message, wParam, lParam);
}
return 0;
}
// 显示图片,此文的重点之所在了, lpstrFile 为图片文件名,hWnd 为窗口句柄
HRESULT ShowPic(char *lpstrFile,HWND hWnd)
{
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);
//转换hmWidth和hmHeight为pixels距离,1英寸=25.4毫米
int nWidth = MulDiv(hmWidth,GetDeviceCaps(hDC_Temp,LOGPIXELSX),2540);
int nHeight = MulDiv(hmHeight,GetDeviceCaps(hDC_Temp,LOGPIXELSY),2540);
//将图形输出到屏幕上(有点像BitBlt)
bResult=pPic->Render(hDC_Temp,0,0,nWidth,nHeight,
0,hmHeight,hmWidth,-hmHeight,NULL);
pPic->Release();
CloseHandle(hFile);//关闭打开的文件
if (SUCCEEDED(bResult))
{
return S_OK;
}
else
{
return E_FAIL;
}
}
发表评论
-
堆栈的认知!
2012-01-20 10:15 524堆栈的认知! 2010年11月2 ... -
堆和栈的区别
2012-01-20 10:15 547堆和栈的区别 2010年10 ... -
VC串口通讯win32SDK版
2012-01-20 10:14 765VC串口通讯win32SDK版 2011年05月14日 ... -
Eclipse插件之Java代码分析工具: FindBugs
2012-01-20 10:14 679Eclipse插件之Java代码分析工具: FindBugs ... -
编译 boost
2012-01-20 10:14 550编译 boost 2011年05月17日 ... -
常用词汇解释
2012-01-19 15:15 771常用词汇解释 2011年02月10日 1*Android ... -
Linux下FrameBuffer直接写屏
2012-01-19 15:15 849Linux下FrameBuffer直接写屏 2011年09月 ... -
Grub4dos命令用法
2012-01-19 15:15 684Grub4dos命令用法 2010年06月01日 blo ... -
linux下nginx+php的安装与配置
2012-01-19 15:15 586linux下nginx+php的安装与 ... -
C段错误总结
2012-01-19 15:15 676C段错误总结 2012年01月07日 最近一段时间在li ... -
读写windows注册表
2012-01-17 05:02 1313读写windows注册表 2011年05月22日 Win ... -
VC编译器配置及编译选项
2012-01-17 05:02 449VC编译器配置及编译选 ... -
VC中的0XCCCCCCCC
2012-01-17 05:02 636VC中的0XCCCCCCCC 2011年10月23日 在 ... -
Windows系统的Regsvr32
2012-01-17 05:02 782Windows系统的Regsvr32 2011 ... -
MyEclipse的javabean
2012-01-16 03:53 655MyEclipse的javabean 2010年11 ... -
MyEclipse使用Junit
2012-01-16 03:53 751MyEclipse使用Junit 2011年05月08日 ... -
MyEclipse6.5上基于JAX-WS开发Webservice
2012-01-16 03:53 544MyEclipse6.5上基于JAX-WS开发Webservi ... -
myeclipse深度剖析
2012-01-16 03:53 908myeclipse深度剖析 2010年04月16日 工欲 ... -
MyEclipse7.0
2012-01-16 03:53 689MyEclipse7.0 2010年05月06日 ...
相关推荐
在VC中显示JPEG图像。 源码为MFC编写,使用了IPicture接口对象。显示图像只使用了一个函数:DisplayPicture(),参数为图像文件名。函数代码实际分两部分,前半部分为读取图像文件,并把数据存放到IPicture对象中。后...
代码实现了用IPicture显示多种格式的图片,可以在此基础上添加自己的图像处理功能。
CPicture_src-使用IPicture接口的类显示
VC在MFC程序中显示JPG图片,GIF动画图片_IPicture_COM接口.zip
使用 Windows IPicture 接口显示图片的类。谁用谁知道!要记得评价哦!
visual c++ VC调用JPEG、GIF图像的简便方法_IPicture_COM接口
ipicture方式实现图片显示,测试了bmp格式、gif格式和jpg格式均成功
使用IPicture显示图片,使用步骤已经在界面上显示
VC下可以使用 IPicture接口来实现图片显示及放大缩小等功能,并且可以通过IImage控件来实现图片的显示
IPicture使用总结,VC图像处理接口
CPicture类利用IPicture接口实现显示图片 CPictureView类是窗口类,支持视图区滚动显示图片,简单的缩放功能。
本MFC小程序实现了下面...1.从本地读取文件,并显示在界面上 2.通过CHttpFile,CInternetSession类打开一个URL获取图片,并保存在本地, (随便在网上找个URL替换就可以) 3.从本地读取一幅图片,然后按照指定尺寸另存一份
VC 显示自适应大小的图片,在ImgView里显示一张自适应的图片,它使用了一个叫"CPicture"的类来封装IPicture。CPicture将一些麻烦的COM类型的参数映射为那些更容易被MFC程序员接受的类型,在CPicture里,你可以控制按...
程序利用CPicture类以及数据采集流IStream类实现显示。程序中OleLoadPicture将图像文件流解压释放到IPicture对象中,从此,可以通过IPicture对象显示存储图像文件。
VC6.0编写通讯录,支持添加、修改、删除、查询操作,能够存储基本文本信息及图片。优点有支持jpg文件的添加、截取、保存及显示,通讯录信息按拼音首字母排序,代码注释详细。不足之处是未能运用数据库,都是文件操作...
介绍了在VC 环境中,利用ADO 2.5中所提供的Stream对象和Fields对象进行数据库中图片的存取,同时,还利用了IPicture接口实现多种格式图片的显示,并通过控件自画的方法解决了图片显示的刷新问题。
没有无用代码,每句代码都有意义,基于IPicture显示图片,效果高,并且兼顾了了闪烁和擦除背景。 switch (nSBCode) { case SB_THUMBTRACK: { nPostion = GetScrollPos (SB_VERT); ScrollWindow(0, ...
对IPicture的封装。实用简单
有一种借助于COM接口的OLE方法来实现...其主要的接口是IPicture和IPictureDisp,图像对象也支持IPersistStream接口,所以它能从一个IStream接口的实例对象保存、装载自己,而IStream接口也支持对流对象的数据读写。
一个很好的COM组件IPICTURE应用程序。有兴趣的朋友可以参考参考。 工程名345