2016-10-22 78 views
-2

我有一个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

你需要了解一些基本知识。 1.您需要从Paint Event(不是来自表单加载)调用代码,以便在窗口需要刷新屏幕时始终正确更新。记住,表单将有控件,它们有自己的绘画例程。这将清除你的墨水。您可以注册控件的绘画事件并绘制控件。现在,您还可以创建一个覆盖表单上所有控件(Z-Order of zero)的用户控件,并在那里绘制您的圆圈,但您需要逻辑将事件传递到UserControl下方的控件。没有简单的解决方案。 – Vikhram

回答

2

一个不那么复杂,但工作完成你的要求的方案可以作为创建自定义的透明面板,并将其放置在顶部控制红圈将被绘制的位置。

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void DrawCircle(int x, int y, int transparency, Graphics graphics) 
    { 
     if (transparency < 0) 
      transparency = 0; 
     else if (transparency > 255) 
      transparency = 255; 

     SolidBrush brush = new SolidBrush(Color.FromArgb(transparency, 255, 0, 0)); 

     graphics.FillEllipse(brush, new Rectangle(x, y, 25, 25)); 
     brush.Dispose(); 
     graphics.Dispose(); 
    } 

    private void TransparentPanel1_Paint(object sender, PaintEventArgs e) 
    { 
     DrawCircle(10, 10, 255, e.Graphics); 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     transparentPanel1.Enabled = false; 
     transparentPanel1.Paint += TransparentPanel1_Paint; 
     transparentPanel1.BringToFront(); 
    } 
} 

public class TransparentPanel : Panel 
{ 
    protected override CreateParams CreateParams 
    { 
     get 
     { 
      CreateParams cp = base.CreateParams; 
      cp.ExStyle |= 0x00000020; // WS_EX_TRANSPARENT 
      return cp; 
     } 
    } 
    protected override void OnPaintBackground(PaintEventArgs e) 
    { 
     //base.OnPaintBackground(e); 
    } 
} 

enter image description here

+0

所以我已经实现了你的建议,它似乎工作很好,除了我有一个选项卡控制 - 选项卡控件似乎重写transparentPanel的“BringToFront”(并没有似乎是tabControl的绘画事件我可以放一个'transparentPanel.BringToFront();'in) – derekantrican

+0

你可以订阅'TabControl.TabPages [0] .Paint'并调用'transparePanel.Refresh();' –