createcompatibledc报错_Compatible

createcompatibledc报错_CompatibleCreateCompatibleDC函数功能:该函数创建一个与指定设备兼容的内存设备上下文环境(DC)。函数原型:HDCCreateCompatibleDC(HDChdc);参数:hdc:现有设备上下文环境的句柄,如果该句柄为NULL,该函数创建一个与应用程序的当前显示器兼容的内存设备上下文环境。返回值:如果成功,则返回内存设备上下文环境的句柄;如果失败,则返回值为NULL

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

CreateCompatibleDC

函数功能:该函数创建一个与指定设备兼容的内存设备上下文环境(DC)。

函数原型:HDC CreateCompatibleDC(HDC hdc);

参数:

hdc:现有设备上下文环境的句柄,如果该句柄为NULL,该函数创建一个与应用程序的当前显示器兼容的内存设备上下文环境。

返回值:如果成功,则返回内存设备上下文环境的句柄;如果失败,则返回值为NULL。

CreateCompatibleDc函数只适用于支持光栅操作的设备,应用程序可以通过调用GetDeviceCaps函数来确定一个设备是否支持这些操作。

当不再需要内存设备上下文环境时,可调用DeleteDc函数删除它。


注意:要在内存DC上画东西并显示出来,必须要先用内存DC先选择一个
有效位图
memDCLine.SelectObject(&bmpLine);
有效位图指的是这个位图的大小不为0,因为内存DC上选择位图的时候,会根据位图大小更新画布的大小,然后在内存DC上的画布上绘制。

如果位图的大小为0,则内存DC的画布大小也为0,则在内存DC上绘制的内容不会显示出来。

内存DC通常的用途:显示图片和绘图缓冲

<span style="white-space:pre">	</span>CDC cDC;	HDC hdc = ::GetDC(NULL);//获取屏幕DC	cDC.Attach(hdc);<span style="white-space:pre">	</span>//创建兼容屏幕DC的内存DC	CDC memDCLine;	memDCLine.CreateCompatibleDC(&cDC);	//加载位图	CBitmap bmpLine;	bmpLine.LoadBitmapW(IDB_BMP_TEST);//经过这一步,位图的大小就不为0了	memDCLine.SelectObject(&bmpLine);//经过这一步,内存DC的画布大小更新为位图大小	BITMAP bpLine;	bmpLine.GetBitmap(&bpLine);<span style="white-space:pre">	</span>//绘图操作	memDCLine.MoveTo(0, 0);	memDCLine.LineTo(bpLine.bmWidth , bpLine.bmHeight);	//将内存DC内容绘制到屏幕DC上	cDC.BitBlt(0, 0, bpLine.bmWidth , bpLine.bmHeight, &memDCLine,0,0,SRCCOPY);	

Jetbrains全家桶1年46,售后保障稳定


CreateCompatibleBitmap

函数功能:该函数创建与指定的设备环境相关的设备兼容的位图。

  函数原型:HBITMAP CreateCompatibleBitmap(HDC hdc,int nWidth,int nHeight);

  参数:

  hdc: 设备环境句柄。

  nWidth:指定位图的宽度,单位为像素。

  nHeight:指定位图的高度,单位为像素。

  返回值:如果函数执行成功,那么返回值是位图的句柄;如果函数执行失败,那么返回值为NULL。若想获取更多错误信息,请调用GetLastError。

  备注:由CreateCompatibleBitmap函数创建的位图的颜色格式与由参数hdc标识的设备的颜色格式匹配。该位图可以选入任意一个与原设备兼容的内存设备环境中。由于内存设备环境允许彩色和单色两种位图。因此当指定的设备环境是内存设备环境时,由CreateCompatibleBitmap函数返回的位图格式不一定相同。然而为非内存设备环境创建的兼容位图通常拥有相同的颜色格式,并且使用与指定的设备环境一样的色彩调色板。

CreateCompatibleBitmap通常的用途:双缓冲

双缓冲代码解释:

<span style="white-space:pre">	</span>CDC cDC;
	HDC hdc = ::GetDC(NULL);
	cDC.Attach(hdc);<pre name="code" class="cpp"><span style="white-space:pre">	</span>//创建内存DC1,兼容屏幕

CDC memDC;

memDC.CreateCompatibleDC(&cDC);CDC memDC2;

<span style="white-space:pre">	</span>//创建内存DC2,兼容屏幕

memDC2.CreateCompatibleDC(&cDC);

<span style="white-space:pre">	</span>//创建内存DC3,兼容屏幕,第二次缓冲用

CDC memBufDC;memBufDC.CreateCompatibleDC(&cDC);
//为内存DC1和2加载位图,用于绘制内容CBitmap bmp;bmp.LoadBitmapW(IDB_BMP_TEST);CBitmap bmp2;bmp2.LoadBitmapW(IDB_BMP_TEST2);
//为内存DC3加载位图,用于缓冲绘制,内存DC1和
内存DC2绘制的是实际的图片,而内存DC3的作用是将内存DC1和内存DC2的内容绘制在内存DC3上防止屏幕闪烁


//所以内存DC3不用加载实际的位图,但是它必须加载位图,否则它的画布不会被更新,所以用到了
CreateCompatibleBitmap创建一个兼容屏幕DC的位图

CBitmap bmp3;bmp3.CreateCompatibleBitmap(&cDC, 1024, 768);BITMAP bp;bmp.GetBitmap(&bp);memDC.SelectObject(&bmp);memBufDC.SelectObject(&bmp3);
//内存DC1的内容绘制到内存DC3上memBufDC.BitBlt(0, 0,bp.bmWidth, bp.bmHeight,&memDC,0,0,SRCCOPY);

<span>	</span>//内存DC2的内容绘制到内存DC3上<span style="font-family: Arial, Helvetica, sans-serif;">	</span>

memDC2.SelectObject(&bmp2);memBufDC.BitBlt(0, 0,bp.bmWidth, bp.bmHeight,&memDC2,100,100,SRCCOPY);//直接将内存DC3绘制到屏幕上,一次性绘制,防止屏幕闪烁cDC.BitBlt(0, 0,bp.bmWidth, bp.bmHeight,&memBufDC,0,0,SRCCOPY);
//清理cDC.Detach();memDC.DeleteDC();memDC2.DeleteDC();ReleaseDC(&cDC);


上面为什么要用CreateCompatibleBitmap?

使用CreateCompatibleBitmap是为了更新位图的大小,从而使内存DC3初始化一张画布出来。使用HBITMAP直接载入(SelectObject )内存DC时,

内存DC会生成一块和图片大小相同尺寸的画布,超过那块矩形之外的地方是没有内容的。

而对于没有经过LoadBitmap的HBITMAP直接载入内存DC,虽然使用BITBLT把其他HDC中的内容放入其中不会报错,但是由于HBITMAP没有载入过图片,
HBITMAP的图片大小为0,导致内存DC的画布区域【也就是实际有效的矩形区域】的宽和高都为0,即使经过了BITBLT这个过程,也无法显示什么。

所以需要使用CreateCompatibleBitmap来先模拟初始化一个位图用于更新内存DC3的画布。

补充:内存DC默认的位图是1×1单色位图,必须选入位图(也可以是其它格式)才能绘制、显示对应格式的颜色;

CreateCompatibleBitmap创建的位图是空的,一般初始化为黑色(和操作系统有关),关键是复制了参数中dc的位图格式(上面用到了位图大小)。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/209529.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • RPM Spec File Reference

    RPM Spec File Reference

    2021年8月19日
    60
  • c语言socket 释放,C语言socket编程

    c语言socket 释放,C语言socket编程8种机械键盘轴体对比本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?[codelanguage=”cpp”]structsockaddr{unsignedshortsa_family;charsa_data[14];};[/code]这是一个16字节大小的结构(2+14),sa_family可以认为是socketaddressfamily的缩写,也可能被简写成AF…

    2022年7月13日
    15
  • linux 日期转换时间戳_oracle日期转13位时间戳

    linux 日期转换时间戳_oracle日期转13位时间戳1.用时间戳显示当前时间:date+%s#date+%s16145919602.将时间戳转换成日期时间:date-d@1614591901#date-d@16145919012021年03月01日星期一17:45:01CST3.转换指定日期为时间戳:2021-03-0117:49:23#date-d’2021-03-0117:49:23’+%s16145921634.指定日期格式转换:date-d@1614592163 +”…

    2022年10月2日
    2
  • Unity Shader-描边效果[通俗易懂]

    简介描边效果是游戏里面非常常用的一种效果,一般在选中物体或者NPC的时候,被选中的对象就会显示描边效果。比如最近又跑回去玩了玩《剑灵》,虽然出了三年了,在现在的网游里面画面仍然算很好的。还有就是最常见的LOL中的塔,选中时就会看到很明显的描边效果:

    2022年4月11日
    37
  • 网址转二维码,如何批量将网址转为二维码[通俗易懂]

    网址转二维码,如何批量将网址转为二维码[通俗易懂]1.首先打开Excel软件,将网址录入到Excel表格中。2.然后我们选中网址数据单元格3.接着我们点击【图片工具】4.选择【批量生成】5.在选项里设置合适的保存位置6.最后我们点击【确定】即可完成7.完成效果如下图所示(二维码图片已打上马赛克)…

    2025年9月4日
    5
  • 备忘录模式实例_iphone语音备忘录无法分享

    备忘录模式实例_iphone语音备忘录无法分享备忘录模式 Motivation动机模式定义实例结构要点总结笔记动机在软件构建过程中,某些对象的状态在转换过程中,可能由于某种需要,要求程序能够回溯对象之前处于某个点时的状态.如果使用一些共有接口来让其他对象得到对象的状态,便会暴露对象的实现细节.如何实现对象状态的良好保存与回复?但同时又不会因此而破坏对象的封装性模式定义在不破坏封装性的前提下.捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可以将该对象恢复到原先保存的状态实例朴素class Memento{ stri

    2022年8月11日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号