【问题标题】:How to make graphics created with CreateGraphics() always visible on control without flickering如何使使用 CreateGraphics() 创建的图形在控件上始终可见而不闪烁
【发布时间】:2015-01-28 11:59:12
【问题描述】:

我有自定义控件。我在那里定义了 OnPaint() 事件。假设它是一个文本编辑控件。我想显示自定义插入符号覆盖。 我用 CreateGraphics() 创建了一个 Graphics 对象。 如果在每个闪烁计时器滴答声上,我调用绘制插入符号的代码 - 它是可见的。 在 OnPaint() 中进行一些绘画后,我的插入符号消失了。它可以重绘,但是当我尝试将 DrawCaret() 调用放在主 OnPaint() 处理程序的末尾时,什么也没有发生。 插入符号未绘制,或者已绘制并清除。

在代码中的不同位置强制 DrawCaret() 充其量会导致难看的闪烁,最坏的情况是什么也不会。 当我在 blinkTimer_Tick() 事件处理程序中有 DrawCaret() 时 - 它已被绘制,但它不规则地闪烁。

不,我不想使用 Win32 Caret - 它的颜色无法设置。我需要自己绘制插入符号,并且它必须闪烁。

如果它必须闪烁,我假设我不能使用控件的 OnPaint() 事件处理程序。

【问题讨论】:

  • 从 CreateGraphics() 获得的 Graphics 对象直接将像素溅到屏幕上。它们永远不会持续很长时间,油漆会再次擦除它们。所以丢失假插入符号是很正常的。很难猜测您的代码可能还有什么问题。应该有很多,创建一个TextBox的替代品并不是那么简单。只是找到合适的位置来绘制插入符号并恢复过度绘制的抗锯齿像素,所有这些都没有闪烁,这已经是一件令人头疼的事情了。
  • 嗯,你是对的。我放弃了使用单独的 Graphics 对象的想法。我将插入符号绘图移至主要的 OnPaint 事件,它具有魅力。我不是从头开始构建控件,我正在修复 FTCB ;) 完成,测试,添加拉取请求 :)

标签: .net winforms


【解决方案1】:

我的错。这似乎是一个非常糟糕的方法。我已将插入符号绘图移至主 OnPaint() 并且它具有魅力。

我有点担心 Invalidate() 我称每个插入符号为“闪烁”,如果我创建插入符号作为子控件会怎样?更轻还是更重?我想我不会测试它,当前的解决方案显示没有 CPU 或 GPU 负载。

【讨论】:

  • 使用 Invalidate(Rectangle) 重载
  • 这正是我所做的 ;) 但无论如何,都会调用 OnPaint(即使它没有在整个控件的表面上绘制)。功能齐全的文本编辑器的 OnPaint 相当繁重。所以我必须用子控件检查方法。
猜你喜欢
  • 2018-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-11
  • 1970-01-01
相关资源
最近更新 更多