【发布时间】: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 ;) 完成,测试,添加拉取请求 :)