问题标签 [wm-paint]

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 回答
219 浏览

c++ - InvalidateRect 没有重新绘制窗口

每当我按下按钮时,我都会绘制一个多边形。

我想在再次按下按钮时重新绘制多边形,但是当我按下它时,它只是绘制另一个多边形而不擦除另一个多边形:

我也试图让多边形超出其范围,但它也没有做任何事情。

0 投票
2 回答
759 浏览

c# - WM_PAINT 消息频率:C# (.Net Framework 4.7.2 WinForms) vs. C++

我目前正在将一些使用 C#(FW 版本 4.7.2)WinForms 实现的旧游戏转换为使用 C++ 的 Direct3D。

目前,我所有的实时图形游戏都实现了OnPaint覆盖,绘制到从PaintEventArgs参数中检索到的 Graphics 对象,并在绘制当前帧后立即失效。(我不知道这是否不推荐,但效果很好)。这些应用程序当然使用双缓冲。这会导致一个核心 100% 的利用率,这是可以的。

在将我的游戏移植到 C++ 和 Direct3D 时,我遇到的第一个障碍是窗口的刷新率,即使我通过在绘图后执行WndProc()和调用来完成相同的事情。InvalidateRect()

我遵循了这个快速入门指南:https ://docs.microsoft.com/en-us/windows/win32/direct2d/direct2d-quickstart

问题是,

使用我的 Windows 窗体应用程序,在全尺寸背景图像上绘制时刷新率约为 60 fps,在空白背景上绘制时为 300-400 fps。以下示例仅绘制一个矩形,产生惊人的 2,500 fps:

不用说,我在移植到 DirectX 时期待更好的帧速率,但问题是 WM_PAINT 事件没有足够频繁地触发,即使我不画任何东西,我也卡在 100 fps,并且 cpu 利用率是仅约 10%。

我只在快速入门指南的源代码中添加了以下行:

我究竟做错了什么?

我读到 Direct 2D 的渲染目标是自动双缓冲的,

所以问题是,为什么 WM_PAINT 事件每秒只触发 100 次?

注意:检查了 windows 窗体Control.Invalidate()方法源,它的作用是调用 InvalidateRect (或 RedrawWindow() 如果子控件也将失效)

注意:我是否在这里错误地使用了直接 2d 绘图?我是否应该在一个单独的线程上持续绘制并让 DirectX 在它认为合适的时候刷新渲染目标?

0 投票
3 回答
374 浏览

windows - 为什么在 WM_PAINT 消息中调用 InvalidateRect()?

所以我正在通过“Programming Windows - Charles Petzold(第 5 版)”一书学习 Windows API。如果我理解正确,在处理 WM_PAINT 消息调用函数 BeginPaint() 时会验证必须更新的给定区域。但是,在本书中(PDF 版第 145 页或印刷版第 128 页)您可以看到以下代码:

这是作者的错误吗?我认为 InvalidateRect() 应该在使用 GetDC()/ReleaseDC() 之后调用,而不是在 WM_PAINT 消息中。

0 投票
0 回答
58 浏览

c++ - 有没有一种安全的方法可以在子类控件上绘制一些额外的内容?

假设您想向 Windows 控件添加一些额外的图形信息。例如,您想将拖放功能添加到列表视图(使用此处讨论的过程),但在用户拖动项目时使用水平线表示放置/插入点。(该控件属于您自己的应用程序。)

有没有一种安全的方法来子类化控件并直接在它上面绘制?在我尝试这样做的有限实验中,我遇到了一些问题。首先,不清楚我是否应该在消息期间调用BeginPaint,因为一旦消息传递到默认过程,控件本身就会调用这些函数。我也不可避免地遇到了闪烁,因为有些区域被涂了两次。EndPaintWM_PAINT

我认为一种更安全的方法是创建一个透明的覆盖窗口并在其上绘制,因为这样可以避免与默认绘制过程发生冲突,但我想在走这条路之前我会问一下。感谢您的任何建议。

0 投票
1 回答
124 浏览

c++ - Getting several WM_PAINT message with one dispatch

I'm getting several WM_PAINT messages/events in the message handler for my window while I resize it, even though I only translate+dispatch a single message.

Is this normal? Why is this happening? (I was expecting to get one WM_PAINT message per dispatch, and never more than that)

Window loop:

Message handler function:

Console output:

  • prior to clicking, many "checking events" and "ev" messages appear
  • when first clicking on the border of the window, "ev" appears
  • while holding left click, no messages appear
  • when holding and dragging to make the window bigger, more "PAINT EVENT" messages appear
0 投票
0 回答
44 浏览

c++ - 如何剪切由两个滚动条控件创建的角矩形

假设您有一个带有子滚动条控件的可调整大小的窗口,滚动条来来去去取决于窗口内容是否大到需要滚动。

当两个滚动条都存在时,在窗口的右下角,在它们的交点处有效地创建了一个小矩形。在窗口上绘图时是否有一个干净的策略来剪切该矩形,这样您就不会在其上绘图?

我想我目前的方法是获取每个滚动条的矩形,如果这些矩形不为空,则使用矩形的位置来确定我们要剪辑的矩形。然后调用ExcludeClipRect那个矩形。我想可以使用类似的方法,除了使用GetSystemMetrics(SM_CXVSCROLL)GetSystemMetrics(SM_CYVSCROLL)获取矩形尺寸。

但是有没有更被接受的方式来做到这一点,也许使用一些有用的剪辑 API 函数?感谢您的任何意见。

0 投票
1 回答
93 浏览

c++ - 请确认选择自定义笔和自定义画笔时恢复 DC 的最佳方式

有人可以确认微软的这个示例代码是否无法恢复自定义画笔集SetDCBrushColor吗?

Paul Watt 和其他发帖者建议我们使用SelectObject来分别恢复对笔和画笔的更改,或者我们使用SaveDCRestoreDC

https://www.codeproject.com/Articles/224754/Guide-to-Win32-Memory-DC

或者使用SaveDCandRestoreDC来简化:

我意识到我需要DeleteObject在我创建的任何不是库存对象的画笔/笔上使用。

Microsoft 是否忘记使用SelectObject以前保存的原始画笔版本?(或者微软应该使用SaveDCRestoreDC?)

0 投票
1 回答
183 浏览

c++ - win32-gdi系统驱动的WM_PAINT无闪烁吗?

运行此代码会导致标题问题:

如果您调整窗口大小,您将看不到任何闪烁(系统发送的重绘)

如果你在窗口内移动鼠标,会出现严重的闪烁(我发送的重绘)

如何重现系统驱动的 WM_PAINT?

0 投票
2 回答
114 浏览

winapi - WinAPI Region 没有意义吗?

如果我们在处理 WM_PAINT 期间在 BeginPaint 期间只有 RECT,您能否解释一下为什么 WinAPI 需要 InvalidateRgn 及其要添加到更新区域 (hRgn) 的区域的句柄?提前致谢!

0 投票
0 回答
126 浏览

delphi - Delphi TCheckbox 问题覆盖 WM_PAINT

我使用的是旧版本的 Delphi (7),但这并不重要。主题正在使用中。我需要控制复选框的背景和字体颜色以及 TCheckbox 的文本。我已经改编了一些在其他地方找到的基本上可以工作的代码,但是我在整个应用程序中使用的 Arial 字体在手动绘制时看起来非常粗糙。这是代码。

如果我执行上面的继承调用,您可以在我写在顶部的白色文本下看到原始的黑色文本,但是白色文本看起来不错,带有圆角字体。显然,继承函数中的某些内容正在以某种方式修复文本输出,但我无法真正按照它来解决问题。有谁知道如何解决这个问题?如有必要,我可以发送一些结果的屏幕截图。

此外,在没有继承调用的情况下使用上面的代码,窗口上的大多数标签,与复选框无关,除非我最小化和最大化程序,否则不会被绘制。谢谢你。