VC6中使用内存DC加载并显示JPG图片的注意事项
From: http://blog.csdn.net/boythl/article/details/3137446
今天在VC6中显示JPG图片,采用了内存DC缓存的方法刷新,但死活刷不出来,查了一下午才明白(没办法,很少用GDI,我小菜一个:( ):使用IPicture::Render函数向DC上贴图时,若DC是一个内存DC,一定要先SelectObject一个CBitmap,内存DC没有Bitmap是画不出来的!
另外,IPicture是COM库,需要注意初始化COM,
CMYApp::InitInstance() 里使用 CoInitialize(NULL);
CMYApp::ExitInstance() 里使用 CoUninitialize();
下面贴出显示JPG图片到DC的函数,来自网上,自己整理了下,据说还可显示GIF图片的第一祯图片,我未用到。
- /*************************************************
- Function : ShowJPG
- Description : 在DC上按图片原始尺寸显示JPG图片
- Calls :
- Called By :
- Parameter : [CDC* pDC] --- DC
- : [CString strPath] --- 要显示的图片路径,建议全路径
- : [int x] --- DC上显示的X位置
- : [int y] --- DC上显示的Y位置
- : [bool OriginalSize] --- 是否按图片原始尺寸显示,false时将按DC大小缩放
- Return : bool --- 是否成功
- Author : Unknown
- Date : 2008-10-24
- Modify :
- *************************************************/
- bool ShowJPG(CDC* pDC,CString strPath, int x, int y, bool OriginalSize)
- {
- IStream *pStm;
- CFileStatus fstatus;
- CFile file;
- LONG cb;
- //打开文件并检测文件的有效性
- if (file.Open(strPath, CFile::modeRead) &&
- file.GetStatus(strPath,fstatus) &
- ((cb = fstatus.m_size) != -1))
- {
- HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, cb);
- LPVOID pvData = NULL;
- if (hGlobal != NULL)
- {
- pvData = GlobalLock(hGlobal);
- if (pvData != NULL)
- {
- file.ReadHuge(pvData, cb);
- GlobalUnlock(hGlobal);
- CreateStreamOnHGlobal(hGlobal, TRUE, &pStm);
- }
- }
- }
- else
- {
- return false;
- }
- //打开文件结束
- //显示JPEG图片
- IPicture *pPic;
- //load image from file stream
- if(SUCCEEDED(OleLoadPicture(pStm, fstatus.m_size, TRUE,IID_IPicture, (LPVOID*)&pPic)))
- {
- if (OriginalSize) //图片原始大小显示
- {
- long nWidth = 0, nHeight = 0; // 宽高,MM_HIMETRIC 模式,单位是0.01毫米
- pPic->get_Width( &nWidth ); // 宽
- pPic->get_Height( &nHeight ); // 高
- CSize sz( nWidth, nHeight );
- pDC->HIMETRICtoDP( &sz ); // 转换 MM_HIMETRIC 模式单位为 MM_TEXT 像素单位
- pPic->Render(pDC->m_hDC, 0, 0, sz.cx, sz.cy,
- 0, nHeight, nWidth, -nHeight, NULL);
- }
- else
- {
- OLE_XSIZE_HIMETRIC hmWidth;
- OLE_YSIZE_HIMETRIC hmHeight;
- pPic->get_Width(&hmWidth);
- pPic->get_Height(&hmHeight);
- //get image height and width
- double fX,fY;
- fX = (double)pDC->GetDeviceCaps(HORZRES) * (double)hmWidth /
- ((double)pDC->GetDeviceCaps(HORZSIZE) * 100.0);
- fY = (double)pDC->GetDeviceCaps(VERTRES) * (double)hmHeight /
- ((double)pDC->GetDeviceCaps(VERTSIZE) * 100.0);
- //use render function display image
- //按图片原始大小显示
- if(FAILED(pPic->Render(*pDC,x,y,(DWORD)fX,(DWORD)fY,0,hmHeight,hmWidth,-hmHeight,NULL)))
- {
- pPic->Release();
- return false;
- }
- }
- if ( pStm ) pStm->Release(); // 释放 IStream 指针
- if ( pPic ) pPic->Release(); // 释放 IPicture 指针
- }
- else
- {
- return false;
- }
- return true;
- }
感谢vane小弟的帮助!及一个blog: http://topameng.spaces.live.com/blog/cns!f962d4854a8233d!248.entry ===================================
非注明转载的文章和blog在未特殊声明情况下一般为本人原创或整理,
原创文章版权归沙漠孤狐(lonefox)所有;转载文章版权归原作者所有;
http://blog.csdn.net/boythl
欢迎转载,但请注明出处,保留作者和版权信息。
===================================
VC6中使用内存DC加载并显示JPG图片的注意事项相关推荐
- [html] iOS下页面如何启动加载时显示画面图片?如何设置大小?它有什么好处?
[html] iOS下页面如何启动加载时显示画面图片?如何设置大小?它有什么好处? <link rel="apple-touch-startup-image" href=&q ...
- vue解决图片加载失败显示默认图片的方法
在项目中经常会遇到图片加载失败需要显示默认图片的场景,那么如何在图片src资源加载失败显示出默认的图片呢? 方法一:onerror <img src="原来要加载的资源" o ...
- img加载中显示loading,加载失败显示默认图片(React)
实现效果 完整代码 import { useRef, useState } from 'react'; import './index.less'; import errorImg from '@/c ...
- webview中的img标签加载Android本地的图片
在网上查了很多教程,感觉很麻烦,各种方法,最后最忌实践很简单,主要是两步: WebSettings webSettings=webView.getSettings();//允许webview对文件的操 ...
- 图片加载失败显示默认图片
在页面加载的图片的时候,如果图片不存在或者路径不存在,页面加载图片就会如下图所示. 解决方法: 在img 标签中添加一下标签 onerror="onerror=null;src='img/a ...
- 前端页面图片加载失败显示默认图片
方法有多种: 1.首先说我用的,看代码 //页面图片加载失败时 默认显示统一处理 document.addEventListener("error", function (e) { ...
- img图片加载前显示load图片
只需要设置img的background即可 <img src="" alt="" class="detailImg" > cs ...
- php 载入css就可以显示,如何在进度条加载后显示页面
1.思路:加入很多图片,以延迟加载时间,实现加载完后显示图片.定义一个外层p,覆盖住图片,在内层p中引入加载时显示的图片,让内层p居中在页面上,利用setInterval定时器设置3秒后将外层p隐藏, ...
- Skia最新“编译”,绘制中文字符串,加载PNG、BMP图片等资料的整理。
"编译"Skia 国内不适合自己编译.Github 有不止一个自动构建的SKIA二进制build,涵盖多个操作系统,可直接取而用之. 推荐大名鼎鼎的JetBrains维护的仓库,地 ...
最新文章
- yii2快速導出phpexcel
- ospf多区域配置为什么ping不通_「实战」动态路由多区域 OSPF 基本配置,一分钟了解下...
- TFLearn MNIST
- mysql集群搭建_mysql高可用集群搭建
- UVa 11481 (计数) Arrange the Numbers
- linux环境部署ltmj,Linux系统安装与简单配置 图文.docx
- 【Java】网络编程
- ev10aq190a采集电路图_EV10AQ190A数模转换器
- iphone储存空间系统怎么清理_iPhone 储存空间里的“系统”项占用过多怎么办?...
- python numpy 索引_Python numpy中布尔索引的问题。
- 创建一个cocos2d-x工程添加一个自定义Scene并显示
- 装什么软件测试笔记本耐用,我买了新电脑,用什么软件测试比较好?
- 入侵检测:User-Agent
- 问题 H: LZY碎大石
- 刻意练习:Python基础 -- Task07. 文件与文件系统
- 工具及方法 - 使用DOS批处理给Windows文件批量改名
- python中的请求方法_Python爬虫HTPP请求方法有哪些
- python 根据坐标点计算方位角函数
- Jekyll 教程——博客功能(blog)
- (五)具名和匿名挂载
热门文章
- 分享:wkhtmltoimage开源工具的基本应用
- 如何利用WGET覆写已存在的档案
- 什么样的代码是好代码_什么是好代码?
- 数据开放 数据集_除开放式清洗之外:叙述是开放数据门户的未来吗?
- 黑苹果 wifi android,动动手指零负担让你的黑苹果连上Wifi
- 服务器安装mysql_阿里云服务器上安装MySQL
- react数据从本地读取_如何将从Google表格读取的React应用程序部署到Netlify
- 软件工程——个人课程总结
- Struts2学习---基本配置,action,动态方法调用,action接收参数
- Unity AssetBundles and Resources指引 (三) AssetBundle基础