博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

MFC双缓冲绘图与GDI+绘图方法

Posted on 2012-06-21 16:13  yuanzfy  阅读(3773)  评论(0编辑  收藏  举报

MFC双缓冲绘图:

CDC *cdc = this->GetDC();
 
CDC MemDC; //首先定义一个显示设备对象
CBitmap MemBitmap;//定义一个位图对象
 
CRect rect;
this->GetClientRect(rect);
 
MemDC.CreateCompatibleDC(NULL);//随后建立与屏幕显示兼容的内存显示设备
//下面建立一个与屏幕显示兼容的位图,至于位图的大小嘛,可以用窗口的大小
MemBitmap.CreateCompatibleBitmap(cdc, gdirect.Width(), gdirect.Height());
 
//将位图选入到内存显示设备中
//只有选入了位图的内存显示设备才有地方绘图,画到指定的位图上
CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap);
 
//先用背景色将位图清除干净,颜色自选
MemDC.FillSolidRect(0,0, gdirect.Width(), gdirect.Height(),RGB(255,255,255));
//这里加入自己的画图代码,此时画图都是在内存中完成,操作对象是MemDC
//然后将内存中的图拷贝到屏幕上进行显示
cdc->BitBlt(0,0, rect.Width()-20, rect.Height(),&MemDC,0, scrollpos*140,SRCCOPY);
//绘图完成后清理临时对象
MemBitmap.DeleteObject();
MemDC.DeleteDC();
ReleaseDC(cdc);

GDI+绘图方法

将双缓冲方法和GDI+绘图方法结合起来可以方便高效的把图片显示在控件中。

#include <GdiPlus.h>//首先要包含此头文件
Gdiplus::GdiplusStartupInput m_GdiplusStartupInput;
ULONG_PTR m_GdiplusToken;
Gdiplus::GdiplusStartup(&m_GdiplusToken,&m_GdiplusStartupInput,NULL);//调用此函数启用GDI+功能
 
Gdiplus::Graphics g(MemDC.m_hDC);//绘图
//使用gdi+加载其他类型的资源文件,jpg png都行
Gdiplus::Image *ii;
ii = Gdiplus::Image::FromFile("c:\\img.jpg");
g.DrawImage(ii, Gdiplus::Rect());
delete ii;
}
g.ReleaseHDC(MemDC.m_hDC);
 
Gdiplus::GdiplusShutdown(m_GdiplusToken);//使用完成调用此函数关闭GDI+库