我正在制作一个测试程序,看看我可以如何将事件添加到自定义绘制的 System.Windows.Form.Control 对象。如果我做得好,那么我可以为以后做一些更高级的东西。
我遇到的问题与附加图像有关。我有目的地画了两个圆圈,它们彼此靠近。目标是让一个圆圈与另一个圆圈重叠。出于本测试程序的目的,我不在乎哪个圆圈与哪个圆圈重叠。但是,我确实关心角落。
上图显示中心圆被左圆掩埋,但左圆也在画角并用它们覆盖中心圆。我希望隐藏这些角落,或者至少让它们透明。我确实读到有一种方法可以使控件变得透明,但是由于某种原因在 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);
}
}
}
考虑到这些信息,我如何才能让圆圈的角不显示,或者找到解决这个问题的方法?