【问题标题】:Winforms multi-layer graphics [closed]Winforms多层图形[关闭]
【发布时间】:2015-08-29 18:18:24
【问题描述】:

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

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

有什么建议吗?

【问题讨论】:

  • @HighCore 推荐 WPF 不错,但winforms 并没有被弃用,WPF 也不需要只需要 10% 的时间、代码和精力。

标签: c# winforms gdi+


【解决方案1】:
  • 选项 1:嵌套另一个 Panel 在底部。这对于覆盖包括半透明的图形很有用。 (嵌套的意思是:panel2.Parent = panel1)你可以嵌套很多层。

  • 选项 2:进入PanelBackgroundImage 并使用 表面上进行交互操作。

我注意到您'不想再次划清界限'。这不是你在做图形时通常会说/做/尝试的。如果您对此很认真,请选择选项 2!

请参阅here 了解将控件和进入位图的区别,here 了解使用选项 2 将十字显示为光标在位图上方。

顺便说一句,这两个选项并不相互排斥:您可以将PanelsBackgroundImages 嵌套并在最上面绘制交互式内容..

【讨论】:

  • 透明度在 Windows 窗体中效果不佳,特别是当您通过独立事件重绘每一层时。解决方案是在绘制第二层之前保留第一层的“副本”。重新绘制时,复制保存的图像并进行第二次绘制。
  • True 用于 重叠 控件。但是 嵌套 控件在 Winform 的伪造透明度下工作得很好。
  • @TaW - 快速反应:)。我什至没有完成我的评论,因为我经常在 [Enter] 键上键入 CR,这会触发我的评论的早期验证...
  • 抱歉 ;-) - 在 Paint 事件中绘制和绘制到图像中的平衡主要取决于要绘制的项目数量。如果这是未知的,最好的做法是保持动态..
  • 谢谢你们!我在考虑嵌套控件,但不确定透明度。
【解决方案2】:

@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 控件没有双缓冲,会闪烁。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-23
    • 2018-01-13
    • 2015-01-16
    • 2012-11-25
    • 2019-04-14
    • 1970-01-01
    • 1970-01-01
    • 2014-04-27
    相关资源
    最近更新 更多