问题示例: 我有一个控件确实绘制一些几何形状(我使用面板)。 我画了一条线。 现在,当我将光标移动到其中一个行提示时,我希望该点被突出显示" (围绕它绘制一个实心圆圈)。 当我将光标移开点时,我想要"突出显示"要删除的圆圈,但我不想重新划线。
所以,从技术上讲,我需要两层: 第一层绘制我的线。 用于绘制/擦除高光的第2层。 每次在第二层中绘制/删除某些内容时,我不希望重绘第一层。
有什么建议吗?
答案 0 :(得分:1)
选项1:嵌套另一个Panel
位于底部。这适用于覆盖包括半透明度的图形。 (嵌套意味着:panel2.Parent = panel1
)如果您愿意,可以嵌套多个图层。
选项2:将绘制到 BackgroundImage
的{{1}}中,并使用绘图到表面上进行交互。
我注意到你'不想再画线'。这不是你在做图形时通常会说/做/尝试的。如果你认真对待这个,请选择2!
请参阅here,了解将绘制到控件和转换为位图和here之间的差异,以获取使用选项2显示的另一个示例一个十字作为位图上方的光标。
顺便说一下,这两个选项并不相互排斥:您可以将Panel
与Panels
嵌套,并在最顶层的东西上绘制互动内容。
答案 1 :(得分:0)
静态绘图:
private Bitmap myStaticImage;
public Form2()
{
InitializeComponent();
this.myStaticImage = new Bitmap(200, 100);
Graphics g = Graphics.FromImage(this.myStaticImage);
g.DrawLine(Pens.Red, new Point(0, 0), new Point(200, 0));
this.panel1.BackgroundImage = this.myStaticImage;
}
对于动态绘图:
private void panel1_Paint(object sender, PaintEventArgs e)
{
// Stuff
}
我建议使用PictureBox
或UserControl
并将DoubleBuffered
属性设置为true。 Panel
控件不是双缓冲的,会闪烁。