CMemDC代码解
来源:互联网 发布:淮南大数据概念 编辑:程序博客网 时间:2024/06/05 01:08
CMemDC是一个很经典的内存DC,实现了MFC的双缓冲绘图。主题实现思路是,将要绘制的背景绘制到内存中,然后在CMemDC析构的时候绘制到屏幕上。
class CMemDC : public CDC {private:CBitmap m_bitmap; CBitmap* m_oldBitmap; CDC* m_pDC; CRect m_rect; BOOL m_bMemDC; public://内存DC构造函数,根据传入的pDC判断是否为打印机的DC。 //如果为打印机的DC(m_bMemDC为True),则创建内存m_bitmap内存DC。假如参数bCopyFirst为真,则直接画图。这时就不是双缓冲。假如 //参数bCopyFirst为假,则等到CMemDC析构后才绘图,实现双缓冲。 //如果为打印机DC(m_bMemDC为False),则说明传入DC非内存DC,简单复制即可,不需要双缓冲。CMemDC(CDC* pDC, CRect rect = CRect(0,0,0,0), BOOL bCopyFirst = FALSE) : CDC(), m_oldBitmap(NULL), m_pDC(pDC){ASSERT(m_pDC != NULL); // If you asserted here, you passed in a NULL CDC.m_bMemDC = !pDC->IsPrinting();if (m_bMemDC){// Create a Memory DCCreateCompatibleDC(pDC);if ( rect == CRect(0,0,0,0) )pDC->GetClipBox(&m_rect);elsem_rect = rect;m_bitmap.CreateCompatibleBitmap(pDC, m_rect.Width(), m_rect.Height());m_oldBitmap = SelectObject(&m_bitmap);SetWindowOrg(m_rect.left, m_rect.top);if(bCopyFirst){this->BitBlt(m_rect.left, m_rect.top, m_rect.Width(), m_rect.Height(),m_pDC, m_rect.left, m_rect.top, SRCCOPY);}} else {// Make a copy of the relevent parts of the current DC for printingm_bPrinting = pDC->m_bPrinting;m_hDC = pDC->m_hDC;m_hAttribDC = pDC->m_hAttribDC;}}//析构函数,假如双缓冲模式,则绘制图。~CMemDC(){if (m_bMemDC) {// Copy the offscreen bitmap onto the screen.m_pDC->BitBlt(m_rect.left, m_rect.top, m_rect.Width(), m_rect.Height(),this, m_rect.left, m_rect.top, SRCCOPY);//Swap back the original bitmap.SelectObject(m_oldBitmap);} else {// All we need to do is replace the DC with an illegal value,// this keeps us from accidently deleting the handles associated with// the CDC that was passed to the constructor.m_hDC = m_hAttribDC = NULL;}}// Allow usage as a pointerCMemDC* operator->() {return this;}// Allow usage as a pointeroperator CMemDC*() {return this;}};
- CMemDC代码解
- CMemDC代码解
- CMemDC
- CMemDC
- CMemDC 源码
- CMemDC类只赏不析
- [转]关于CMemDC
- CMemDC类的使用
- CMemDC双缓冲绘图
- CMemDC的用法
- error LNK2005: "public: virtual __thiscall CMemDC::~CMemDC(void)"
- error LNK2005: "public: virtual __thiscall CMemDC::~CMemDC(void)" (??1CMemDC@@UAE@XZ) already de
- CMemDC:在MFC下解决绘图闪烁
- 利用CMemDC画图的两种方法
- CMemDC:在MFC下解决绘图闪烁
- 利用CMemDC画图的两种方法
- MFC-双缓冲绘图-CMemDC的封装
- 解决MFC闪烁的CMemDC类
- What Powers Instagram: Hundreds of Instances, Dozens of Technologies
- MediaPlayer和AudioTrack播放Audio的区别与联系
- 系统增加对hiveserver的负载均衡及单个server挂掉的保障
- 制作静态库 第三方SDK
- container_of(ptr, type, member)及链表操作
- CMemDC代码解
- 版本发布脚本
- 基于ffmpeg的wince版本网络收音机开发
- 飞猪投稿伤感日志-我哭了谁知道?
- Android入门教程(三)之------导入现有Android工程
- 秋夜长,怎奈碎念悠怅
- 简单判断闰年函数
- Android入门教程(四)之------Android工程目录结构介绍
- Spring 3.1.X 源码编译