问题标签 [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 投票
1 回答
492 浏览

windows - 是否可以在已经使用 GDI+ 的窗口中使用 OpenGL?

基本上,我被要求渲染到一个屏幕外 DC,该 DC 设置(我不确定如何)使用 GDI+。当我尝试将 OpenGL 上下文与 DC 相关联时,它只是失败了(即返回零但没有错误)。SetPixelFormat 也失败了(可能是因为它已经设置好了?),再次返回零,而不是错误。

任何人都知道,在这种情况下(即其他人使用 GDI+ 的窗口的屏幕外上下文)是否有可能创建 OpenGL 上下文并使用 OpenGL 进行我自己的渲染?(如果可能,为什么 wglCreateContext 会失败?)

0 投票
3 回答
1865 浏览

gdi - 如何在 GDI 编程中创建大型 Compatible Memory DC?

我想创建一个大的CompatibleDC,在上面画一个大的图像,然后bitblt部分图像到其他DC,以达到高性能。

我正在使用以下代码来创建兼容的 Memory DC。但是当矩形变得非常大时,等等:5000*5000,创建的 CompatibleDC 变得不稳定。有时还可以,有时却失败了。我的代码有什么问题吗?

0 投票
6 回答
329 浏览

c++ - dc->DrawLine() 多次还是一次 blit 更便宜?

我有一个有网格的控件。每次使用设备上下文类中的绘制线函数绘制构成网格的水平和垂直线是否更昂贵,或者将网格绘制一次到内存设备上下文然后每次将其blit到窗户直流?谢谢。

0 投票
1 回答
763 浏览

printing - 如何指定不同方向的字体高度?

使用 GDI 创建字体的常用方法是使用所需的点大小和目标设备的垂直分辨率 (DPI),如下所示:

假设默认MM_TEXT映射模式,这会将 point_size 转换为所需设备的像素高度。(这是一个常见的近似值。实际上一英寸有 72.27 个点,而不是 72。)(减号表示我要指定实际字符高度,而不是单元格高度。)

如果我想创建一种横向字体(即,方向和擒纵为 90 度的字体),我应该使用LOGPIXELSX而不是LOGPIXELSY? 对于我所针对的某些打印机,水平和垂直分辨率是不同的。

一般来说,如果我想要一个角度theta,我是否结合LOGPIXELSXLOGPIXELSY?我在想这样的事情:

这对我来说很直观,但我想知道这是否真的是 GDI 字体映射器和打印机驱动程序的工作方式。

0 投票
2 回答
624 浏览

winforms - 如何使用 GDI(+) 在内存中渲染渐变

我正在尝试在内存中渲染一个尺寸为 1x16 的 Image 对象。此图像用作平铺背景。渐变本身应该以非线性方式具有 3 种颜色。

像素 1 到 6:渐变颜色 1 到颜色 2

像素 7 到 16:渐变颜色 3 到颜色 4

0 投票
1 回答
2119 浏览

c++ - 如何在不向子窗口发送 wm_paint 的情况下使父窗口无效?

父窗口和子窗口大小相同。子重绘时父监听子重绘,父重绘。所以我不能使用 invalidate 来清理父窗口,因为这会将 wm_paint 发送到子窗口,然后是一个无限循环。

如何在不使用 invalidateRect、invalidateRgn 等的情况下清理父窗口。或者,如何在不将 wm_paint 发送到子窗口的情况下使父级无效?

谢谢!

0 投票
2 回答
398 浏览

.net - 显示被鼠标光标拖动的图标?

我想让我的用户拖动几个界面项。目前,似乎只能使用 Cursor.Draw 方法直接绘制到图形对象。我希望能够显示在屏幕上拖动的项目,以拖动 Windows 图标(如文件夹)的方式,可以从一个窗口拖动到另一个窗口以及在任务栏上拖动,等等。dotnet 框架是否提供了执行此操作的能力,还是需要大量挂钩到可怕的 Windows API 函数?

编辑:我希望在拖动东西时能够看到我拖动的东西的图像显示在鼠标光标旁边。我希望能够将项目拖到窗口外,并继续在鼠标光标旁边显示它。

0 投票
4 回答
7497 浏览

c# - Winforms:如何加速 Invalidate()?

我正在 GDI+ 中开发一个保留模式绘图应用程序。该应用程序可以在画布上绘制简单的形状并执行基本的编辑。执行此操作的数学优化到最后一个字节,这不是问题。我正在使用内置 Controlstyles.DoubleBuffer 的面板上绘图。

现在,如果我在大显示器(在我的情况下为高清)上最大化运行我的应用程序,我的问题就会出现。如果我尝试从(大)画布的一个角到对角线的另一个角画一条线,它将开始滞后并且 CPU 升高。

我的应用程序中的每个图形对象都有一个边界框。因此,当我使从最大化应用程序的一个角到对角对角线的一条线的边界框无效时,该边界框实际上与画布一样大。当用户绘制一条线时,边界框的这种无效因此发生在 mousemove 事件上,并且有明显的滞后可见。如果线条是画布上的唯一对象,则此滞后也存在。

我已经尝试以多种方式对此进行优化。如果我画一条较短的线,CPU 和延迟就会下降。如果我删除 Invalidate() 并保留所有其他代码,则应用程序很快。如果我使用区域(仅跨越图形)而不是边界框来使无效,那么它同样慢。如果我将边界框拆分为一系列背靠背的较小框,从而减少失效区域,则看不到明显的性能提升。

因此,我在这里不知所措。如何加快失效速度?

另一方面,Paint.Net 和 Mspaint 都存在同样的缺点。然而,Word 和 PowerPoint 似乎能够像上面描述的那样绘制一条线,没有滞后,也没有 CPU 负载。因此有可能达到预期的结果,问题是如何?

0 投票
4 回答
326 浏览

c++ - Blt() 创建图层效果。不工作。我使用了错误的逻辑函数还是什么?

我有一个由各种对象绘制的窗口以创建分层效果(想想平视显示器,其中一个对象绘制指南针,另一个绘制网格线,另一个绘制高度计读数等)。因此,每个对象都有一个黑色的内存位图来绘制。当我调用该对象的 Draw 函数时,内存位图被传送到应用程序窗口。内存位图一开始都是黑色的,对象在上面绘制。黑色是透明色,所以被遮住了。结果是叠加效果。

所以,我一直在 blt() 函数中使用 OR 作为我的逻辑函数,它已经奏效了。但是,我注意到如果前一层涂成白色,那么在它上面绘制的层看起来就好像它在前一层下面。白色(ish)颜色是唯一出现这种效果的颜色。所有其他颜色都被正确绘制(也就是说,该图层看起来像是在前一个颜色之上绘制的,依此类推)。有人见过这种现象吗?

0 投票
2 回答
796 浏览

graphics - 开发预期在 RDP 上运行的应用程序;有小费吗?

假设我正在开发一个图形密集型应用程序(C++ 或 C#,图形 API 未确定),其大部分使用将由远程用户通过 RDP(终端服务器会话或对单用户计算机的远程访问)进行。很明显,应该避免不必要的“眼睛糖果”效果和动画。我的问题是:

  • 为了最有效地使用 RDP 协议,我应该注意/避免做什么?(例如,我有一个想法 RDP 可以将一些图形绘制原语直接远程到客户端......但这仅适用于 GDI 吗?使用双缓冲会破坏这种远程处理并强制位图模式吗?客户端位图缓存“只是工作”还是只缓存某些东西,比如字体和图标?)

  • 是否有任何可用的 RDP 协议分析器可以深入了解 RDP 流实际传输的内容(特别是位图与绘图原语)?(我可以想象为rdesktop源添加一些工具来执行此操作,但可能已经存在某些东西)。