问题标签 [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.
c# - GDI+ 的定时器问题
我目前遇到了 GDI 和计时器的一个非常奇怪的问题。
首先是代码:
我在这里尝试将绘制的图形在特定时间移动到左侧的 1 个“图形单元”。所以我使用了一个计时器,它会以小步骤改变偏移量,所以这将是一个平滑的移动(这就是 refreshRate )。
在第一个视图中,此代码有效,但后来我发现以下问题:如果我使用 1 (1Hz) 的刷新率,它将以 1 步 1(图形单元)向左移动我的图形。如果我增加刷新率,我的动作会变慢。在 20 FPS 时它有点慢,在 200 FPS 时它真的很慢..
所以这是我尝试的:
我使用了 Refresh 或 Update 而不是 Invalidate
我使用普通线程(带睡眠)而不是计时器
两个代码更改都没有改变结果..
除了用定时器移动之外,我还可以用鼠标移动图形,如果定时器正在运行,我仍然可以用鼠标平滑地移动图形。所以这不是性能问题..
想到画队列有问题,因为我刷新比画完还快?(但为什么我可以用鼠标平滑地移动图形?!)
所以我需要一点帮助。谢谢
c# - OnPaint、Invalidate、Clipping 和 Regions 的最佳实践
我有一个用户控件,其中包含许多自己绘制的对象的完全自定义绘制的图形(从 OnPaint 调用),背景是一个大位图。我内置了缩放和平移功能,画布上绘制的对象的所有坐标都在位图坐标中。
因此,如果我的用户控件是 1000 像素宽,位图是 1500 像素宽,并且我以 200% 的缩放比例缩放,那么在任何给定时间我只会看到位图宽度的 1/3。如果您滚动到最左边,一个从位图上的点 100,100 开始的矩形对象将出现在屏幕上的点 200,200 处。
基本上我需要做的是创建一种仅重绘需要重绘的有效方法。例如,如果我移动一个对象,我可以将该对象的旧剪辑矩形添加到一个区域,并将该对象的新剪辑矩形合并到同一区域,然后调用 Invalidate(region) 重绘这两个区域。
然而,这样做意味着我必须不断地将对象位图坐标转换为屏幕坐标,然后再将它们提供给 Invalidate。我必须始终假设 PaintEventArgs 中的 ClipRectangle 位于屏幕坐标中,以防其他窗口使我的窗口无效。
有没有办法可以利用 Region.Transform 和 Region.Translate 功能,这样我就不需要从位图转换为屏幕坐标?在某种程度上它不会干扰在屏幕坐标中接收 PaintEventArgs?我应该使用多个区域还是有更好的方法来完成这一切?
我现在正在做的示例代码:
在 OnPaint()...
c# - 有没有办法捕捉整个屏幕重绘事件?(windows, c#)
有没有办法捕捉整个屏幕重绘事件?(windows, c#)
我只想在屏幕更新后才执行 CopyFromScreen,而不是按计时器。
vb.net - 覆盖 datetimepicker vb.net
当属性 _clearOnDisabled 为真时,我想覆盖 datetimepicker 对象以删除文本。当 _readOnly 属性为真时,我想以黑色而不是灰色显示文本。
所以我尝试使用 WndProc,但我似乎每个对象都通过我的函数,而不仅仅是我的 datetimepicker。当我输入 WM_PAINT 消息时,我得到了 100% 的 CPU。我也试图覆盖 OnPaint 但它没有进入。
谢谢帮助
c# - Java的OnPaint()?
好吧,真正的快速问题。我知道 C# Forms 具有 OnPaint() 方法,该方法在渲染时会不断被调用。我知道 Java 也有类似的,但我不知道如何实现它。任何指针或示例(首选)将不胜感激。非常感谢。
.net - 为 Windows.Forms.Control 覆盖 OnPaint 闪烁?
我创建了一个新控件并覆盖了 OnPaint 事件:
问题是当我改变弹药然后所有的控制轻弹。
看起来不太好。
无论如何,让我在这条线上画的线:
只是在弹药变化时消失?
c# - Graphics.Draw*、自动滚动和剔除
我在 C#/Winforms 中实现了一个自定义控件,它执行语法高亮和自动完成等操作。我正在使用 AutoScroll 来管理滚动,并且效果很好。
目前我根本没有优化(当然优化很重要,但我是最后做的;功能是我首先追求的),我正在渲染巨大的文档,每个按键都会重新解析受影响的行以确保语法高亮是一致的。
现在,在我的大肉绘制方法中,我正在绘制每个字符串、关键字等,即使它在剪辑区域之外。但是,无论文档有多大以及我有多少关键字/突出显示的位和片段的组合,它仍然运行得非常快,内存和 CPU 开销并不多。
所以我的问题 - Graphics.Draw* 方法是否进行任何类型的剔除?例如:如果 AutoScrollPosition 位于文档下方并且我 Graphics.DrawString(在绘图区域外插入一些坐标),是否有任何实际工作正在完成?另请注意,我在 VM 内的 Win 7 上运行 VS,它仍然运行得很快。并不是说它现在是一个问题,但是在以后的优化阶段请记住这一点会很好。:D
干杯,亚伦
c# - OnPaint 无法正确绘制
Visual Studio 2008 SP1 C# Windows 应用程序
我正在直接在主窗体上书写和绘图,并且在重新绘制屏幕时遇到问题。在程序启动时,屏幕正确绘制。在 3-4 秒内再出现两条绘制消息(屏幕上没有动作或动作),并且使用屏幕坐标(我认为)而不是客户端坐标绘制屏幕。原始字符串不会被删除。
为了将问题简化为最简单的形式,我启动了一个新的 C# windows 应用程序。除了在主窗体上绘制一个字符串之外,它什么也不做。(见下面的代码片段)如果你启动程序,字符串会出现,然后第二个字符串会出现在上面和左边。如果您重新启动程序并将窗体移到屏幕的左上角,两个字符串将几乎重合。这就是为什么我认为第二次绘画使用屏幕坐标的原因。
这是代码 - 提前感谢您提供的任何帮助。
c++ - MFC 自定义 OnPaint 未被可靠调用
我继承了一个 MFC 应用程序,它有一个窗口,其中有几个所有者绘制的小部件,这些小部件可以响应OnPaint
并执行各种绘图。
我注意到,为了强制控件重绘以响应各种用户操作,有以下代码:
我认为这可以简化如下:
但是,在实践中,当我这样做时,控件有时会绘制,但有时不会绘制。具体来说,当我与窗口中的控件交互时,有时myControl
最终只会画成纯灰色。我将代码改回更复杂InvalidateRect
的样式,它再次运行良好。
为什么这里会有区别?
mfc - MFC 对话框在耗时的 OnPaint() 后消失
在我们的应用程序中,我们有一个 MFC 对话框,可以打开并处理一些需要显示的数据。因此,处理是在 OnPaint() 事件中延迟启动的。处理需要一些时间(大约 20-30 秒),并且完全是算法(不调用 UI API)。发生的情况是,有时在处理完成后窗口“消失”。我们发现它被带到了父窗口(主框架)后面。
在处理完成后立即调用 SetForegroundWindow() 或在非 UI 线程中执行处理(让 OnPaint() 在合理的时间内完成)已经消除了问题。
这个问题已知吗?OnPaint() 执行是否有任何定义的时间限制?
谢谢,
亚历克斯。