问题标签 [gdi]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1394 浏览

.net - Graphics.FromHwnd(IntPtr.Zero) 返回 null,为什么?

我目前正在调查我的应用程序中的第 3 方组件 (DevExpress) 的问题。我的问题与这篇DevExpress 知识库文章非常相似。我得到相同的异常,但堆栈跟踪更少。所以我使用 .NET Reflector 来找出在这种情况下可能为 null 的对象,唯一可以为 null 的对象是 Graphics。这是使用 Graphics.FromHwnd(IntPtr.Zero) 创建的。因为我对 GDI 没有广泛的了解,所以我想知道是否有人可以告诉我这可能返回 null 的可能场景......

我试图在 Windows 超出 GDI 句柄的情况下重现它,但随后我得到一个“句柄不足”的情况 - 至少有一次异常,这不是我正在调查的问题的情况

蒂亚,马丁

0 投票
3 回答
1501 浏览

.net - BeginPaint 的 hWnd 参数值正确吗?

我正在尝试制作一个在窗口中绘制一些数据的 Visual C++ 2008 程序。我从不同的 地方读到了正确的方法是重写 WndProc。因此,我在 Visual C++ 2008 Express Edition 中制作了一个 Windows 窗体应用程序,并将此代码添加到 Form1.h,但它不会编译:

当我尝试在 Visual C++ 2008 Express Edition 中编译它时,会出现此错误: 错误 C2664: 'BeginPaint' : cannot convert parameter 1 from 'System::IntPtr' to 'HWND'

当我尝试使用 this->Handle 而不是 m.HWnd 时,会发生相同的错误。

当我尝试将 m.HWnd 转换为 (HWND) 时,会出现此错误: 错误 C2440: 'type cast' : cannot convert from 'System::IntPtr' to 'HWND'

也许我需要将 m.HWnd 转换为 pin_ptr 或其他东西。

0 投票
4 回答
5073 浏览

c# - 禁用特定 GDI 设备上下文的抗锯齿

我正在使用第三方库将图像渲染到 GDI DC,并且我需要确保在没有任何平滑/抗锯齿的情况下渲染任何文本,以便我可以将图像转换为具有索引颜色的预定义调色板。

我用于渲染的第三方库不支持此功能,仅根据当前的窗口设置来渲染文本以​​进行字体渲染。他们还表示,他们不太可能很快增加关闭抗锯齿功能。

到目前为止,我发现的最好的解决方法是以这种方式调用第三方库(为简洁起见,省略了错误处理和先前的设置检查):

这显然对操作系统产生了可怕的影响,每次我渲染图像时,其他应用程序都会从​​启用清除类型闪烁到禁用并返回。

所以问题是,有谁知道我可以如何更改特定 DC 的字体渲染设置?

即使我可以只使更改过程或线程特定而不影响整个操作系统,那将是向前迈出的一大步!(这将使我可以选择将此渲染输出到一个单独的进程 - 无论如何渲染后结果都会写入磁盘)

编辑:我想补充一点,我不介意解决方案是否比几个 API 调用更复杂。如果只需要一天的工作,我什至会对涉及挂钩系统 dll 的解决方案感到满意。

编辑:背景信息 第三方库使用大约 70 种颜色的调色板进行渲染。将图像(实际上是地图图块)渲染到 DC 后,我将每个像素从它的 32 位颜色转换回它的调色板索引,并将结果存储为 8bpp 灰度图像。这作为纹理上传到视频卡。在渲染期间,我使用在视频卡上执行的像素着色器重新应用调色板(也存储为纹理)。这让我可以立即在不同的调色板之间切换和淡入淡出,而无需重新生成所有需要的图块。为典型的世界视图生成和上传所有图块需要 10-60 秒。

编辑:将 GraphicsDevice 重命名为 Graphics 这个问题的先前版本中的 GraphicsDevice 类实际上是 System.Drawing.Graphics。我重命名了它(使用 GraphicsDevice = ...),因为有问题的代码位于命名空间 MyCompany.Graphics 中,编译器无法正确解析它。

编辑:成功! 我什至设法PatchIatMarshal.GetFunctionPointerForDelegate. .NET 互操作团队确实做得非常出色!我现在使用以下语法,其中Patch的扩展方法是System.Diagnostics.ProcessModule

0 投票
3 回答
1689 浏览

c - 如何确定 DIB 是自下而上还是自上而下?

如果我使用 创建 DIB ,我可以通过将结构的字段设置为负值或正值CreateDIBSection()来指定它应该是自上而下还是自下而上。但是,如果我调用这样的位图来填充结构,那么和似乎总是积极的。biHeightBITMAPINFOHEADERGetObject()DIBSECTIONdsBm.bmHeightdsBmih.biHeight

有没有办法找出 DIB 是自上而下还是自下而上,而我HBITMAP只有

0 投票
4 回答
1986 浏览

winapi - GDI裁剪的实现细节

考虑以下代码片段:

微软的裁剪实现是否足够智能,可以立即从对 Rectangle 的调用中返回而无需尝试绘制任何内容?我怀疑它可能是但无法在任何地方找到确认。用于剪辑的 MSDN 文档在幕后细节上很少见,而谷歌搜索除了如何使用 GDI 剪辑之外什么也没找到。

编辑:我突然意识到我没有指出这是在 Windows Mobile 上运行的,所以我用于分析的工具集是有限的。

0 投票
2 回答
538 浏览

c# - 从 C# 中的位图对象中获取 BITMAPV5HEADER 的任何方法

有没有办法从 C# 中的位图对象中获取 BITMAPV5HEADER?或者只是得到他们的价值观?我需要从位图中获取一些 ColorSpace 信息,但在 C# 中看不到这样做的方法。

0 投票
1 回答
679 浏览

c++ - 获取背景窗口的缩略图

我正在尝试获取不可见的窗口的缩略图。

这是我到目前为止的代码

目前,WindowProc直接调用FindWindow用于获取句柄,但我最终想使用EnumWindows循环所有窗口以获取它们的缩略图并将它们存储在链接列表中。

此代码位于从 C# Forms 应用程序调用的 DLL 中。目前,C# 应用程序只需获取位图并将其保存到文件中。

问题是,除非我FindWindow用来获取可见窗口(也恰好是 C# 应用程序),否则图片最终会变成一个黑盒子。

是否可以获取背景窗口的图片?

编辑:这是一个 Windows Mobile 应用程序

0 投票
1 回答
556 浏览

gdi - 如何创建自定义 GDI 设备?

是否可以在用户模式下创建自定义 GDI 设备?这个想法是创建一个设备上下文(HDC),我们可以将它传递给一个不透明的组件,这样当组件调用像 TextOut 这样的 GDI 函数时,我们可以获得实际的文本字符串。

0 投票
1 回答
690 浏览

streaming - 如何拦截高级 GDI 绘制命令?

我正在尝试制作一个允许远程访问其他应用程序(在不同机器上运行)的应用程序。这个想法是让用户透明地访问某些应用程序,我基本上有两个选择:

  • 应用程序流
  • 拦截绘图命令并在客户端重现它们

(当然,输入是从客户端重定向到服务器的)

我有一个带有应用程序流的工作版本,但我不知道如何通过挂钩 Win API 来做到这一点......

有任何想法吗 ?

0 投票
2 回答
1982 浏览

winapi - 用于 MaskBlt 的光栅运算符

我正在尝试使用 GDI MaskBlt 命令绘制具有透明度的图像:http: //msdn.microsoft.com/en-us/library/dd145047 (VS.85).aspx

我似乎在文档中找不到任何关于在明显用例中使用什么光栅运算符的内容:一种MAKEROP4(SRCCOPY, DSTCOPY)- 在掩码为 1 的地方进行 blitting,在掩码为 0 的地方保持目标不变。 SRCCOPY 是一个有效的 ROP ,但是我应该用什么来代替我的虚构DSTCOPY