如果释放不干净的设备上下文会发生什么?

2023-12-31

通常,如果程序将一个对象选择到设备上下文中,或者更改其属性,则应该在释放设备上下文之前将它们更改回来。如果不这样做会发生什么?

假设我这样做:

HDC hdc = GetDC(some_window);
SelectObject(hdc, some_font);
SetTextColor(hdc, 0x123456);
SetBkColor(hdc, 0xFEDCBA);
SetROP2(hdc, R2_XORPEN);
ReleaseDC(some_window, hdc);

and some_window的窗口类没有CS_OWNDC or CS_CLASSDC旗帜。会发生什么?


在您列出的功能中,SelectObject如果不取消选择对象(通过选择原始对象),这是唯一会导致问题的。这会导致some_font资源会被泄漏,因为 DC 在释放该资源时一直持有该资源的打开句柄。

你应该这样做:

HDC hdc = GetDC(some_window);
HGDIOBJ hOldObj = SelectObject(hdc, some_font);

// ... 

SelectObject(hdc, hOldObj);
ReleaseDC(some_window, hdc);

或者也许是这样的:

HDC hdc = GetDC(some_window);
int nSaved = SaveDC(hdc);
SelectObject(hdc, some_font);

// ... 

RestoreDC(nSaved);
ReleaseDC(some_window, hdc);

As MSDN 注释 http://msdn.microsoft.com/en-us/library/windows/desktop/dd162753%28v=vs.85%29.aspx :

这些函数中的每一个都返回一个标识新对象的句柄。 应用程序检索句柄后,必须调用选择对象函数来替换默认对象。但是,应用程序应该保存标识默认对象的句柄并 当不再需要新对象时,使用此句柄替换它。 当应用程序完成使用新对象的绘制时,它必须 通过调用恢复默认对象选择对象功能 然后通过调用删除新对象删除对象功能。无法删除对象会导致严重的性能问题 问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如果释放不干净的设备上下文会发生什么? 的相关文章

  • 使用Physics.Raycast 和Physics2D.Raycast 检测对象上的点击

    我的场景中有一个空的游戏对象 带有 2D 组件盒碰撞器 我将脚本附加到该游戏对象 void OnMouseDown Debug Log clic 但是当我点击我的游戏对象时 没有任何效果 你有什么想法 如何检测我的盒子碰撞器上的点击 使用光
  • C++ 中本地类中的静态成员变量?

    我知道我们不能宣布static本地类中的成员变量 但其原因尚不清楚 那么请问有人可以解释一下吗 另外 为什么我们不能访问非static函数内部定义的变量 内部已经定义了局部类 直接在局部类成员函数中 在下面给出的代码中 int main i
  • 为 Visual Studio 2013 编译 Tesseract

    我正在尝试使用tesseract在 Visual Studio 2013 中 我在链接器 gt 输入 不是 libtesseract302 static lib 中使用 libtesseract302 lib 一切都正常 并且已编译并运行
  • 向 Nhibernate 发出 SQL 查询

    如何将此 SQL 查询发送给 Nhibernate SELECT Customer name FROM Company INNER JOIN Customer ON Company CompanyId Customer CompanyId
  • 在 Unity 进程和另一个 C# 进程之间进行本地 IPC 的最快方法 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我希望每秒大约 30 次从 C 应用程序向我的 Unity 应用程序传送大量数据 由于 Unity 不支持映射内存和管道 我考虑了 t
  • 存储来自其他程序的事件

    我想将其他应用程序的事件存储在我自己的应用程序中 事件示例 打开 最小化 Word 或打开文件时 这样的事可能吗 运行程序 http msdn microsoft com en us library ms813609 aspx and 打开
  • 生成(非常)大的非重复整数序列而不进行预洗牌

    背景 我编写了一个简单的媒体客户端 服务器 我想生成一个不明显的时间值 随从客户端到服务器的每个命令一起发送 时间戳中将包含相当多的数据 纳秒分辨率 即使它不是真正准确 因为现代操作系统中计时器采样的限制 等 我想做的 在 Linux 上
  • C# Dns.GetHostEntry 不返回连接到 WiFi 的移动设备的名称

    我有一个 C 中的 Windows 窗体应用程序 我试图获取列表中所有客户端的主机名 下面给出的是 ra00l 来自此链接的代码示例 GetHostEntry 非常慢 https stackoverflow com questions 99
  • 关于在 Windows 上使用 WiFi Direct Api?

    我目前正在开发一个应用程序 我需要在其中创建链接 阅读 无线网络连接 在桌面应用程序 在 Windows 10 上 和平板电脑 Android 但无关紧要 之间 工作流程 按钮 gt 如果需要提升权限 gt 创建类似托管网络的 WiFi 网
  • 如何在 Linq 中获得左外连接?

    我的数据库中有两个表 如下所示 顾客 C ID city 1 Dhaka 2 New york 3 London 个人信息 P ID C ID Field value 1 1 First Name Nasir 2 1 Last Name U
  • Rx 中是否有与 Task.ContinueWith 运算符等效的操作?

    Rx 中是否有与 Task ContinueWith 运算符等效的操作 我正在将 Rx 与 Silverlight 一起使用 我正在使用 FromAsyncPattern 方法进行两个 Web 服务调用 并且我想这样做同步地 var o1
  • 上下文敏感与歧义

    我对上下文敏感性和歧义如何相互影响感到困惑 我认为正确的是 歧义 歧义语法会导致使用左推导或右推导构建多个解析树 所有可能的语法都是二义性的语言是二义性语言 例如 C 是一种不明确的语言 因为 x y 总是可以表示两个不同的事物 如下所述
  • HttpWebRequest 在第二次调用时超时

    为什么以下代码在第二次 及后续 运行时超时 代码挂在 using Stream objStream request GetResponse GetResponseStream 然后引发 WebException 表示请求已超时 我已经尝试过
  • 有人可以提供一个使用 Amazon Web Services 的 itemsearch 的 C# 示例吗

    我正在尝试使用 Amazon Web Services 查询艺术家和标题信息并接收回专辑封面 使用 C 我找不到任何与此接近的示例 所有在线示例都已过时 并且不适用于 AWS 的较新版本 有一个开源项目CodePlex http www c
  • 如何对 Web Api 操作进行后调用?

    我创建了一个 Web API 操作 如下所示 HttpPost public void Load string siteName string providerName UserDetails userDetails implementat
  • C++ 密码屏蔽

    我正在编写一个代码来接收密码输入 下面是我的代码 程序运行良好 但问题是除了数字和字母字符之外的其他键也被读取 例如删除 插入等 我知道如何避免它吗 特q string pw char c while c 13 Loop until Ent
  • Server.MapPath - 给定的物理路径,预期的虚拟路径

    我正在使用这行代码 var files Directory GetFiles Server MapPath E ftproot sales 在文件夹中查找文件 但是我收到错误消息说 给定物理路径但虚拟路径 预期的 我对在 C 中使用 Sys
  • 如何在按钮单击时模拟按键 - Unity

    我对 Unity 中的脚本编写非常陌生 我正在尝试创建一个按钮 一旦单击它就需要模拟按下 F 键 要拾取一个项目 这是我当前的代码 在编写此代码之前我浏览了所有统一论坛 但找不到任何有效的东西 Code using System Colle
  • 使用 GhostScript.NET 打印 PDF DPI 打印问题

    我在用GhostScript NET http ghostscriptnet codeplex com打印 PDF 当我以 96DPI 打印时 PDF 打印效果很好 但有点模糊 如果我尝试以 600DPI 打印文档 打印的页面会被极大地放大
  • 如何正确使用 std::condition_variable?

    我很困惑conditions variables以及如何 安全 使用它们 在我的应用程序中 我有一个创建 gui 线程的类 但是当 gui 是由 gui 线程构造时 主线程需要等待 情况与下面的函数相同 主线程创建互斥体 锁和conditi

随机推荐

  • 无法使用 Spring 创建 Innerbean - BeanInstantiationException 未找到默认构造函数

    我从Spring参考3 0开始学习spring 我想尝试如何实例化内部bean 这是我的代码 package com springexample public class ExampleBean private String sampleP
  • 查找列表中的数字簇

    我正在努力解决这个问题 因为我确信十几个 for 循环不能解决这个问题 有一个数字排序列表 例如 numbers 123 124 128 160 167 213 215 230 245 255 257 400 401 402 430 我想创
  • WPF 是否有 e.CloseReason?

    在制作应用程序时 我非常喜欢控制计算机上的每一种可能的情况 现在 我开始在某些事情上使用 WPF 而不是 WinForms 我也开始意识到 WPF 中缺少许多真正酷的东西 并且寻找替代方案似乎是一场永无休止的斗争 WPF 中有替代方法吗e
  • 迁移后的 Jenkins 不断重定向到原始域

    我迁移了詹金斯thinBackup插件 当我重新启动我的新 Jenkins master 时 通过以下方式访问它http new jenkins ip 8080 http new jenkins ip 8080会将我重定向到https ol
  • 获取/设置 RichTextBox 的第一可见行

    我有一个RichTextBox其中有数千行文字 我可以轻松地SET使用第一条可见线ScrollToCaret 通过做 this SelectionStart this Find this Lines lineIndex RichTextBo
  • 根据 RFC5321/RFC5322 对电子邮件地址进行正则表达式验证

    有谁知道根据以下内容验证电子邮件地址的正则表达式RFC5321 https www rfc editor org rfc rfc5321 RFC5322 https www rfc editor org rfc rfc5322 由于 可嵌套
  • NSTokenField 中自定义绘制的令牌

    有没有办法在里面有自定义令牌NSTokenField 我所说的 自定义 是指我想以自定义方式绘制它们 自定义悬停 背景图像等 无需使用私有 API 即可完成此操作 一个NSTokenField仅仅是一个NSTextField这巧妙地利用了对
  • 将 3 和 5 的倍数的所有自然数相加:以下代码中有什么错误

    我知道这可以通过使用轻松完成 if i 5 0 OR i 3 0 sum i 但是下面的 C 代码有什么问题 int sum 0 for int i 0 j 0 i lt 1000 i 3 j 5 Console WriteLine i i
  • 如何以编程方式将文件复制到另一个目录?

    有一个image file里面一个directory 如何copy this image file进入另一个directory那是刚刚创建的 他们俩directories都在同一个internal storage设备的 您可以使用这些功能
  • 获取窗口样式

    我正在尝试使用 GetWindowLong hWnd GWL STYLE 检查窗口是否具有某种样式 但这给了我一个 LONG 类型的变量 您将如何检查常量值类型 WS CAPTION 中的特定样式 使用按位 运算符与该 long 类型进行比
  • 我是否需要将异步添加到 Visual Studio 2017 ASP.NET Core MVC 中的控制器操作

    我刚刚将 Visual Studio 2015 ASP NET MVC Core 项目转换为 Visual Studio 2017 并且我在错误列表中收到以下信息性消息 消息 IDE1006 违反命名规则 缺少后缀 Async 此消息出现在
  • 如何禁用 ionic 4 中的 ion-button 阴影?

    我无法在 ionic 4 中将 ion button 的 box shadow 属性设置为 none 那么如何同时对单个按钮和所有按钮执行此操作
  • 虚拟环境中 pip install 的问题 - Rust 包管理器 Cargo 未安装或不在 PATH 上

    我正在使用 python 虚拟环境来处理项目 设置我的 venv 并从 git 中提取后 我尝试pip install r requirements txt但下面出现错误 Collecting orjson 3 5 2 Using cach
  • 如何使用电子获取文件夹路径

    我对电子非常陌生 谁能建议我如何使用电子获取本地文件夹的相对路径 JavaScript 不具备这种能力 我有一个 选择文件 按钮 请参阅快照 所以我的问题是 当我选择一个文件夹并单击 打开 按钮时 它应该返回整个目录路径 正如 phuong
  • Python 多处理陷入 selenium 困境

    所以我有代码可以启动 4 个 selenium chrome 驱动程序并从网页上的元素中抓取数据 代码可以简化为这样 import json import multiprocessing as mp from selenium import
  • 实时向点云添加新点 - Open3D

    我正在使用 Open3D 在 Python 中可视化点云 本质上 我想做的是以编程方式向点云添加另一个点 然后实时渲染它 这是我到目前为止所拥有的 我找不到任何解决方案 在下面的代码中 我展示了一种可能的解决方案 但它并不有效 第一个窗口关
  • 使用 dgemm/dgemv 的矩阵向量积

    将 Lapack 与 C 结合使用让我有点头疼 我发现为 fortran 定义的函数有点奇怪 所以我尝试在 C 上创建一些函数 以便我更容易阅读正在发生的事情 不管怎样 我没有让矩阵向量乘积按我的意愿工作 这是该程序的一个小示例 小matl
  • 在 SwiftUI 中显示“UIActivityViewController”

    我想让用户能够共享位置 但我不知道如何显示UIActivityViewController在 SwiftUI 中 基本实现UIActivityViewController in SwiftUI is import UIKit import
  • 在mysql中像查询一样搜索带有撇号的记录

    我有类似这样的 mysql 查询 SELECT from users where username LIKE test s 并且有users带有字段名称的数据库表username 并且有 1 条记录users带有用户名的表test s现在我
  • 如果释放不干净的设备上下文会发生什么?

    通常 如果程序将一个对象选择到设备上下文中 或者更改其属性 则应该在释放设备上下文之前将它们更改回来 如果不这样做会发生什么 假设我这样做 HDC hdc GetDC some window SelectObject hdc some fo