[英]How to detect a click of a dynamically drawn graphic?
我正在绘制一个面板上的文件和文件夹名称列表,我正在尝试集思广益,以检测用户是否以及何时单击文件/文件夹名称,以及他们实际点击的文件或文件夹名称。
以下是我到目前为止所写的方法。 我的第一个想法是用透明控件捎回每一段文本,并以这种方式动态连接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();
}
谢谢,凯文
首先,保留面板上绘制的每个字符串或对象的列表及其位置和大小。
之后,处理事件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
}
}
}
在类中,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);
}
}
没有必要每次都创建矩形,你可以有一个类变量来保存这些信息。 当位置或大小发生变化时更新矩形非常重要。
我知道我错过了一个明显的解决方案。 我可以将文本绘制到按钮或其他控件上,然后将其连接起来。 卫生署!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.