Я хочу обнаружить щелчок мышью по моей настраиваемой области.
1) Я пробовал этот код с прямоугольником, и он работал, но со строкой - нет.
GraphicsPath gp = new GraphicsPath();
Region reg = new Region();
private void Form1_Load(object sender, EventArgs e)
{
gp.AddString("TEXT", new FontFamily("Arial"),0, 20.0f, new Point(300, 10), StringFormat.GenericDefault);
gp.Widen(Pens.AliceBlue);
reg = new Region(gp);
}
и вот часть2
private void panel1_MouseDown(object sender, MouseEventArgs e)
{
if (reg.IsVisible(e.Location))
{
MessageBox.Show("aaaa");
}
}
Это не показывает окно сообщения. :)
Обновлено: вот мое событие Paint, чтобы увидеть, где моя строка
private void panel1_Paint(object sender, PaintEventArgs e)
{
e.Graphics.DrawString("TEXT", new Font("Arial", 20), Brushes.Yellow, 300,100 );
}





Самая основная ошибка - это опечатка: один раз вы рисуете на y = 10, а второй - на y = 100.
Но есть еще одна проблема, которая совсем не так очевидна:
Добавлять
e.Graphics.FillPath(Brushes.Firebrick, gp);
к событию Paint, и вы увидите это: шрифты имеют совсем другой размер.
Это потому, что при добавлении текста в GraphicsPath он использует другой масштаб (называемый 'emSize'), чем Graphics.DrawString, который использует 'Точка'.
Для адаптации вы можете использовать это:
float fontsize = 20.0f;
using (Graphics g = panel1.CreateGraphics()) fontsize *= g.DpiY / 72f;
Теперь вы можете собрать GraphicsPath, лучше всего с правильными координатами ..:
gp.AddString("TEXT", new FontFamily("Arial"), 0, fontsize,
new Point(300, 100), StringFormat.GenericDefault);
И все в свое удовольствие ;-) - Кстати, регион для этого не нужен, так как GraphicsPath также имеет метод IsVisible ..