CreateCompatibleDC 和 CreateCompatibleBitmap
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配合使用
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
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就不行了呢?请说明白点。在线等;
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);
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相关推荐
- 什么是DC,以及CreateCompatibleDC,CreateCompatibleBitmap,SelectObject的作用
1.DC是设备上下文的意思,那么什么是设备上下文呢? 举个例子:比如画家画画,那么他需要准备画笔,画纸等一些工具,而画笔又有许多属性,比如,粗细,颜色,那么我们在画画之前,需要确定我们画画所用的画笔的 ...
- CreateCompatibleDC,CreateCompatibleBitmap,SelectObject详解
物理HDC 设备底层会拥有显存等资源,但是兼容DC并没有给图像像素提供内存空间,因此兼容DC总是和BITMAP配合使用,这样一来,兼容DC就利用BITMAP的图像像素数据空间给自己提供类似于显存的内存 ...
- Windows API GDI(2) CreateCompatibleDC、CreateCompatibleBitmap、SelectObject和BitBlt函数
CreateCompatibleDC 说明: The CreateCompatibleDC function creates a memory device context(DC) compatibl ...
- CreateCompatibleDC与CreateCompatibleBitmap
CreateCompatibleDC 函数功能:该函数创建一个与指定设备兼容的内存设备上下文环境(DC). 函数原型:HDC CreateCompatibleDC(HDC hdc): 参数: hdc: ...
- CreateCompatibleDC 与 CreateCompatibleBitmap 小小结
通常使用CreateCompatibleBitmap时候都会用到CreateCompatibleDC.而是用CreateCompatibleDC的目的不是为CreateCompatibleBitmap ...
- CreateCompatibleBitmap,关于兼容DC的创建与资源回收
其实,我的C++入门就是从GDI开始的,想在CE上面写应用程序,若兼程序界面太难看那就必须用回GDI了.GDI是一种古老而又非常麻烦的技术,在C#年代还好点,但VC++下,玩GDI记得最最重要的一点是 ...
- 如何在SYSTEM权限下实现屏幕监控
屏幕监控是远控软件的基本功能之一. 版权声明 作者:iprowq 现在很多远控程序的服务端通常为DLL形式,通过远程线程注入等方法插入到services.svchost等SYSTEM权限的进程中去,而 ...
- 实现屏幕监控的大体思路
屏幕监控简单说就是对进程的当前桌面进行截屏存成位图,然后将此位图数据传输到远程. 对桌面进行截图需要通过一系列Windows GDI API来完成的. 首先通过CreateDC,CreateCompa ...
- 第14章 使用打印机
为了处理文字和图形而使用视讯显示器时,设备无关的概念看来非常完美,但对于打印机,设备无关的概念又怎样呢? 总的说来,效果也很好.在Windows程序中,用于视讯显示器的GDI函数一样可以在印表纸上打印 ...
最新文章
- Yen 的k_shortest paths 算法的C++实现
- 【每日一题】4月7日题目精讲 树
- Spring for Apache Hadoop 1.0 GA
- Commons-Collections4 集合工具类的使用(一):集合操作
- 数据通信与网络:CH22 Delivery, Fowarding and Routing
- 在ubuntu系统中安装sublime
- 经典书籍《打开量化投资的黑箱》阅读心得
- SpringBoot自定义starter
- 给皮肤贴个“创可贴”就能检测身体健康信号,如何?|技术前沿洞察
- 【火炉炼AI】机器学习031-KNN回归器模型的构建
- 设计-由OOiNN设计师精心设计的每一个姓氏的印章
- input输入框type参数
- 【Linux-操作系统】
- 如何写一份优秀的商业计划书
- 流星雨直播:都市安魂新曲
- 无线路由器使用方法,教你怎么设置无线路由
- 玩转console.log 如何在console.log里面插入图片
- 新浪微博第三方登录,显示重定向错误问题
- 【网络协议趣谈】HTTPS协议加密证书和工作模式
- gInk:一款好用的屏幕标注写画软件