双缓存显示问题以及图片

void OnDraw(CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid)
{
	if (!pdc)
		return;

	CClientDC dc(this);

	CRect rect;
	GetClientRect(rect); 

	CDC MemDC;
	MemDC.CreateCompatibleDC(&dc); 

	CBitmap MemBitmap; 

	if(GetFileAttributes(m_strFileName) == INVALID_FILE_ATTRIBUTES)//显示文字
	{
		MemBitmap.CreateCompatibleBitmap(pdc,rect.right,rect.bottom); 

		CBitmap* pOldBitmap = (CBitmap*)MemDC.SelectObject(&MemBitmap);

		MemDC.FillSolidRect(&rect,RGB(0xFA, 0xFA, 0xFA));
		static CBrush brFrame(RGB(202, 202, 202));
		MemDC.FrameRect(rcBounds, &brFrame);

		MemDC.SetTextColor(RGB(128, 128, 128));

		MemDC.SetBkMode(TRANSPARENT);

		CString sTextOut(_T("未扫描到图片"));

		CRect rcTextOut(rect);
		const int iTextHeight = MemDC.DrawText(sTextOut, CRect(rcTextOut), DT_CALCRECT | DT_CENTER | DT_WORDBREAK | DT_EDITCONTROL);

		rcTextOut.DeflateRect(0, (rcTextOut.Height() - iTextHeight) / 2);

		MemDC.DrawText(sTextOut, rcTextOut, DT_CENTER | DT_SINGLELINE|DT_WORDBREAK | DT_EDITCONTROL);

		pdc->BitBlt(0, 0, rect.Width(), rect.Height(), &MemDC, 0, 0, SRCCOPY);

		MemDC.SelectObject(pOldBitmap);

		MemDC.DeleteDC();

		DeleteObject(MemBitmap); 

		return;
	}
	//显示图片

	/*HBITMAP hbmp;//LoadImage加载png图片

	hbmp = (HBITMAP)::LoadImage(AfxGetInstanceHandle(),
		m_strFileName, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION|LR_LOADFROMFILE);
	if( hbmp == NULL )
	{
		return;
	}*/

	CImage imgTemp;
	imgTemp.Load(m_strFileName);
	if ( MemBitmap.m_hObject ) MemBitmap.Detach();
	MemBitmap.Attach(imgTemp.Detach());

	//MemBitmap.Attach( hbmp );

	DIBSECTION ds;
	BITMAPINFOHEADER &bminfo = ds.dsBmih;
	MemBitmap.GetObject( sizeof(ds), &ds );

	MemDC.SelectObject(&MemBitmap);    //连接位图

	pdc->SetStretchBltMode(HALFTONE);
	pdc->StretchBlt(0,0,rect.Width(),rect.Height(),&MemDC,0,0,bminfo.biWidth,bminfo.biHeight,SRCCOPY);

	MemDC.DeleteDC();

	DeleteObject(imgTemp);
}

双缓存显示问题以及图片

时间: 2024-08-18 10:16:13

双缓存显示问题以及图片的相关文章

android listview 异步加载图片并防止错位+双缓存

网上找了一张图, listview 异步加载图片之所以错位的根本原因是重用了 convertView 且有异步操作. 如果不重用 convertView 不会出现错位现象, 重用 convertView 但没有异步操作也不会有问题. 我简单分析一下: 当重用 convertView 时,最初一屏显示 7 条记录, getView 被调用 7 次,创建了 7 个 convertView. 当 Item1 划出屏幕, Item8 进入屏幕时,这时没有为 Item8 创建新的 view 实例, Ite

Android性能优化之实现双缓存的图片异步加载工具(LruCache+SoftReference) - 拿来即用

之前在郭大神的博客看到使用LruCache算法实现图片缓存的.这里仿效他的思路,自己也写了一个. 并加入ConcurrentHashMap<String, SoftReference<Bitmap>>去实现二级缓存,因为ConcurrentHashMap是多个锁的线程安全,支持高并发.很适合这种频繁访问读取内存的操作. 下面整个思路是,使用了系统提供的LruCache类做一级缓存, 大小为运行内存的1/8,当LruCache容量要满的时候,会自动将系统移除的图片放到二级缓存中,但为

Android图片管理组件(双缓存+异步加载)

转自:http://www.oschina.net/code/snippet_219356_18887?p=3#comments ImageManager2这个类具有异步从网络下载图片,从sd读取本地图片,内存缓存,硬盘缓存,图片使用动画渐现等功能,已经将其应用在包含大量图片的应用中一年多,没有出现oom Android程序常常会内存溢出,网上也有很多解决方案,如软引用,手动调用recycle等等.但经过我们实践发现这些方案,都没能起到很好的效果,我们的应用依然会出现很多oom,尤其我们的应用包

android 网络加载图片,对图片资源进行优化,并且实现内存双缓存 + 磁盘缓存

经常会用到 网络文件 比如查看大图片数据 资源优化的问题,当然用开源的项目  Android-Universal-Image-Loader  或者 ignition 都是个很好的选择. 在这里把原来 写过的优化的代码直接拿出来,经过测试千张图片效果还是不错的. 免费培训课:http://www.jinhusns.com/Products/Curriculum/?type=xcj 工程目录 至于 Activity 就是加载了 1个网格布局 01./** 02.*   实现 异步加载 和   2级缓

Android中用双缓存技术,加载网络图片

最近在学校参加一个比赛,写的一个Android应用,里面要加载大量的网络图片,可是用传统的方法图片一多就会造成程序出现内存溢出而崩溃.因为自己也在学习中,所以看了很多博客和视频,然后参照这些大神的写源码,自己写了一个加载网络图片工具类. 里面要用到一个经典的图片缓存库DiskLruCache 下载地址为:  DiskLruCache下载 下面是使用这个类实现的 双缓存网络图片加载 [java] view plain copy public class DiskLruCacheUtils { pr

Android 框架修炼-自己封装双缓存管理框架库

一.概述 Android开发中,网络请求是很重要的一部分,而缓存网络请求来的图片或者响应结果字符串或者结果流,既可以省流量,同时也可以帮助我们 解决无网或弱网情况下加载情况,当然也可以提升程序性能效率.纵所周知,缓存管理中肯定需要用到内存缓存,这里我们采用LruCache来管理内存的缓存. LruCahce虽然速度快,但是只是内存级别的缓存,为了实现持久化的缓存,我们还需要文件级别的缓存,也就是说我们要把缓存保存到文件,而文件则是保存 到手机存储或者SD卡存储中,即实现Disk级别的缓存,这里我

关于双缓存

为了防止屏幕闪烁现象,利用双缓存解决.原理主要是将图片画在虚拟屏幕上,再将画直接从虚拟屏幕上直接画在实际屏幕上.repaint()方法实际上是先调用update()方法然后再调用paint()方法,实现双缓存就利用了这一点,代码如下 Image offScreenImage=null; public void update(Graphics g)       {         if(offScreenImage==null)             offScreenImage=this.cr

AWT的双缓存技术

学了AWT,学到双缓存技术,于是照着书将双缓存技术的代码给实现了. 另外插一句,swing组件的JComponent组件默认缓存区,不必自己写代码.如果想关闭双缓冲区,可以在组件上施加setDoubleBuffered(false) import java.awt.*; import java.awt.event.*; /* * 双缓存技术 * 可以将绘制的内容保留在一个Image对象中,如果需要重新显示绘制的内容,仅仅简单地将这个Image内容再现就可以了. * (1)img起到缓存的作用,o

android 网络图片双缓存

本文转自:http://blog.csdn.net/a79412906/article/details/10180583 Android每次加载图片很浪费时间.所以设计了一个图片缓存技术来解决每次android手机加载图片的问题 内存的读取速度是最快的,然后是文件的读取速度,最后是网络资源的读取 既然内存的读取时间最快,我们好好利用内存资源.将内存再分两层缓存 强引用缓存不会轻易被回收,来保存常用数据,不常用的资源放入软引用缓存中. 对于硬引用和软引用的介绍: ⑴强引用(StrongRefere