1.     HBITMAP m_hBitmap = CreateCompatibleBitmap(m_hScrDC, pt.x, pt.y);
   2. HBITMAP m_hOldBitmap = (HBITMAP)SelectObject(m_hMemDC, m_hBitmap);
   3.    BitBlt(m_hMemDC, 0, 0, pt.x, pt.y, m_hScrDC, 0, 0, SRCCOPY);第一行中,m_hBitmap已经获得设备m_hScrDC上绘制的位图了吗?第二行中,m_holdBitmap得到什么内容或者说这一段代码里什么时候m_hBitmap获得m_hScrDC的内容?对这一类型的代码特别容易晕,求高手指教,并希望告知从哪里能把原理搞懂,不胜感谢

解决方案 »

  1.   

    前段时间刚有人问过:http://topic.csdn.net/u/20110110/22/671136ec-ba2b-4763-ba3d-be52968bf700.html
      

  2.   

    我和楼上提到的那位楼主一样,很好奇为什么::SelectObject(hDCMem, hOldMap);  
    注释掉后不能够显示图片,那个问题的帖子还是不能解决我的疑问
      

  3.   

    如果没有::SelectObject(hDCMem, hOldMap);  那么m_hMemDC是什么?
    m_hMemDC这个设备描述表 此时应该并没有 填上任何信息 又Blt到哪里呢?
      

  4.   

    对楼上的解释还是不太明白,不过还是很感谢,能够再解释得详细一点吗?
    我知道的是像屏幕DC,是用GetDC()获得屏幕的设备上下文的,像m_hMemDC这种内存设备,不是有m_hMemDC.CreateCompatibleDC(m_hSrcDC),就相当于生成了一个内存设备了吗?
    我对这方面很混乱,希望能够比较系统地了解一下
    另外::SelectObject(hDCMem, hOldMap); 是二楼提供的链接中的帖子中的,m_hMemDC是我的帖子里的,他们没关系,但是我对那个帖子的问题也不太了解。
      

  5.   

    嗯 我复制的应该是你的第二句SelectObject(m_hMemDC, m_hBitmap); 变量名字写错 意思是一样的
    我的意思是说 如果没有::SelectObject(m_hMemDC, m_hBitmap); 那么m_hMemDC并没有 选中东西 
    你 m_hMemDC->SelectObject  不就可以理解为 用 m_hMemDC 去选择 m_hBitmap 。
    m_hMemDC 这个句柄可以理解成一只手 ,Select 了一个位图的句柄m_hBitmap , 你这只手获得了这个句柄所指位图的信息描述 现在 BitBlt 的目的参数 不就是要填写一个DC 类型的吗?你把这只 已经选择了位图的dc 传给 BitBlt 的第一个参数 ,BitBlt 负责把m_hScrDC选中的位图 复制到了 你hDCMem选中的东西上你hDCMem选中的东西又是什么呢?是选中了m_hBitmap这个句柄 ,而这个句柄不就是你第一句 CreateCompatibleBitmap(m_hScrDC, pt.x, pt.y);开辟的位图空间 返回的句柄 ,结果就是将m_hScrDC 句柄指代的位图 复制到了这个新的空间里。所以如果你没有第二句,m_hMemDC并没有选中什么至于 CreateCompatibleBitmap 第一个参数你填的m_hScrDC 又有什么用,MSDN 告诉你 ,他是用来让CreateCompatibleBitmap 函数产生 一个与m_hScrDC所指位图相兼容的 位图,并返回它的句柄
    在你的第一句里 这个句柄就是 m_hBitmap
      

  6.   


    不好意 ,这两个名字好像 囧 ....
    你把我引用的这段文字的 hDCMem 替换成 m_hMemDC 就行了
      

  7.   

    1.根据m_hSrcDC设备创建关联得HBITMAP,但是并不关联到任何DC设备
    2.SelectObject选入目标DC设备当中,同时用oldbitmap保存DC设备当中被替换出来得HBITMAP,以供使用结束后,释放m_hbitmap资源.
    3.m_hMemDC是创建得内存DC,实现二次缓冲,防止闪屏。
      

  8.   

    谢谢各位的帮助,那么我是不是可以这样理解呢:对于设备上下文DC,如果要将屏幕DC(m_hSrcDC)上选中的位图拷贝到内存DC(m_hMemDC)上,那么m_hMemDC必须要先选中一副空白的位图,然后通过BitBlt将m_hSrcDC选中的位图拷贝到内存位图上这个时侯m_hMemDC事先选中的空白位图就已经获得了屏幕DC所选中的位图的内容是吗?其实这是相当于截图吗?我要做一下小程序试验一下。特别感谢一下5楼,你真的很有耐心,太感谢了
      

  9.   

    首先 m_hSrcDC 的 Src 代表的应该是 source (源)的缩写 不是屏幕的意思
    在编程的一些习惯命名里面 Src 是很常见的缩写,它对应的很常见的缩写是 Dest(destination)BitBlt 简单地说就是 把源图像 拷贝到 目的图像(可能是某一区域)上 没说要目的图像是空啊!!
    请你看msdn
    强烈建议你写写实验一下
      

  10.   

    不,SelectObject的意义在于让MemDC中的位图格式正确,创建的内存DC默认有一个单色的1x1的位图,SelectObject就是用那个彩色位图去替换必须让源DC和目标DC的位图格式和所需尺寸一致BitBlt拷贝才能正确。m_hOldBitmap得到的就是原来那个1x1的单色位图,不过一般来说它留着没什么用,不写它也没关系,直接SelectObject就可以了。
      

  11.   

    好像
    3) BitBlt(m_hMemDC, 0, 0, pt.x, pt.y, m_hScrDC, 0, 0, SRCCOPY);是把源DC复制了?直接取原DC中的内容到新建的内存DC中去了
    这不是防闪绘制吧,是截屏用的。
      

  12.   

    楼主你看下面这一段好理解吗?
            static HPEN blackPen = CreatePen(PS_SOLID,1,RGB(0,0,0));
    pDC->SelectObject(blackPen);
    pDC->Rectangle(&rec);类似地理解一下试试,觉得可以理解
      

  13.   

    嗯,谢谢大家的帮助!最近看了孙鑫的视频,觉得长知识了不少!
     HBITMAP m_hBitmap = CreateCompatibleBitmap(m_hScrDC, pt.x, pt.y);
    这一句中 m_hBitmap只有位图信息头的内容,还没有颜色表和位图数据等东西,所以需要后面两句将这些东西粘上去