【发布时间】:2014-10-24 13:18:09
【问题描述】:
我需要在 Winform 中绘制矩形,如下图:
我也应该更清楚。我想实现这种情况:假设有一个类似“ABCDEFG”的文本当用户单击 B 字母时,我想为该字母和连续的 3 个字母添加一个带颜色(突出显示)的背景矩形(在这种情况下,我想突出显示 BCD)。
在我尝试过的方法中:
for (int i = 0; i < 5; i++)
{
letterArea = new Rectangle(rectStartX, rectStartY, (int)Math.Ceiling(charSize.Width), (int)Math.Ceiling(charSize.Height));
rectStartX += (int)Math.Ceiling(charSize.Width);
}
我在这个方法的最后调用 Invalidate()。在 OnPaintBackGround 我有这些行:
Rectangle rectContent = vsr.GetBackgroundContentRectangle(e.Graphics, this.ClientRectangle);
e.Graphics.FillRectangle(new SolidBrush(Color.Red), letterArea);
其中 letterArea 是一个类字段。我在另一个问题中读到,在循环中调用 Invalidate() 并不能保证调用 OnPaintBackground。我对计算坐标不感兴趣,相反,我对必须绘制矩形的方法以及在哪里调用 Invalidate() 以及什么是有效的解决方案感兴趣? 提前谢谢。
【问题讨论】:
-
Invalidate 将绘制消息发送到窗口。 Paint 分别发送一个 erasebackground。在循环中发送一个或 1000 个无效不会改变任何东西。最后只会发送一条绘制消息。在 paint 中绘制是常见的做法
-
在循环中调用 Invalidate() 并不能保证调用 OnPaintBackground。 是的。可能不会立即,也不会比必要的更频繁,但您可以放心地依靠控件来绘制。
-
在您的方法中,您创建了多个 Rectangle,但您没有对它们做任何事情?如果您将它们添加到类级别 List
您的绘画事件可以使用它来填充它们中的每一个.. -
这会有效还是解决问题的正确方法?还是只是一个解决方案?
-
这样就好了。甚至没有理由考虑这个级别的效率..这是最好的方法吗?不知道,因为坦率地说,你没有很好地描述这个问题。你给我们展示了一张漂亮的图片,但它没有任何字母,那么它是什么关系??
标签: c# winforms user-interface drawing rectangles