📄 drawlinesform.cs
字号:
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
namespace DrawLines
{
/// <summary>
/// 一家日企的面试题目之三
/// 完成下面的程序,功能要求为:
/// (1)可以用鼠标自由的在屏幕上面画出一段折线(要求用橡皮筋“技术),如
/// 折线相交,弹出提示框,要求重新取点(该点不作为折线上的点)
/// (2)在上面折线的两侧,以一定的距离画出与之平行的折线
/// </summary>
public class DrawLinesForm : System.Windows.Forms.Form
{
/// <summary>
/// 必需的设计器变量。
/// </summary>
private System.ComponentModel.Container components = null;
private bool isMouseDown = false; //记录鼠标是否已按下。
private bool ptEndIsNull = true; //记录ptEnd是否无效。当鼠标键刚按下而鼠标没有移动时应是无效的。
private Point ptBegin; //记录新画线的起点。
private Point ptEnd; //记录新画线的终点。
private ArrayList listLines; //记录所有已画的线。
public DrawLinesForm()
{
//
// Windows 窗体设计器支持所必需的
//
InitializeComponent();
//
// TODO: 在 InitializeComponent 调用后添加任何构造函数代码
//
listLines = new ArrayList();
}
/// <summary>
/// 清理所有正在使用的资源。
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}
#region Windows 窗体设计器生成的代码
/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
{
//
// DrawLinesForm
//
this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
this.BackColor = System.Drawing.Color.White;
this.ClientSize = new System.Drawing.Size(656, 381);
this.Name = "DrawLinesForm";
this.Text = "画线程序";
this.MouseDown += new System.Windows.Forms.MouseEventHandler(this.DrawLinesForm_MouseDown);
this.MouseUp += new System.Windows.Forms.MouseEventHandler(this.DrawLinesForm_MouseUp);
this.Paint += new System.Windows.Forms.PaintEventHandler(this.DrawLinesForm_Paint);
this.MouseMove += new System.Windows.Forms.MouseEventHandler(this.DrawLinesForm_MouseMove);
}
#endregion
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
Application.Run(new DrawLinesForm());
}
private void DrawLinesForm_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
{
Graphics dc = this.CreateGraphics();
Pen pen = new Pen(this.ForeColor, 1);
IEnumerator pos = listLines.GetEnumerator();
while(pos.MoveNext())
{
Line line = (Line)pos.Current;
line.Draw(dc, pen);
}
}
private void DrawLinesForm_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{
//鼠标已按下,记录线段起点。
isMouseDown = true;
ptBegin = new Point(e.X, e.Y);
}
private void DrawLinesForm_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
{
if (isMouseDown)
{
//鼠标已按下,若ptEnd有效则擦去旧线重绘新线,以实现橡皮筋技术。
Graphics dc = this.CreateGraphics();
Pen pen = new Pen(this.ForeColor, 1);
if (!ptEndIsNull)
{
pen.Color = this.BackColor;
dc.DrawLine(pen, ptBegin, ptEnd);
pen.Color = this.ForeColor;
}
ptEnd = new Point(e.X, e.Y);
ptEndIsNull = false;
dc.DrawLine(pen, ptBegin, ptEnd);
}
}
private void DrawLinesForm_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e)
{
//鼠标键弹起,擦去橡皮筋所画的线。判断是否有线相交,若无则
//用Line类绘制新线,并将新线记录。
isMouseDown = false;
ptEndIsNull = true;
ptEnd = new Point(e.X, e.Y);
Pen pen = new Pen(this.BackColor, 1);
Graphics dc = this.CreateGraphics();
dc.DrawLine(pen, ptBegin, ptEnd);
Line line = new Line(ptBegin, ptEnd);
if (IsCutWithOldLines(line))
{
MessageBox.Show("折线不能相交!", "提示");
DrawLinesForm_Paint(null, null);
}
else
{
pen.Color = this.ForeColor;
line.Draw(dc, pen);
listLines.Add(line);
}
}
/// <summary>
/// 判断新线是否与已记录的旧线相交。
/// </summary>
/// <param name="newLine">新绘制的线。</param>
/// <returns>若相交,返回真。否则返回假。</returns>
private bool IsCutWithOldLines(Line newLine)
{
IEnumerator pos = listLines.GetEnumerator();
while(pos.MoveNext())
{
Line line = (Line)pos.Current;
if (newLine.IsCutWithLine(line))
return true;
}
return false;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -