カスタム描画 System.Windows.Form.Control オブジェクトにイベントをどれだけ追加できるかを確認するためのテスト プログラムを作成しています。これでうまくいけば、後でもっと高度なものを作ることができます。
私が抱えている問題は、添付の画像を扱っています。2 つの円を意図的に近づけて描きました。目標は、1 つの円を別の円に重ねることです。このテスト プログラムでは、どの円がどの円に重なるかは気にしません。でも、角が気になる。
上の画像は、中央の円が左の円に埋もれていることを示していますが、左の円も角を描き、中心の円を覆っています。それらのコーナーを非表示にするか、少なくとも透明にしたいと考えています。コントロールを透明にする方法があることを読みましたが、BackColor で Color.Transparent を使用すると、ペイント パネルの色と一致するのではなく、何らかの理由で黒くなりました。
以下は GUI のコード部分です (デザイナーは含まれていませんが、重要な部分は明らかです)。
namespace PaintingFirstAttempt
{
using System;
using System.Drawing;
using System.Windows.Forms;
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void BtnExit_Click(object sender, EventArgs e)
{
this.Close();
}
private void BtnClear_Click(object sender, EventArgs e)
{
Graphics g1 = this.paintPanel.CreateGraphics();
g1.Clear(this.paintPanel.BackColor);
g1.Dispose();
}
private void PaintPanel_MouseDown(object sender, MouseEventArgs e)
{
this.paintPanel.Controls.Add(new EventableCircle { Location = new Point(e.X - 16, e.Y - 16), Size = new Size(32, 32) });
}
}
}
以下はカスタムサークルです。
namespace PaintingFirstAttempt
{
using System;
using System.Drawing;
using System.Windows.Forms;
public class EventableCircle : Control
{
public EventableCircle()
{
this.SetStyle(ControlStyles.SupportsTransparentBackColor, true);
// this.BackColor = Color.Transparent;
}
private static SolidBrush fillColor = new SolidBrush(Color.Red);
protected override void OnClick(EventArgs e)
{
MessageBox.Show("TODO: Bring up a combo box on right click.");
}
private void DrawCircle(Pen pen)
{
Graphics g = this.CreateGraphics();
g.Clear(this.BackColor);
g.FillRectangle(new SolidBrush(Color.Transparent), 0, 0, 32, 32);
g.FillEllipse(fillColor, 0, 0, 32, 32);
g.DrawEllipse(pen, 0, 0, 32, 32);
g.Dispose();
}
protected override void OnPaint(PaintEventArgs e)
{
this.DrawCircle(Pens.Black);
}
protected override void OnMouseEnter(EventArgs e)
{
base.OnMouseEnter(e);
this.DrawCircle(Pens.Blue);
}
protected override void OnMouseLeave(EventArgs e)
{
base.OnMouseLeave(e);
this.DrawCircle(Pens.Black);
}
}
}
この情報を念頭に置いて、円の角が表示されないようにする方法、またはこれを回避する方法を見つけるにはどうすればよいですか?