目前,我正在根据显示的图像为客房/办公室制作搜索程序。
我在程序上遇到麻烦,我希望在2D地图上显示一条线,其中按钮将用于连接线的每个坐标。但搜索房间后没有会出现的线条。
private void button2_Click(object sender, EventArgs e)
{
System.Drawing.Pen myPen;
myPen = new System.Drawing.Pen(System.Drawing.Color.Red, 5);
System.Drawing.Graphics frmGraphics = pictureBox1.CreateGraphics();
if (textBox1.Text == "")
{
MessageBox.Show("Nothing to Search!", "", MessageBoxButtons.OK);
}
else
{
if (radioButton2.Checked == true)
{
if(textBox1.Text == "dental clinic")
{
frmGraphics.DrawLine(myPen, path1.Location.X, path1.Location.Y, path2.Location.X, path2.Location.Y);
Thread.Sleep(500);
frmGraphics.DrawLine(myPen, path2.Location.X, path2.Location.Y, path3.Location.X, path3.Location.Y);
Thread.Sleep(500);
frmGraphics.DrawLine(myPen, path3.Location.X, path3.Location.Y, path4.Location.X, path4.Location.Y);
lbres.Text = "Dental Clinic";
lbloc.Text = "OutPatient Department";
OPDView opdfrm = new OPDView();
dview = opdfrm;
}
else
{
MessageBox.Show("No Results Found!", "", MessageBoxButtons.OK);
}
myPen.Dispose();
frmGraphics.Dispose();
return;
}
}
我有4个按钮,它们已经重命名为path1 - path4,并希望将它们全部连接在一起。我需要一些帮助,谢谢。
答案 0 :(得分:0)
代码有更多问题,但我最后只会暗示它们。
你可能绊倒的错误是没有正确的坐标。
PictureBox
不是容器控件,所以无论你在顶部上放置什么不 在里面。通过移动PB进行测试:Buttons
不会移动 ... - 请注意,这与将Button
放到Panel
不同或GroupBox
..
有两种方法可以解决它:
Buttons
的{{1}}个孩子
以下是如何制作PB的Button子项:
PictureBox
请注意,您必须采用现在按下按钮的代码
或者您更正了考虑PB位置的位置:
path1.Parent = pictureBox1;
path2.Parent = pictureBox1;
path3.Parent = pictureBox1;
另一个问题是使用Point np1 = Point.Subtract(path1.Location, (Size)pictureBox1.Location);
Point np2 = Point.Subtract(path2.Location, (Size)pictureBox1.Location);
Point np3 = Point.Subtract(path3.Location, (Size)pictureBox1.Location);
frmGraphics.DrawLine(myPen, Point.Empty, np1 , np2);
...
绘制的方式并不持久。事实上它几乎总是错的!结果将在每个窗口调整大小等时消失。更好的方法是使用control.CreateGraphics
参数绘制Picturebox.Paint
事件。
我也想知道e.Graphics
首先是什么?您可以创建Buttons
并在没有它们的情况下进行绘制。
同样使用List<Point>
动画将冻结UI线程。而是使用Thread.Sleep(500)
来查看点列表。你需要固定数量的动画制作方法,你可以创建一个Timer
来保存它们。
<强>更新强>
创建点列表很简单。在课堂级别声明它:
Dictionary<string, List<Point>>
当你知道数据时填写它:
List<Point> way = new List<Point>();
还创建一个Timer并设置其Interval。在其Tick事件中,您向上移动指向当前段的指针,并调用Paint事件使PictureBox无效:
way.Add(new Point(100, 100));
way.Add(new Point(150, 100));
way.Add(new Point(150, 200));
way.Add(new Point(10, 200));
way.Add(new Point(10, 220));
way.Add(new Point(50, 220));
way.Add(new Point(50, 250));
在PictureBox的Paint事件中,您绘制从开始到当前索引的路径:
void aTimer_Tick(object sender, EventArgs e)
{
point = Math.Min(point + 1, way.Count);
pictureBox1.Invalidate();
if (point >= way.Count) aTimer.Stop();
}
我省略了一些检查,你会想到一种存储或构建点列表的方法..
您还可能希望通过绘制较小的片段来改进动画。为此您可以添加更多点,但使用函数将更灵活..:
private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
using (Pen pen = new Pen(Color.DarkGoldenrod, 2.5f))
for (int i = 1; i < point; i++) e.Graphics.DrawLine(pen , way[i - 1], way[i]);
}