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+库