问题标签 [onpaint]

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 投票
3 回答
8908 浏览

c# - (C#) graphics.drawImage 有大小限制吗?如何处理?

我试图显示一些数据的非常大的图形表示。我正在使用位图来持久存储图像并e.Graphics.DrawImage(myBitmap, new Point(0,0))在我的表单上的 PictureBox 控件的 onPaint 中。我注意到(并且在其他网站上听说过)如果我的图像的高度或宽度大于 2^15,我会得到一个Parameter not Valid例外,但我还没有找到任何有关此限制的官方文档。

这个 2^15 图像大小限制是 的明确的官方部分Graphics.DrawImage吗?是否有任何简单的解决方法可以将我的整个图像渲染到表单上?

(是的,pictureBox 设置为与图像相同的大小,或者更大。不过,附带的问题是,我应该只使用表单本身的 onPaint 而不是图片框吗?)

0 投票
2 回答
1481 浏览

c# - Onpaint 事件(无效)在一段时间正常操作(运行时)后更改执行顺序

我有 3 个通过其绘制事件绘制的数据图。当我有需要插入图表的数据时,我调用控件 invalidate() 命令。

第一个控件的绘制事件实际上为其他 2 个图形创建了一个位图缓冲区,以避免重复长循环。

因此,无效命令按特定顺序 (1,2,3)。这很有效,但是当图形数据到达图形窗口 (PictureBox) 的末尾时,数据通常会开始滚动,绘制事件开始以错误的顺序 (2,3,1) 触发。

有没有人遇到过这个?为什么会发生这种情况?

0 投票
1 回答
726 浏览

c# - visual c# - onPaint 和透明度

我正在制作一个带有两个半透明文本的简单表格,并将其放入绘画事件中。只是,当我扩大表格时,文本会变得更暗和有颗粒感。实际上我想要更深的颜色而不是颗粒感。

这是我的代码片段:

提前致谢

0 投票
2 回答
557 浏览

c# - GDI+在窗体上绘制多个矩形遇到的问题

我想使用 GDI+ 在 C# Windows 窗体中绘制表格。当矩形的数量太大而无法在表单上显示所有矩形时,它不会滚动。并且不能访问那些不适合表格的人。

我需要做什么才能看到我在表格上绘制的所有内容?

谢谢。

0 投票
2 回答
421 浏览

c# - 不断增长的用户控制不更新

我正在使用 C# 和 .Net 2.0 进行开发。我有一个用户控件,它根据最大单元格数绘制单元格(列)。有一些绘图例程可以生成必要的单元格。有一个属性 NumberOfCells 可以调整这个控件的高度;CELLHEIGHT_CONSTANT * NumberOfCells。OnPaint() 方法被覆盖(绘制单元格数的代码)。

还有另一个用户控件包含一个面板,该面板包含上面的 userControl1。有一个属性 NumberCells 可以更改 userControl1 的 NumberOfCells。

然后将 UserControl2 放置在 Windows 窗体上。在该表单上有一个 NumericUpDown 控件(仅从 1 递增)。当用户增加 1 时,我也将 VerticalScroll.Maximum 调整为 1。

一切运行良好,但当我增加一次时,面板更新正常(必要时插入垂直滚动)但未添加单元格!我已经尝试在 userControl2 和表单上无效,但似乎没有任何东西可以绘制新添加的单元格。

任何帮助表示赞赏。先感谢您。

  • 劳伦斯
0 投票
1 回答
816 浏览

c# - 表单下方时回调期间的 OnPaint 事件?

想象以下场景:

现在,OnePanelInThisForm 在表单加载时正确绘制。但如果 SomeEventOcurred 是从“SomeForm”触发的,则不会触发绘制事件。如果我关闭并重新打开表单,它会正确重绘。如果我在执行的表单中添加一个按钮: OnePanelInThisForm.Invalidate(); 面板正确重绘。

我错过了什么?

更新:澄清。(我们为什么不首先这样做……)

我有一个 FORM_A。这个 FORM_A 有一个面板,它覆盖了 Paint 事件。这是一个标准的 WinForm。在 Paint 中它画了一个圆圈。这行得通。原来 FORM_A 有一个打开 FORM_B 的按钮。但在此之前,它订阅了 FORM_B 中的一个自定义事件,称为:SomeEvent。(参见上面的示例)。所以 FORM_B 可以告诉 FORM_A 关于“SomeEvent”。

现在,FORM_B 也是一个普通的 WinForm。它有一个普通的按钮。在该按钮的 Click 事件中,它会打开 FORM_C。FORM_C 也有一个名为 SomeEvent 的事件,显然 FORM_B 订阅了该事件。和以前一模一样。这个想法是 FORM_C 有一个按钮可以触发该事件,通知感兴趣的订阅者。在这种情况下,当 FORM_C 触发事件时,FORM_B 被订阅并感兴趣。

当 FORM_B 收到回调时,它唯一要做的就是……通知相关方(在本例中为 FORM A)该事件已被触发。

现在,即使 Form C 仍然是顶层表单,调用堆栈也会返回到 FormA,返回到定义为第一个事件的回调的方法。

此代码执行。它所做的只是 somePanel.Invalidate()(或 Refresh(),结果相同)。

该面板的 PAINT 方法中的断点表明代码没有被调用。尽管无效,但没有引发 Paint 事件。我认为发生这种情况是因为表单(以及面板)实际上被 FORMB 和 FORMC(仍然打开)覆盖。

就这样。如果我关闭表格 C 然后关闭表格 B,表格 A 仍然不会引发绘制事件。我已经尝试使表单激活面板无效,但这并没有发生。

如果我关闭表单 A 并重新打开它,那么绘图当然是正确的。

希望这能让它更清楚。

代码并不多,因为这很简单,FORM A > B > C(火灾事件)-> B -> A -> Invalidate()。

0 投票
2 回答
753 浏览

c++ - Windows 中的 Paint 事件中的异常和访问冲突

在执行了一些新代码后,我的 C++ 应用程序开始表现得很奇怪(屏幕更新不正确或不完整,有时根本没有屏幕更新)。一段时间后,我们发现新代码导致了访问冲突。奇怪的是,应用程序只是继续运行(但屏幕更新不正确)。

起初我们认为问题是由“try-catch(...)”构造引起的(由一位过度活跃的前同事放在那里),但几个小时后(仔细检查调用堆栈,添加许多断点,... ) 我们发现,如果在绘制事件中存在访问冲突,Windows 会捕获它,并继续运行应用程序。

  • 这是正常行为吗?
  • Windows 在绘制事件期间捕获异常/错误是否正常?
  • 有没有办法禁用它?(如果不是,这意味着我们必须始终在调试器中运行,并在测试代码时启用所有异常)。

编辑:

  • 在 XP 上,正确的崩溃(访问冲突后想要的行为)
  • 在 Vista 和 Windows 7 上,应用程序继续运行
0 投票
4 回答
32155 浏览

c# - 如何在 C# 中有效地在桌面上绘图?

我想在 C# 中直接在桌面上绘制。经过一番搜索,我最终使用了桌面 HDC 中的图形对象(空)。然后,我使用此 Graphics 对象正常绘制。

问题是当屏幕的任何部分被重绘时我的形状会丢失。我尝试了一个 While 循环,但它实际上最终以尽可能快的速度绘制应用程序,这不是桌面的更新速率。

通常,我需要将我的绘图代码放在“OnPaint”事件中,但桌面不存在这样的事情。

我该怎么做?

示例代码:https ://stackoverflow.com/questions/1536141/how-to-draw-directly-on-the-windows-desktop-c

0 投票
1 回答
1062 浏览

c++ - 在分层窗口上调用 InvalidateRect 后在 OnPaint 中获取空的更新矩形

我试图弄清楚为什么当我在透明窗口上调用 InvalidateRect 时得到一个空的更新矩形。这个想法是我在窗口上绘制了一些东西(它被临时切换为绘图的 alpha 为 1/255),然后我将其切换到完全透明模式(即 alpha 为 0)以便与桌面&能够在桌面顶部的屏幕上移动绘图。

当我尝试移动绘图时,我得到了它的边界矩形并使用它来调用 InvalidateRect,如下所示:

InvalidateRect(m_hTarget, &winRect, FALSE);

我已经确认 winRect 确实是正确的,并且 m_hTarget 是正确的窗口并且它的矩形完全包含 winRect。

我进入与 m_hTarget 对应的类中的 OnPaint 处理程序,该处理程序派生自 CWnd。在那里,我创建了一个 CPaintDC,但是当我尝试访问更新矩形 (dcPaint.m_ps.rcPaint) 时,它始终是空的。这个矩形被传递给一个函数,该函数确定我们是否需要更新屏幕(在透明窗口的情况下使用 UpdateLayeredWindow)。

如果我在这里硬编码一个非空矩形,其余代码可以正常工作并且我可以在屏幕上移动绘图。

我尝试在 InvalidateRect 中将“FALSE”参数更改为“TRUE”,但没有任何效果。我还尝试使用标准 CDC,然后在我的 OnPaint 处理程序中使用 BeginPaint/EndPaint 方法,以确保 CPaintDC 没有做奇怪的事情……但我得到了相同的结果。

我使用的代码最初是为不透明的窗口设计的。如果 m_hTarget 对应于一个不透明的窗口,则同一组函数调用会导致将正确(即非空)矩形传递给 OnPaint。但是,一旦窗口分层,它似乎就不能正常工作。

0 投票
1 回答
701 浏览

compact-framework - NETCF - 优化重绘 (onPaint)

我想请教如何优化 Compact Framework 中的重绘?GetHashCode() 没有帮助,因为它总是返回不同的哈希码。

无论如何,我有一个程序,您可以在运行时拖动对象并调整其大小。该对象是一个透明对象,它有一个 PNG 图像,该图像还可以相对于对象客户端大小动态调整大小。

虽然我注意到,(例如,我有 4 个透明对象并且我正在拖动或调整一个对象的大小)所有 4 个都会触发 OnPaintBackground,即使 3 个没有移动。另一个当我只是点击一个对象时..它仍然会触发 onPaintBacground()。无论如何,当这个事件被触发时,我没有问题。

我喜欢做的是优化,这意味着我只需要在必要时重新绘制对象。

各位大侠能给个建议吗?

这是我的伪 C# 代码

提前致谢。