问题标签 [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.
c++ - InvalidateRect 没有重新绘制窗口
每当我按下按钮时,我都会绘制一个多边形。
我想在再次按下按钮时重新绘制多边形,但是当我按下它时,它只是绘制另一个多边形而不擦除另一个多边形:
我也试图让多边形超出其范围,但它也没有做任何事情。
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 在它认为合适的时候刷新渲染目标?
windows - 为什么在 WM_PAINT 消息中调用 InvalidateRect()?
所以我正在通过“Programming Windows - Charles Petzold(第 5 版)”一书学习 Windows API。如果我理解正确,在处理 WM_PAINT 消息调用函数 BeginPaint() 时会验证必须更新的给定区域。但是,在本书中(PDF 版第 145 页或印刷版第 128 页)您可以看到以下代码:
这是作者的错误吗?我认为 InvalidateRect() 应该在使用 GetDC()/ReleaseDC() 之后调用,而不是在 WM_PAINT 消息中。
c++ - 有没有一种安全的方法可以在子类控件上绘制一些额外的内容?
假设您想向 Windows 控件添加一些额外的图形信息。例如,您想将拖放功能添加到列表视图(使用此处讨论的过程),但在用户拖动项目时使用水平线表示放置/插入点。(该控件属于您自己的应用程序。)
有没有一种安全的方法来子类化控件并直接在它上面绘制?在我尝试这样做的有限实验中,我遇到了一些问题。首先,不清楚我是否应该在消息期间调用BeginPaint
,因为一旦消息传递到默认过程,控件本身就会调用这些函数。我也不可避免地遇到了闪烁,因为有些区域被涂了两次。EndPaint
WM_PAINT
我认为一种更安全的方法是创建一个透明的覆盖窗口并在其上绘制,因为这样可以避免与默认绘制过程发生冲突,但我想在走这条路之前我会问一下。感谢您的任何建议。
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
c++ - 如何剪切由两个滚动条控件创建的角矩形
假设您有一个带有子滚动条控件的可调整大小的窗口,滚动条来来去去取决于窗口内容是否大到需要滚动。
当两个滚动条都存在时,在窗口的右下角,在它们的交点处有效地创建了一个小矩形。在窗口上绘图时是否有一个干净的策略来剪切该矩形,这样您就不会在其上绘图?
我想我目前的方法是获取每个滚动条的矩形,如果这些矩形不为空,则使用矩形的位置来确定我们要剪辑的矩形。然后调用ExcludeClipRect
那个矩形。我想可以使用类似的方法,除了使用GetSystemMetrics(SM_CXVSCROLL)
和GetSystemMetrics(SM_CYVSCROLL)
获取矩形尺寸。
但是有没有更被接受的方式来做到这一点,也许使用一些有用的剪辑 API 函数?感谢您的任何意见。
c++ - 请确认选择自定义笔和自定义画笔时恢复 DC 的最佳方式
有人可以确认微软的这个示例代码是否无法恢复自定义画笔集SetDCBrushColor
吗?
Paul Watt 和其他发帖者建议我们使用SelectObject
来分别恢复对笔和画笔的更改,或者我们使用SaveDC
和RestoreDC
。
https://www.codeproject.com/Articles/224754/Guide-to-Win32-Memory-DC
或者使用SaveDC
andRestoreDC
来简化:
我意识到我需要DeleteObject
在我创建的任何不是库存对象的画笔/笔上使用。
Microsoft 是否忘记使用SelectObject
以前保存的原始画笔版本?(或者微软应该使用SaveDC
和RestoreDC
?)
c++ - win32-gdi系统驱动的WM_PAINT无闪烁吗?
运行此代码会导致标题问题:
如果您调整窗口大小,您将看不到任何闪烁(系统发送的重绘)
如果你在窗口内移动鼠标,会出现严重的闪烁(我发送的重绘)
如何重现系统驱动的 WM_PAINT?
winapi - WinAPI Region 没有意义吗?
如果我们在处理 WM_PAINT 期间在 BeginPaint 期间只有 RECT,您能否解释一下为什么 WinAPI 需要 InvalidateRgn 及其要添加到更新区域 (hRgn) 的区域的句柄?提前致谢!
delphi - Delphi TCheckbox 问题覆盖 WM_PAINT
我使用的是旧版本的 Delphi (7),但这并不重要。主题正在使用中。我需要控制复选框的背景和字体颜色以及 TCheckbox 的文本。我已经改编了一些在其他地方找到的基本上可以工作的代码,但是我在整个应用程序中使用的 Arial 字体在手动绘制时看起来非常粗糙。这是代码。
如果我执行上面的继承调用,您可以在我写在顶部的白色文本下看到原始的黑色文本,但是白色文本看起来不错,带有圆角字体。显然,继承函数中的某些内容正在以某种方式修复文本输出,但我无法真正按照它来解决问题。有谁知道如何解决这个问题?如有必要,我可以发送一些结果的屏幕截图。
此外,在没有继承调用的情况下使用上面的代码,窗口上的大多数标签,与复选框无关,除非我最小化和最大化程序,否则不会被绘制。谢谢你。