HDC CreateCompatibleDC( HDC hdc );

hdc是一个已存在的DC.如果为NULL,将创建一个与当前程序显示器兼容的内存DC

HBITMAP CreateCompatibleBitmap(HDC hdc,int nWidth,int nHeight);

nWidth,nHeight为该bitmap的宽和高
 hdc必须为一个已存在的DC,不能为NULL,而且不能为没有HBITMAP的HDC

在OnLButtonDown函数中,填入如下代码: 
CDC *pDC=GetDC(); 
CDC de; 
CRect rect; 
GetClientRect(&rect); 
de.CreateCompatibleDC(pDC); 
CBitmap *pBmp; 
pBmp=new CBitmap; 
pBmp->CreateCompatibleBitmap(pDC,rect.Width(),rect.Height()); 
de.SelectObject(pBmp); 
pDC->BitBlt(0,0,rect.Width(),rect.Height(),&de,0,0,SRCCOPY);

运行,点鼠标左键,为什么会出现黑屏?是不是因为CreateCompatibleBitmap有什么问题?请问具体原理是什么~~

你使用CreateCompatibleBitmap创建了一个兼容位图并选入de,但因为并没有在de中进行任何绘图操作,所以此时对应的位图没有数据(就是都是0),而RGB(0,0,0)就是黑色,所以将de显示到pDC(对应程序的客户区)时就是黑色的。

你可以加一些绘图代码再试试。 
比如加上填充背景: 
在 
pDC->BitBlt(0,0,rect.Width(),rect.Height(),&de,0,0,SRCCOPY); 
前面添加一行 
de.FillSolidRect(rect, RGB(255,255,0));//填充背景(颜色为黄色)

然后点击完左键就是黄色的了。

CreateCompatibleBitmap

  函数功能:该函数创建与指定的设备环境相关的设备兼容的位图。
  函数原型:HBITMAP CreateCompatibleBitmap(HDC hdc,int nWidth,int nHeight);
  参数:
  hdc: 设备环境句柄。
  nWidth:指定位图的宽度,单位为像素。
  nHeight:指定位图的高度,单位为像素。
  返回值:如果函数执行成功,那么返回值是位图的句柄;如果函数执行失败,那么返回值为NULL。若想获取更多错误信息,请调用GetLastError。
  备注:由CreateCompatibleBitmap函数创建的位图的颜色格式与由参数hdc标识的设备的颜色格式匹配。该位图可以选入任意一个与原设备兼容的内存设备环境中。由于内存设备环境允许彩色和单色两种位图。因此当指定的设备环境是内存设备环境时,由CreateCompatibleBitmap函数返回的位图格式不一定相同。然而为非内存设备环境创建的兼容位图通常拥有相同的颜色格式,并且使用与指定的设备环境一样的色彩调色板。
  速查:Windows NT:3.1及以上版本;Windows:95及以上版本;Windows CE:1.0及以上版本;头文件:wingdi.h;库文件:gdi32.lib。 
  PS:需要与CreateCompatibleDC配合使用
为什么有时候CDC的对象建立时用CreateDC,而有时候用CreateCompatibleDC?两者有什么不同?
HDC   CreateDC(   
      LPCTSTR   lpszDriver,     //   pointer   to   string   specifying   driver   name   
      LPCTSTR   lpszDevice,     //   pointer   to   string   specifying   device   name   
      LPCTSTR   lpszOutput,     //   do   not   use;   set   to   NULL   
      CONST   DEVMODE   *lpInitData    //   pointer   to   optional   printer   data   
  );   
  HDC   CreateCompatibleDC(   
      HDC   hdc       //   handle   to   the   device   context   
  );   
    
  CreateDC是从一个设备创建DC,而CreateCompatibleDC是从一个已有的DC创建一个与原有的DC兼容的内存DC  
我在ondraw()里面这么做的

CDC scrdc,memdc; 
scrdc.CreateDC("DISPLAY",NULL,NULL,NULL); 
memdc.CreateCompatibleDC(&scrdc); 
memdc.BitBlt(20,20,300,300,&scrdc,0,0,SRCCOPY); 
pDC->BitBlt(20,20,300,300,&memdc,0,0,SRCCOPY); 
不能显示截取的区域。

但是如果这样: 
CDC scrdc,memdc; 
scrdc.CreateDC("DISPLAY",NULL,NULL,NULL); 
memdc.CreateCompatibleDC(&scrdc); 
memdc.BitBlt(20,20,300,300,&scrdc,0,0,SRCCOPY); 
pDC->BitBlt(20,20,300,300,&scrdc,0,0,SRCCOPY); 
可以显示。 
为什么通过一个兼容的dc就不行了呢?请说明白点。在线等;

兼容DC就象一部照相机,你底片都没装,拍不出照片的。兼容DC的底片就是兼容位图。 
1)CDC scrdc,memdc; 
2)scrdc.CreateDC("DISPLAY",NULL,NULL,NULL); 
3)memdc.CreateCompatibleDC(&scrdc); 
4)CBitmap memBMP;//做底片 
memBMP.CreateCompatibleBitmap(&scrdc, 300, 300); 
5)memDC.SelectObject(&memBMP);//装底片 
//少了4),5)两步 
6)memDC.BitBlt(0, 0, 300, 300, &scrdc, 0, 0, SRCCOPY); 
7)pDC->BitBlt(20,20,300,300,&memDC,0,0,SRCCOPY); 
CPaintDC dc(this);

CDC scrdc,memdc; 
CBitmap buf;

scrdc.CreateDC(L"DISPLAY",NULL,NULL,NULL); 
memdc.CreateCompatibleDC(&scrdc); 
buf.CreateCompatibleBitmap(&scrdc,300,300); 
memdc.SelectObject(buf); 
memdc.BitBlt(20,20,300,300,&scrdc,0,0,SRCCOPY); 
dc.BitBlt(20,20,300,300,&memdc,0,0,SRCCOPY);

光有CreateCompatibleDC是不够的,要有CreateCompatibleBitmap 
然后 SelectObject

CreateCompatibleDC 和 CreateCompatibleBitmap相关推荐

  1. 什么是DC,以及CreateCompatibleDC,CreateCompatibleBitmap,SelectObject的作用

    1.DC是设备上下文的意思,那么什么是设备上下文呢? 举个例子:比如画家画画,那么他需要准备画笔,画纸等一些工具,而画笔又有许多属性,比如,粗细,颜色,那么我们在画画之前,需要确定我们画画所用的画笔的 ...

  2. CreateCompatibleDC,CreateCompatibleBitmap,SelectObject详解

    物理HDC 设备底层会拥有显存等资源,但是兼容DC并没有给图像像素提供内存空间,因此兼容DC总是和BITMAP配合使用,这样一来,兼容DC就利用BITMAP的图像像素数据空间给自己提供类似于显存的内存 ...

  3. Windows API GDI(2) CreateCompatibleDC、CreateCompatibleBitmap、SelectObject和BitBlt函数

    CreateCompatibleDC 说明: The CreateCompatibleDC function creates a memory device context(DC) compatibl ...

  4. CreateCompatibleDC与CreateCompatibleBitmap

    CreateCompatibleDC 函数功能:该函数创建一个与指定设备兼容的内存设备上下文环境(DC). 函数原型:HDC CreateCompatibleDC(HDC hdc): 参数: hdc: ...

  5. CreateCompatibleDC 与 CreateCompatibleBitmap 小小结

    通常使用CreateCompatibleBitmap时候都会用到CreateCompatibleDC.而是用CreateCompatibleDC的目的不是为CreateCompatibleBitmap ...

  6. CreateCompatibleBitmap,关于兼容DC的创建与资源回收

    其实,我的C++入门就是从GDI开始的,想在CE上面写应用程序,若兼程序界面太难看那就必须用回GDI了.GDI是一种古老而又非常麻烦的技术,在C#年代还好点,但VC++下,玩GDI记得最最重要的一点是 ...

  7. 如何在SYSTEM权限下实现屏幕监控

    屏幕监控是远控软件的基本功能之一. 版权声明 作者:iprowq 现在很多远控程序的服务端通常为DLL形式,通过远程线程注入等方法插入到services.svchost等SYSTEM权限的进程中去,而 ...

  8. 实现屏幕监控的大体思路

    屏幕监控简单说就是对进程的当前桌面进行截屏存成位图,然后将此位图数据传输到远程. 对桌面进行截图需要通过一系列Windows GDI API来完成的. 首先通过CreateDC,CreateCompa ...

  9. 第14章 使用打印机

    为了处理文字和图形而使用视讯显示器时,设备无关的概念看来非常完美,但对于打印机,设备无关的概念又怎样呢? 总的说来,效果也很好.在Windows程序中,用于视讯显示器的GDI函数一样可以在印表纸上打印 ...

最新文章

  1. Yen 的k_shortest paths 算法的C++实现
  2. 【每日一题】4月7日题目精讲 树
  3. Spring for Apache Hadoop 1.0 GA
  4. Commons-Collections4 集合工具类的使用(一):集合操作
  5. 数据通信与网络:CH22 Delivery, Fowarding and Routing
  6. 在ubuntu系统中安装sublime
  7. 经典书籍《打开量化投资的黑箱》阅读心得
  8. SpringBoot自定义starter
  9. 给皮肤贴个“创可贴”就能检测身体健康信号,如何?|技术前沿洞察
  10. 【火炉炼AI】机器学习031-KNN回归器模型的构建
  11. 设计-由OOiNN设计师精心设计的每一个姓氏的印章
  12. input输入框type参数
  13. 【Linux-操作系统】
  14. 如何写一份优秀的商业计划书
  15. 流星雨直播:都市安魂新曲
  16. 无线路由器使用方法,教你怎么设置无线路由
  17. 玩转console.log 如何在console.log里面插入图片
  18. 新浪微博第三方登录,显示重定向错误问题
  19. 【网络协议趣谈】HTTPS协议加密证书和工作模式
  20. gInk:一款好用的屏幕标注写画软件

热门文章

  1. Framework学习之旅:Zygote进程
  2. iPhone X测试烧屏软件,iPhone X烧屏测试,亮屏3天后才会发生
  3. 不用看了,赶紧跟着敲一遍!
  4. Ping IP时出现 request time out怎么解决?
  5. 2021-6-28 项目实训-研究生管理系统
  6. 深谈德国车和日本车的区别--觉得分析的还算冷静客观
  7. 哈希表实现电话号码查询系统(c++)
  8. 人工智能导论:清览作业
  9. Neural Collaborative Filtering 1
  10. linux系统下查看服务器品牌型号序列号