C# 如何检测动态绘制图形的点击?

C# 如何检测动态绘制图形的点击?,c#,winforms,C#,Winforms,我在一个面板上画了一个文件和文件夹名的列表,我正试图集思广益,找出最好的方法来检测用户是否以及何时单击了一个文件/文件夹名,以及他们实际单击了什么文件或文件夹名 下面是我到目前为止写的方法。我的第一个想法是用一个透明的控件来复制每一段文本,并以这种方式动态地连接一个onclick事件。但这似乎是在浪费资源 private void DisplayFolderContents(ListBox lb, string sPath) { lblPath.Text = sPath;

我在一个面板上画了一个文件和文件夹名的列表,我正试图集思广益,找出最好的方法来检测用户是否以及何时单击了一个文件/文件夹名,以及他们实际单击了什么文件或文件夹名

下面是我到目前为止写的方法。我的第一个想法是用一个透明的控件来复制每一段文本,并以这种方式动态地连接一个onclick事件。但这似乎是在浪费资源

private void DisplayFolderContents(ListBox lb, string sPath)
    {
        lblPath.Text = sPath;
        const float iPointX = 01.0f;
        float iPointY = 20.0f;
        DirectoryContents = FileSystem.RetrieveDirectoriesAndFiles(sPath, true, true, "*.mp3");

        foreach (string str in DirectoryContents)
        {
            DrawString(FileSystem.ReturnFolderFromPath(str), iPointX, iPointY, 21, panListing);


            iPointY += 50;
        }
    }


private void DrawString(string textToDraw, float xCoordinate, float yCoordinate, int fontSize, Control controlToDrawOn)
    {

        Graphics formGraphics = controlToDrawOn.CreateGraphics();
        formGraphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;
        Font drawFont = new Font(
                "Arial", fontSize, FontStyle.Bold);

        SolidBrush drawBrush = new
                SolidBrush(Color.White);

        formGraphics.DrawString(textToDraw, drawFont, drawBrush, xCoordinate, yCoordinate);

        drawFont.Dispose();
        drawBrush.Dispose();
        formGraphics.Dispose();
    }
谢谢,
Kevin

首先,将面板上绘制的每个字符串或对象及其位置和大小列一张列表

之后,处理MouseDown或MouseUp事件(取决于您想要的行为)


没有必要每次都创建矩形,您可以使用一个类变量来保存此信息。当位置或大小发生变化时,更新矩形非常重要。

首先,保留面板上绘制的每个字符串或对象及其位置和大小的列表

之后,处理MouseDown或MouseUp事件(取决于您想要的行为)


没有必要每次都创建矩形,您可以使用一个类变量来保存此信息。当位置或大小发生变化时,更新矩形非常重要。

我知道我缺少一个明显的解决方案。我可以将文本绘制到按钮或其他控件上,并以这种方式将其连接起来。啊

我知道我错过了一个显而易见的解决方案。我可以将文本绘制到按钮或其他控件上,并以这种方式将其连接起来。啊

多谢各位。这确实回答了我的问题。例如,如果物体是一个椭圆呢?谢谢。这确实回答了我提出的问题。例如,如果对象是椭圆呢?这是一种更好的方法,因为您可以使用控件分层来处理z顺序。这与“我的第一个想法是用一个透明控件将每一段文本背起来,并以这种方式动态连接一个onclick事件。这是一种更好的方法,因为您可以使用控件分层为您处理z顺序。这与“我的第一个想法是使用透明控件复制每一段文本并以这种方式动态连接onclick事件”有何不同。但这似乎是在浪费资源?
List<YourObject> m_list; //The list of objects drawn in the panel.

private void OnMouseDown(object sender, MouseEventArgs e)
{
    foreach(YourObject obj in m_list)
    {
        if(obj.IsHit(e.X, e.Y))
        {
            //Do Something
        }
    }
}
public class YourObject
{

    public Point Location { get; set; }
    public Size Size {get; set; }

    public bool IsHit(int x, int y)
    {
        Rectangle rc = new Rectangle(this.Location, this.Size);
        return rc.Contains(x, y);
    }
}