我有一个WinForms应用程序,我想以编程方式在某些区域顶部绘制圆圈。我遇到了几个问题,任何见解都将不胜感激!在窗体顶部绘制圆形
1)我有绘制和清除圆圈的代码(见下面),但是圆圈被绘制在我所有的控件后面。我希望它们在每种情况下都被视为“最高级”。我该怎么做呢?
2)当我的应用程序启动时,我会有一些需要马上绘制的圈子。我试图在Form Load事件上绘制它们无济于事。但是在这里(Form graphics not set when form loads)我现在正在绘制Paint事件。虽然这工作相当不错(用一个布尔,以确保它只有它第一次),它似乎有问题this.Invalidate();
(因为没有画圈)。有没有更好的办法?这里是我的代码(parseText
上具有ComboBox的指数变化运行):
private void parseText()
{
this.Invalidate();
List<string> lines = new List<string>(richTextBoxRaw.Text.Split(new string[] { Environment.NewLine}, StringSplitOptions.RemoveEmptyEntries));
foreach (string s in lines)
{
switch (s)
{
case "<draw1>":
drawCircle(107, 26, 25);
break;
default:
break;
}
}
}
private void drawCircle(int x, int y, int transparency)
{
if (transparency < 0)
transparency = 0;
else if (transparency > 255)
transparency = 255;
SolidBrush brush = new SolidBrush(Color.FromArgb(transparency, 255,0,0));
Graphics graphics = this.CreateGraphics();
graphics.FillEllipse(brush, new Rectangle(x, y, 25, 25));
brush.Dispose();
graphics.Dispose();
}
private void Form1_Paint(object sender, PaintEventArgs e)
{
if (starting)
parseText();
starting = false;
}
你需要了解一些基本知识。 1.您需要从Paint Event(不是来自表单加载)调用代码,以便在窗口需要刷新屏幕时始终正确更新。记住,表单将有控件,它们有自己的绘画例程。这将清除你的墨水。您可以注册控件的绘画事件并绘制控件。现在,您还可以创建一个覆盖表单上所有控件(Z-Order of zero)的用户控件,并在那里绘制您的圆圈,但您需要逻辑将事件传递到UserControl下方的控件。没有简单的解决方案。 – Vikhram