【发布时间】:2016-03-14 06:28:00
【问题描述】:
我有一个 winforms 应用程序
这是我的代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WindowsFormsApplication12
{
public partial class Form1 : Form
{
Graphics gr;
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
gr = this.CreateGraphics();
MyLine myline = new MyLine();
myline.P1 = new Point(100, 0);
myline.P2 = new Point(200, 80);
gr.DrawLine(new Pen(Color.Red), myline.P1,myline.P2);
Rectangle r = new Rectangle(0, 0, 50, 50);
gr.DrawRectangle(new Pen(Color.Teal, 5), r);
if (r.Contains(0,25)) MessageBox.Show("within");
}
private void btnClear_Click(object sender, EventArgs e)
{
gr.Clear(this.BackColor);
}
}
}
class MyLine
{
public Point P1 {get; set;}
public Point P2 { get; set; }
}
我的问题是这个..
我可以画一个矩形,我可以看看里面是否有一个点。
所以我可以将程序扩展为当点击表单在矩形内时说“是”。 Rectangle 有一个 Contains 功能,非常棒。
但我想对 Line 做同样的事情。
问题在于,winforms 没有 Line 类。我可以编写自己的 Line 类,但问题仍然存在.. 如何找到点击是否落在它上面?
我注意到WPF有这样一个类How do I recognize a mouse click on a line?
但我使用的是winforms。
【问题讨论】:
-
@MarkHall 你说的是一个高度为 1 的矩形......虽然这不适用于对角线,除非有办法转动矩形
-
我知道也许我不需要全局并且可以在两个函数中分别使用 Graphics gr
-
注意-reza 的回答,对于矩形你可以做
bool b = gp.IsVisible(point) || gp.IsOutlineVisible(point, pen);例如stackoverflow.com/questions/4816297/… -
也相关 - 当单击表单、面板或按钮时,扫描所有对象的列表以查看单击了哪个形状的想法。并为每个形状拥有自己的对象,并且该对象将具有 isHit 方法,如这里的答案stackoverflow.com/questions/1279091/…
标签: c# .net winforms graphics gdi+