C# 如何为用户提供在自定义控件上始终绘制附加控件的可能性

C# 如何为用户提供在自定义控件上始终绘制附加控件的可能性,c#,winforms,custom-controls,paint,C#,Winforms,Custom Controls,Paint,为了简单起见,我们假设有一个具有完全个性化图形的自定义控件,该控件也包含在一个面板内(图片中有黑色细边框): 现在,自定义控件应该为用户提供一种机制来进一步个性化它。例如,假设用户需要在其上绘制红色垂直线(见图)。该行部分位于用户控件背景上,部分位于面板上。与现在一样,通过使用control_paint事件,用户最终将在面板下方进行绘制 在类似情况下,您有什么建议可以让用户的生活更轻松 编辑 小组只是一个例子。相反,我有两个其他控件(例如,一个是标尺,它根据各种参数绘制标签和记号),它们的逻辑

为了简单起见,我们假设有一个具有完全个性化图形的自定义控件,该控件也包含在一个面板内(图片中有黑色细边框):

现在,自定义控件应该为用户提供一种机制来进一步个性化它。例如,假设用户需要在其上绘制红色垂直线(见图)。该行部分位于用户控件背景上,部分位于面板上。与现在一样,通过使用control_paint事件,用户最终将在面板下方进行绘制

在类似情况下,您有什么建议可以让用户的生活更轻松

编辑


小组只是一个例子。相反,我有两个其他控件(例如,一个是标尺,它根据各种参数绘制标签和记号),它们的逻辑非常复杂。

您可以创建一个透明控件,并将透明控件置于其他控件之上用于绘图,并在不需要时使其不可见

下面是透明控件的代码和一条简单的线,然后您可以在OnMouseMove、OnMouseDown和OnMouseUp中放置绘制所需的逻辑,并绘制所需的内容,就像我在OnPaint中所做的那样:

using System.Drawing;
using System.Windows.Forms;
public class TransparentControl : Control
{
    public TransparentControl()
    {
        SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.SupportsTransparentBackColor, true);
    }
    protected override void OnPaintBackground(PaintEventArgs e)
    {
    }
    protected override void OnPaint(PaintEventArgs e)
    {
        e.Graphics.DrawLine(Pens.Red, 0, 0, Width, Height);
    }
    protected override CreateParams CreateParams
    {
        get
        {
            CreateParams cp = base.CreateParams;
            cp.ExStyle |= 0x20;
            return cp;
        }
    }
}

如果你想让它变得简单,那么停止使用面板。面板只是一个例子,我有比面板更复杂的控件。请检查我的编辑,然后我应该只向用户公开透明控件的绘制事件,对吗?我喜欢你的解决方案,现在我投你的票。我很快就会试试的!您可以将绘制所需的逻辑放入
OnMouseMove
OnMouseDown
onmousedup
并绘制所需的内容。用户在曲面上绘制您需要的图形,然后您将图形显示给他。