2016-10-22 6 views
-2

私はWinFormsアプリケーションを持っています。特定の領域の上に円をプログラムで描きたいと思っています。私はいくつかの問題に直面しており、どんな洞察も高く評価されます!フォームの上に円を描く

1)私は円を描き、クリアするためのコードを持っていますが(下を参照)、サークルはすべてのコントロールの背後に描かれています。どのような場合でも、彼らを「最上位」として描きたがっています。これはどうすればいいですか?

2)私のアプリが起動したら、すぐに描画する必要があるサークルがいくつかあります。 Form Loadイベントで描画してみましたが、無駄です。しかし、ここ(Form graphics not set when form loads)については、Paintイベントで描画しています。これは合理的にうまくいきますが(初めてのことを確認するブールで)、this.Invalidate();(円が描画されていないため)に問題があるようです。より良い方法がありますか?あなたの条件を達成するように複雑で、まだ動作していないアプローチの

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.ペイントイベントから(フォームロードではなく)コードを呼び出す必要があります。そのため、ウィンドウが画面の更新を必要とするときに常に正しく更新されます。 2.フォームには独自のペイントルーチンを持つコントロールがあることを忘れないでください。インクをきれいにします。コントロールのペイントイベントに登録し、コントロールに描画することができます。今度は、フォーム上のすべてのコントロール(Zオーダーゼロ)をオーバーレイしてそこにサークルを描画するusercontrolを作成することもできますが、次にイベントをUserControlの下のコントロールに渡すロジックが必要です。簡単な解決策はありません。 – Vikhram

答えて

2

つのカスタム透明パネルを作成することとの上にそれを置くことができます:ここに私のコードは、(コンボボックスの屈折率の変化にparseText実行が)です赤い円が描画される場所を制御します。あなたは、いくつかの基本を理解する必要が

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();'を入れることができます) – derekantrican

+0

'TabControl.TabPages [0] .Paint'を購読して、' transparePanel.Refresh(); 'を呼び出すことができます。 –