简体   繁体   English

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

[英]How to detect a click of a dynamically drawn graphic?

I am drawing a list of file & folder names on a panel and I'm trying to brainstorm the best way to detect if and when a user clicks a file/folder name, as well as what file or folder name they actually clicked. 我正在绘制一个面板上的文件和文件夹名称列表,我正在尝试集思广益,以检测用户是否以及何时单击文件/文件夹名称,以及他们实际点击的文件或文件夹名称。

Below are the methods I wrote so far. 以下是我到目前为止所写的方法。 My first thought was to piggy back each piece of text with a transparent control and dynamically wire up an onclick event that way. 我的第一个想法是用透明控件捎回每一段文本,并以这种方式动态连接onclick事件。 But it seems like a waste of resources. 但这似乎是浪费资源。

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();
    }

Thanks, Kevin 谢谢,凯文

First of all, keep a list of every string or object drawn on your panel with their location and size. 首先,保留面板上绘制的每个字符串或对象的列表及其位置和大小。

After that, handle the event MouseDown or MouseUp (depending of the behavior you want) 之后,处理事件MouseDown或MouseUp(取决于您想要的行为)

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
        }
    }
}

In the class YourObject implements the function IsHit: 在类中,YourObject实现了函数IsHit:

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);
    }
}

It is not necessary to create the rectangle every time, you could have a class variable to keep this information. 没有必要每次都创建矩形,你可以有一个类变量来保存这些信息。 It is just important to update your rectangle when the location or the size change. 当位置或大小发生变化时更新矩形非常重要。

I knew I was missing an obvious solution. 我知道我错过了一个明显的解决方案。 I can draw the text onto a buttor or other control, and wire it up that way. 我可以将文本绘制到按钮或其他控件上,然后将其连接起来。 Doh! 卫生署!

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM