Winforms多层图形

时间:2015-08-29 18:18:24

标签: c# winforms gdi+

问题示例: 我有一个控件确实绘制一些几何形状(我使用面板)。 我画了一条线。 现在,当我将光标移动到其中一个行提示时,我希望该点被突出显示" (围绕它绘制一个实心圆圈)。 当我将光标移开点时,我想要"突出显示"要删除的圆圈,但我不想重新划线。

所以,从技术上讲,我需要两层: 第一层绘制我的线。 用于绘制/擦除高光的第2层。 每次在第二层中绘制/删除某些内容时,我不希望重绘第一层。

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

  • 选项1:嵌套另一个Panel位于底部。这适用于覆盖包括半透明度的图形。 (嵌套意味着:panel2.Parent = panel1)如果您愿意,可以嵌套多个图层。

  • 选项2:将绘制到 BackgroundImage的{​​{1}}中,并使用绘图表面上进行交互。

我注意到你'不想再画线'。这不是你在做图形时通常会说/做/尝试的。如果你认真对待这个,请选择2!

请参阅here,了解将绘制到控件和转换为位图和here之间的差异,以获取使用选项2显示的另一个示例一个十字作为位图上方的光标。

顺便说一下,这两个选项并不相互排斥:您可以将PanelPanels嵌套,并在最顶层的东西上绘制互动内容。

答案 1 :(得分:0)

@TaW几乎回答了它。我举了一个例子:

静态绘图:

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
}

我建议使用PictureBoxUserControl并将DoubleBuffered属性设置为true。 Panel控件不是双缓冲的,会闪烁。