问题标签 [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 回答
346 浏览

winapi - 滚动图

我正在尝试绘制一个带有滚动条的图形,
该图形使用 x 轴的时间,我希望有一个有限的 x 轴(1 分钟)
,所以直到 1 分钟,滚动条的页面是长度滚动条,
之后页面应该是“60 秒长”,并且
当您拖动它跟踪的滚动条并拉起图形的相关位时,滚动条最大值应该是“经过时间”长。
图表应该自动滚动直到它被拖走(并且一旦它被拖回最大值就自动滚动)

这就是我到目前为止所拥有的

在 wndproc 的顶部定义
static SCROLLINFO sci = {sizeof(SCROLLINFO),SIF_RANGE|SIF_POS|SIF_PAGE|SIF_TRACKPOS,0,0,0,0,0};

在 WM_HSCROLL 事件中:

在从 WM_PAINT 调用的绘图代码中
(是的,我意识到我不应该在此处设置滚动条的信息,我打算在其正常工作后将其放在适当的位置)

在绘图功能的顶部:

static SCROLLINFO sci = {sizeof(SCROLLINFO),SIF_RANGE|SIF_POS|SIF_PAGE|SIF_TRACKPOS,0,0,0,0,0};

在绘图功能中:

至于全局变量:
g_h_minX是开始时间,
g_h_maxX是最后一个结果时间
MAX_TIME_WIDTH_MS是毫秒的“窗口长度”->我想要滚动条页面多长时间(60秒)

所以我们的想法是设置end滚动条所在的位置,并start通过从中获取窗口长度end,并计算出我们要查看的图形的哪一部分。

在过去的两天里,我一直在摆弄这个,我的想法已经不多了。我确定我很接近,但我无法弄清楚,

编辑:
稍微更新了代码
似乎我也忘了说问题是什么。
scolling 代码不能正常工作,当有新数据进入时它会自动滚动,
但是当我将拇指拖离滚动条的末端时,它只是捕捉到开始,并且不会移动。仔细观察,箭头有效,右键菜单上的“page-right”“page-left”有效,只是没有跟踪

任何帮助,将不胜感激。

提前致谢。

0 投票
1 回答
286 浏览

c++ - WM_PAINT Bitblitting 多次?

这适用于 C++ - win32。基本上,我已经从文件中将图像(bmp)加载到 HBITMAP 中,并将它的 bitblitted 到主窗口的设备上下文中。

如果我想更改图像,我将如何再次调用它?

我调用了 InvalidateRectangle() 和 UpdateWindow() 但这会导致窗口控件闪烁。

0 投票
0 回答
275 浏览

winapi - InvalidateRect 调用过于频繁会阻止其他窗口重绘

我开发音频插件,这些插件在它们的主机内运行并实时工作。每个插件都有自己的带有控件的窗口,它通常包含某种分析窗格,一个非常大的矩形,可以重复绘制(例如每秒 20-50 倍)。这一切都运作良好。

当用户调整参数时,麻烦就来了——插件使用 WM_MOUSEMOVE 来跟踪鼠标移动,并在每次更改时调用 ::InvalidateRect 以重绘窗口的相关部分。如果你移动得足够快,窗口真的很快就会重新绘制,但是似乎没有时间重新绘制主机和其他窗口,而且这些通常也会执行某种分析反馈,所以它真的很不理想。

没有我的问题:1)假设主机和其他窗口也使用 ::InvalidateRect ,为什么我的优先?2)如何使 ::InvalidateRect 不优先,这意味着窗口需要失效,但可能会更晚,系统的其余部分也必须有时间进行重绘。

提前致谢!

0 投票
3 回答
1611 浏览

delphi - 收到 WM_PAINT 后,VCL/comctl32.dll/USER32.dll/GDI32.dll 中偶尔出现 EAccessViolation

我需要一些建议来调试 Delphi XE2 应用程序中的崩溃。我自己从未见过崩溃——事实上它很少发生,并且不能按需重现。

我们确实有一组来自 MadExcept 的 10 个崩溃报告。这些表明主线程当时正在主窗体的列表视图中处理 WM_PAINT 消息。每种情况下的调用堆栈都没有显示对我自己代码的引用,只有 VCL 代码和 comctl32.dll、ntdll.dll 和 USER32.dll 中的函数。

有问题的列表视图是 TColorListView,它派生自 TCustomListView,并处理 OnCustomDrawItem 和 OnDeletion 事件。但正如我所说,当崩溃发生时,我的 TColorListView 代码都不在调用堆栈上。

在每种情况下,崩溃的实际位置各不相同,但导致崩溃的调用顺序(从早到晚)始终是:

之后,它进入 StdWndProc/SendMessageW/TControl.Perform 之一,从那里每次路径都不同。最终它以 comctl32.dll、USER32.dll、GDI32.dll 或 TControl.WndProc 之一结束,并引发 EAccessViolation。遗憾的是,我没有关于用户当时尝试做什么的信息,因为用户没有填写错误报告的那部分。

您能否建议我可以使用任何“心理调试”技术来尝试确定这次崩溃的原因(并因此修复它)?


更新以回答以下评论中的问题:

在(仅)一个崩溃报告中,它似乎进入了 TListItem.GetIndex 并进一步崩溃了几个堆栈帧。不过,这可能是一个红鲱鱼。

“执行”的消息是什么?对不起,我不知道。MadExcept 没有给我方法参数值;只是方法名称。


5月31日

尽管我更愿意仅从我拥有的信息中找出故障,但我也欢迎对我可以添加到程序中的任何新诊断提出建议,以便如果在下一个版本之后再次发生这种崩溃,我将有更多工作要做. 我很茫然,因为在崩溃时,我可以修改的代码都没有在调用堆栈上。


6月13日

我在 MadExcept 报告中添加了一行,告诉我异常发生时应用程序处于什么状态 - 启动/活动/空闲/ModalDlg/终止。(感谢 Chris Thornton 的评论建议这一点。)我认为在关机期间发生异常的可能性是合理的。不幸的是,直到 2014 年我们才会发布新版本,并且有可能通过新诊断获取错误报告。

0 投票
1 回答
285 浏览

opengl - 带有 VCL 组件的动画 (WM_PAINT)

问题是在 TForm 组件(边框、标题 ..)上单击任何鼠标按钮时 OpenGL 动画停止。只要松开鼠标按钮,动画就会继续。

在更改表单大小时如何不停止动画,任何有用的链接?

0 投票
2 回答
399 浏览

c++ - WM_PAINT 和未完成的 COM 调用(ATL OOP 服务器“死锁”)

我们开发了一个 STA ATL COM OOP 服务器,几乎一切正常。我们面临一个问题:当 COM 客户端通过 Windows 消息在内部获取任何 COM 调用的结果时,可以在等待 COM 调用的应答时处理 WM_PAINT 消息(或我猜的任何其他消息)。这本身可能是一个问题,但最大的问题是,在之前的 COM 调用完成之前,对服务器的所有调用都会失败(HRESULT=0x80010005),这是一个相当大的问题,因为它在我们的应用程序中经常发生。我们无法从绘图中删除 COM 调用。

我已经对此进行了大量研究,但找不到任何关于它的内容(除了这篇2006 年的文章说明了这个问题以及一些无法在我们的案例中应用的解决方案),但我看到的不仅是 WM_PAINT危险的是,我们在任何 Windows 事件(消息)中执行的对服务器的任何调用都可能导致相同的问题。

所以基本上我们可以有不同的解决方案,但不知道要使用哪些 COM 方法或如何使用: 1- 一个等待直到最后一个 COM 调用被处理并返回值的方法 2- 一个知道在服务器和处理 COM 答案的方法(全部从客户端调用) 3- 知道我们是否可以在客户端中实现 IMessageFilter 类以及如何处理它和处理调用等。

谢谢!

0 投票
1 回答
1025 浏览

c++ - 改进 WM_PAINT 和 WM_CTLCOLORSTATIC 处理程序的代码

简介及相关资料:

我已经实现了主窗口背景及其子静态控件的复杂绘制。

下图显示了它的外观。

在此处输入图像描述

静态控件具有SS_NOTIFY样式,这一点很重要,因为当用户单击它们时会发生某些事情。

此时,单击它们时激活的操作是不相关的。

主窗口和静态控件都有渐变背景,这是通过使用GradientFill(...)API 制作的。

主窗口的顶部横幅是用灰色画笔创建的,网格线是用 API 创建LineTo(...)MoveTo(...)

橙色静态控件上的贴图,左上标识为EMF文件,右上标识为PNG文件,其他图片为位图。

橙色静态控件有 4 个子静态控件,它们owner drawn也有SS_NOTIFY样式。

这是我能想到的唯一方法,这使我能够按照要求我的方式绘制控件(如果我可以改进这一点,请提出建议,我会接受任何合理的建议)。

为了绘制橙色静态控件,我决定在WM_CTLCOLORSTATIC处理程序中绘制其背景,并在子类过程中绘制子静态控件。

从子静态控件接收到的通知也在橙色静态控件子类过程中处理,因为我不知道如何将它们转发到父窗口,但由于此时它们也无关紧要而被省略。

我决定提供演示项目的链接,而不是用代码片段让这篇文章变得很长。

我试图提交尽可能小而简单的演示应用程序。

我没有吝啬评论,所以我相信一切都在源代码中得到了很好的涵盖和解释。

如果仍有问题,请发表评论,我会尽快回复(通常是立即回复,或者至少在同一天回复)。

这是演示项目的链接:http ://www.filedropper.com/geotermistgrafika_1

重要更新:

/================================================== ==========/

方括号中的文本是问题的原始部分,但由于项目存在内存泄漏,现在被省略了。上面的链接链接到改进的版本。

[响应成员 xMRi 的评论更新:此链接应该没问题:http ://www.filedropper.com/geotermistgrafika ]

/================================================== ==========/

我在 Windows XP 上工作,使用 MS Visual Studio C++ 和纯 Win32 API。

注意:由于 VS 的 Express 版没有资源编辑器,因此资源文件和资源头是使用ResEdit从此处创建的:http ://www.resedit.net/ 。

问题:

当我调整窗口大小时,静态控件会轻微闪烁。

我为解决问题所做的努力:

我相信我的代码没有内存泄漏 - 因此我怀疑这是问题所在,但由于缺乏经验,如果我的假设能够以某种方式得到证实,我将不胜感激。

我认为我已经妥善处理WM_ERASEBKGND,并且我已经排除了样式CS_VREDRAWCS_HREDRAW从我的窗口类中排除了 - 因此不应该因此而导致闪烁。

我忘了提到,我的窗户有WS_CLIPCHILDREN风格,所以我现在提一下,以回应成员Roger Rowland的评论。

我已经为两个处理程序实现了双缓冲,以避免闪烁。

问题:

  1. 如何修改演示项目中的代码以消除闪烁?

  2. 我需要关于如何优化WM_PAINTWM_CTLCOLORSTATIC处理程序的建议,以便我的绘画代码变得更高效、更快。

第二个问题的小说明:

我正在考虑通过在主窗口的背景上绘制整个图片来改进我的代码,并将透明的静态控件放在与该静态控件背景相对应的图片部分的顶部。

这样,我只会NULL_BRUSH在我的WM_CTLCOLORSTATIC处理程序中返回,并在WM_PAINT.

我在这个想法的正确轨道上吗?这行得通吗?

谢谢你。问候。

0 投票
1 回答
769 浏览

c++ - GradientFill API 未按应有的方式执行

简介及相关资料:

我想创建一个带有渐变背景的静态控件。

我想通过以下方式做到这一点:

在主窗口的背景上创建渐变,然后在该背景上放置透明的静态控件。

为此,我RECT在处理程序中创建了变量,WM_PAINT将渐变定位在静态控制应该在的位置。

此外,我尝试使用双缓冲来避免闪烁(我还处理WM_ERASEBKGND、删除了标志CS_VREDRAWCS_HREDRAW来自窗口类)。

我还处理WM_SIZE了使窗口无效并正确重新定位静态控件的消息。

在我的WM_CTLCOLORSTATIC处理程序中,我返回了NULL_BRUSH.

我通过 Visual Studio 中的应用程序向导制作了一个演示应用程序来说明这一点。

我在 Windows XP 上工作,使用纯 Win32 API 和 C++。

下面我将提交修改后的代码WM_PAINT,以及上面列出的其他处理程序的代码片段:

问题:

当我GradientFill在处理程序中使用 API 时WM_PAINT,屏幕上的矩形比应有的要大。

下图说明了这个结果:

在此处输入图像描述

如果我尝试用一​​些实心画笔填充同一个矩形,一切正常。

下图说明了这个结果:

在此处输入图像描述

我为解决问题所做的努力:

我在设置矩形坐标的地方设置了断点,没有发现任何问题。

此外,GradientFill返回TRUE,所以它不会失败。

问题:

如何解决这个问题?

先感谢您。

问候。

0 投票
1 回答
215 浏览

c++ - 当我改变他的背景时,我失去了按钮的功能

我尝试通过实现子类化每个来源来替换按钮的背景。

当我更改背景时,我得到了一个正方形,无法单击它。有人可以分享一个好的教程或代码示例吗?

无论如何,这是我的代码:

编辑:我将 BS_OWNERDRAW 窗口样式添加到按钮:

我更改了回调,但 WM_DRAWITEM 没有调用:

0 投票
1 回答
566 浏览

cocoa - 使用 InvalidateRect 反复使窗口无效的最佳方法是什么?

我需要反复重绘一个显示某种形式的连续分析的窗口。现在:

1)如果我在画完后在WM_PAINT中这样做,我基本上会杀死其他人的画,所以它不可用。

2)如果我在计时器中这样做,那就有点滞后了。

那么最好的方法是什么,以便频繁地重新绘制窗口,但是当操作系统忙于处理某些数据或通过绘制其他应用程序时,它会降低速率。我一直认为操作系统应该负责在进程之间分配 CPU 功率,让图形处于次要位置,以确保实际处理有足够的时间,但在 Windows 和 Mac 上看起来都不是这样。