CreateCompatibleDC理解

CreateCompatibleDC理解http blog sina com cn s blog 82c346de0100 html 函数功能 该函数创建一个与指定设备兼容的内存设备上下文环境 DC 函数原型 HDCCreateCom HDChdc 参数 hdc 现有设备上下文环境的句柄 如果该句柄为 NULL 该函数创建一个与应用程序的当前显示器兼容的内存设备上下文

http://blog.sina.com.cn/s/blog_82c346de0100ty3i.html

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

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

参数:

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

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

 

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

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

 

用双缓冲的话还要再定义一个位图对象吧,然后用CreateCompatibleBitmap建立一个与屏幕显示兼容的位图,再用SelectObject将位图选入到内存显示设备中,不知道是不是这样

首先给出实现的程序,然后再解释,同样是在OnDraw(CDC *pDC)中:
CDC MemDC; //首先定义一个显示设备对象
CBitmap MemBitmap;//定义一个位图对象
//随后建立与屏幕显示兼容的内存显示设备
MemDC.CreateCompatibleDC(NULL);
//这时还不能绘图,因为没有地方画 ^_^
//下面建立一个与屏幕显示兼容的位图,至于位图的大小嘛,可以用窗口的大小,也可以自己定义(如:有滚动条时就要大于当前窗口的大小,在BitBlt时决定拷贝内存的哪部分到屏幕上)
MemBitmap.CreateCompatibleBitmap(pDC,nWidth,nHeight);

//将位图选入到内存显示设备中
//只有选入了位图的内存显示设备才有地方绘图,画到指定的位图上
CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap);
//先用背景色将位图清除干净,这里我用的是白色作为背景
//你也可以用自己应该用的颜色
MemDC.FillSolidRect(0,0,nWidth,nHeight,RGB(255,255,255));
//绘图
MemDC.MoveTo(……);
MemDC.LineTo(……);

//将内存中的图拷贝到屏幕上进行显示
pDC->BitBlt(0,0,nWidth,nHeight,&MemDC,0,0,SRCCOPY);
//绘图完成后的清理
MemBitmap.DeleteObject();
MemDC.DeleteDC();


























gdi在sdk应该是很重要的东西,不过嘛自己的水平实在是不怎么够品。长久以来一直都没有认识到 CreateCompatibleDC  的用途到底在这里,不过还好从知道这个东西数起的200天内,我终于还是晓得一些关于这个函数或者说内存dc存在的意义了。

     在这种情况下,假如你要对屏幕进行比较多的gdi函数操作,如果每一步操作都直接对屏幕dc进行操作,那出现的大多数可能性都是屏幕的闪烁。一个很好的解决方法就是使用内存dc,将这些操作全部先在内存dc上操作,然后依次性在屏幕上进行操作。

  例如:如果你单单使用bitblt在屏幕上拷贝一个图,那可以直接使用屏幕的dc。但是如果你要先设置背景(fillrect)然后再bitblt的话,这就涉及到两个屏幕dc的操作,这样的话屏幕很容易闪烁

大概意思:如果要在cdc设备上画线,先根据cdc新建一个CDC MemDC,然后绑定CDC MemDCCBitmap MemBitmap,然后操作都在cdc MemDc上,操作完之后再把cdc MemDC拷到cdc上,这样可以防止每次直接操作cdc,造成闪烁。

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

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

(0)
上一篇 2026年3月18日 上午8:44
下一篇 2026年3月18日 上午8:45


相关推荐

  • java面向对象的三大特性

    java面向对象的三大特性java面向对象的三大特性包括:封装、继承、多态一、封装1.含义:封装就是把同一类事物的共性(包括属性和方法)归到同一类中,方便使用。封装也称信息隐藏,是指利用抽象数据类型把数据和基于数据的操作封装起来,使其成为一个不可分割的整体,数据隐藏在抽象数据内部,尽可能的隐藏数据细节,只保留一些接口使其与外界发生联系。也就是说用户无需知道内部的数据和方法的具体实现细节,只需根据留在外部的接口进行操作就行。2.封装的实现需要修改属性的访问控制符(修改为private);创建getter/setter方

    2022年7月9日
    24
  • 电脑dnf,DNF卡顿如何解决_DNF卡顿如何解决 教你调整电脑参数畅玩游戏_52PKDNF「建议收藏」

    电脑dnf,DNF卡顿如何解决_DNF卡顿如何解决 教你调整电脑参数畅玩游戏_52PKDNF「建议收藏」DNF卡顿怎么解决?相信很多玩家电脑的配置并不差,但是就是玩DNF会卡。今天就在这里教大家一些优化的方法。让你轻松摆脱DNF卡顿带来的困扰。如果是硬件问题的可以换硬件,如果是软件设置问题的可以优化自己的设置。首先要说的由于系统版本和软件版本的问题,每一项设置带来的提升也会不同,需要各位玩家自己摸索,我也会讲一下自己在不同系统测试的感受。我的电脑信息:下面是方法汇总:一、硬件:1.显卡虽然之前一直有…

    2025年10月28日
    6
  • python进阶(6)深拷贝和浅拷贝「建议收藏」

    python进阶(6)深拷贝和浅拷贝「建议收藏」深拷贝和浅拷贝不管对于浅拷贝、还是深拷贝,针对不可变对象str、int、tuple(有点特殊)、boolean,它的内存地址是不变的,拷贝的仅仅是值importcopya=1b=co

    2022年7月28日
    5
  • 深入理解MessageQueue

    深入理解MessageQueueAndroid 中有两个非常重要的知识点 分别是 Binder 机制和 Handler 机制 前者用于跨进程通讯 并且通过 ServiceManag 给上层应用提供了大量的服务 而后者用于进程内部通讯 以消息队列的形式驱动应用的运行 之前的文章已经多次分析了 Binder 相关的内容 复杂程度远高于 Handler 之后还会继续分析 Binder 说到 Handler 做安卓开发的一定都不会陌生 一般用于切换线

    2026年3月19日
    1
  • 最新Coze(扣子)智能体工作流:全自动批量改写发布公众号爆文!一键解析、改写、段落配图、排版、自动发布!

    最新Coze(扣子)智能体工作流:全自动批量改写发布公众号爆文!一键解析、改写、段落配图、排版、自动发布!

    2026年3月13日
    2
  • 拼图汇总

    拼图汇总

    2022年1月7日
    36

发表回复

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

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