位图操作和双缓冲机制

位图操作和双缓冲机制

位图操作
代码部分:
 CRect rect;
 GetClientRect(rect);
 pDC->SetMapMode(MM_ANISOTROPIC);
 pDC->SetWindowExt(rect.Width(), rect.Height());
 pDC->SetViewportExt(rect.Width(), -rect.Height());
 pDC->SetViewportOrg(rect.Width()/2, rect.Height()/2);

 CDC MemDC;
 CBitmap NewBitmap, *pOldBitmap;
 NewBitmap.LoadBitmap(IDB_ABOUT);
 BITMAP bmp;  NewBitmap.GetBitmap(&bmp);
 MemDC.CreateCompatibleDC(pDC);
 pOldBitmap = MemDC.SelectObject(&NewBitmap);

 MemDC.SetMapMode(MM_ANISOTROPIC);
 MemDC.SetWindowExt(bmp.bmWidth, bmp.bmHeight);

 MemDC.SetViewportExt(bmp.bmWidth, -bmp.bmHeight);
 MemDC.SetViewportOrg(bmp.bmWidth/2, bmp.bmHeight);
 pDC->BitBlt(-rect.Width()/2, -rect.Height()/2, rect.Width(), rect.Height(), &MemDC, -bmp.bmWidth/2, -bmp.bmHeight/2, SRCCOPY);  MemDC.SelectObject(pOldBitmap);

 

双缓冲机制
 CRect rect;
 GetClientRect(&rect);
 pDC->SetMapMode(MM_ANISOTROPIC);
 pDC->SetWindowExt(rect.Width(),rect.Height());
 pDC->SetViewportExt(rect.Width(),-rect.Height());
 pDC->SetViewportOrg(rect.Width()/2,rect.Height()/2);

 CDC memDC;//声明内存DC
 CBitmap NewBitmap,*pOldBitmap;
 memDC.CreateCompatibleDC(pDC);//创建一个与显示DC兼容的内存DC
 NewBitmap.CreateCompatibleBitmap(pDC,rect.Width(),rect.Height());//创建兼容内存位图
 pOldBitmap=memDC.SelectObject(&NewBitmap);//将兼容位图选入内存DC
 memDC.FillSolidRect(rect, RGB(0, 0, 0));//按原来背景色填充客户区,否则是黑色

 rect.OffsetRect(-rect.Width()/2,-rect.Height()/2);
 memDC.SetMapMode(MM_ANISOTROPIC);//内存DC自定义坐标系
 memDC.SetWindowExt(rect.Width(),rect.Height());
 memDC.SetViewportExt(rect.Width(),-rect.Height());
 memDC.SetViewportOrg(rect.Width()/2,rect.Height()/2);

 DrawObject(&memDC);
 pDC->BitBlt(rect.left,rect.top,rect.Width(),rect.Height(),&memDC,-rect.Width()/2,-rect.Height()/2,SRCCOPY); //将内存DC中的位图拷贝到设备DC
 memDC.SelectObject(pOldBitmap);

两段代码都用到CreateCompatibleDC(),可是它们是有区别的,相关部分看下面

CBitmap::GetBitmap int GetBitmap( BITMAP* pBitMap );
返回值:成功非零,失败零
参数:pBitMap 指向BITMAP结构体的指针,必须是非空
说明:调用这个成员函数来检索一个CBitmap对象的信息。信息通过BITMAP结构体返回

CDC::CreateCompatibleDC  virtual BOOL CreateCompatibleDC( CDC* pDC );
返回值:成功非零,失败零
参数: pDC 一个指向设备上下文的指针。如果是空,函数创建一个与显示设备上下文相兼容的内存设备上下文
说明: 创建一个和pDC指向的设备上下文相兼容的内存设备上下文。一个内存设备上下文是一个代表一个显示面内存块。它可以用来在内存中准备图片,当要拷贝它们到实际的相兼容的设备的上面。
当一个内存设备上下文被创建,GDI自动选择一个1×1单色像素位图。GDI输出函数可以和内存设备上下文一起使用当且仅当一个位图创建并选择到该上下文。
这个函数只能用来为可以支持光栅操作 的设备创建兼容设备上下文。查看CDC:BitBlt成员函数有关在设备上下文间表的传输信息。决定一个设备上下文是否支持光栅操作,要看成员函数::GetDeviceCaps的RC_BITBLT光栅能力。

 

CBitmap::CreateCompatibleBitmap BOOL CreateCompatibleBitmap( CDC* pDC, int nWidth, int nHeight );
返回值 成功非零,失败零
参数: pDC 指定设备上下文 nWidth 指定bitmap的像素宽 nHeight 指定bitmap的像素高
说明: 初始化一个与pDC指定的设备相兼容的位图。位图和指定的设备上下文有相同数量的颜色值或相同的格式(每个像素色彩位数相同)。它可以被任何内存设备(与pDC所指定的某个设备相兼容)选为当前位图。
如果pDC是内存设备上下文,位图返回该设备上下文中和当前所选位图具有相同的格式的bitmap。一个“内存设备上下文”是一块代表一个显示面的内存。它可以用来在内存中准备图片,在拷贝它们到实际的相兼容的设备的上面之前。
当一个内存设备上下文被创建了,GDI自动为它选择一个单色的备用bitmap。 由于一个颜色内存设备上下文可以选择彩色或单色位图,CreateCompatibleBitmap函数返回的位图格式并不总是相同的,然而, 一个与nonmemory设备上下文兼容的位图的格式总是在设备的格式中。
当你用CreateCompatibleBitmap函数完成CBitmap对象创建,首先将位图选出设备上下文,然后删除CBitmap对象。

CDC::CreateCompatibleDC和CBitmap::CreateCompatibleBitmap 区别 一个是设备上下文,一个是位图;这是最大的区别

CWnd::Invalidate void Invalidate( BOOL bErase = TRUE );
参数: bErase 指定更新区域内的背景是否被删除
说明: Wnd的整个客户区无效。当WM_PAINT消息出现,客户区被标记为绘画。该地区可以通过ValidateRect和ValidateRgn成员函数在 WM_PAINT消息发生之前验证。
bErase参数指定当更新区域被处理时更新区域内的背景是否被删除。如果bErase是真的,BeginPaint成员函数被调用时背景要删除;如果bErase是假的,背景保持不变。如果bErase适用于任何更新区域的一部分,整个地区(不仅在给定的部分)的背景都要删除。
只要CWnd更新区域并不是空而且没有其他消息的应用程序队列在该窗口,Windows发送WM_PAINT消息。

 

双缓冲原理是先在内存设备上下文将图形绘制好,然后将它拷到显示设备上下文,它的代码部分要看仔细。

posted @ 2015-11-23 22:48  N_zero  阅读(1025)  评论(0编辑  收藏  举报