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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 本地Mysql忘记密码的修改方法(windows)

    本地Mysql忘记密码的修改方法(windows)你是否有忘记密码的尴尬你是否有连Mysql的安装路径都忘了的尴尬别问我是怎么知道的,哈哈哈话不多说,步入正题吧!如果你记得mysql的安装路径的话,直接跳过步骤1231.键盘Windows+R,输入services.msc然后回车;2.找到Mysql,右键Mysql找到属性,打开就能看到可执行文件的路径了;PS:可以切换到大写,然后一直按MMM…(祖传妙方)3.进入bin目录下,按住shift+鼠标右键,点击打开“在此处打开Powershe.

    2022年6月16日
    40
  • sql mysql创建 视图索引_SQLServer中在视图上使用索引(转载)「建议收藏」

    sql mysql创建 视图索引_SQLServer中在视图上使用索引(转载)「建议收藏」在SQLServer中,视图是一个保存的T-SQL查询。视图定义由SQLServer保存,以便它能够用作一个虚拟表来简化查询,并给基表增加另一层安全。但是,它并不占用数据库的任何空间。实际上,在你查询它之前,视图并不做任何事情。索引视图在SQLServer2000和2005中,你能够给视图增加索引。但是,如果视图只是一个保存在数据库中的查询定义,在运行前没有自己的数据,你如何给那个定义建立…

    2022年7月22日
    19
  • jmeter性能测试实战视频(常用性能测试工具有哪些)

    1、搭建AUT第一步、下载所需文件   Discuz_***.zip——源码程序文件,是PHP程序,简体中文GBK的下载地址是http://download.comsenz.com/DiscuzX/3.1/Discuz_X3.1_SC_GBK.zip。   PHPnow_***.zip—–集成了Apache中间件、Mysql数据库和PHP,下载地址是http://servkit.

    2022年4月10日
    37
  • 安捷伦频谱仪n9010a_安捷伦频谱仪LAN设置

    安捷伦频谱仪n9010a_安捷伦频谱仪LAN设置频谱仪操作说明按键输入所测6个频点的中心频率。(注:与步骤8对应,若所测频点为4临频输出,此处频率=第一个频点中心频率+12MHz;若所测频点为6临频输出,此处频率=第一个频点中心频率+20MHz;)20.点击“AMPTD”对应的右侧按键,液晶屏右侧出现一列选项;21.点击“Attenuation”对应的右侧按键,左右旋转按键矩阵中的旋钮键,使得频谱两边的值载噪比最大,此值即为设备的载噪比六.…

    2022年8月11日
    7
  • python中plot实现即时数据动态显示方法[通俗易懂]

    python中plot实现即时数据动态显示方法[通俗易懂]在Matlab使用Plot函数实现数据动态显示方法总结中介绍了两种实现即时数据动态显示的方法。考虑到使用python的人群日益增多,再加上本人最近想使用python动态显示即时的数据,网上方法很少,固总结于此。示例代码importmatplotlib.pyplotaspltimportnumpyasnpimporttimefrommathimport*plt.ion()

    2022年6月26日
    37
  • pycharm操作mysql数据库 创建表 向表中插入数据 操作mysql数据库查询 修改 删除数据

    pycharm操作mysql数据库 创建表 向表中插入数据 操作mysql数据库查询 修改 删除数据1 安装 PyMySQL 模块语法为 pipinstallPy 集成环境里面操作 MySQL 数据库创建表 导入 pymysqlimpor 创建连接 con pymysql connect host localhost user root password root database test port 3

    2025年7月22日
    5

发表回复

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

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