环境:Win10+Visual Studio 2022 Community
搭建环境需要下载的模块:.NET桌面开发
目录
一、实验目的
二、实验步骤
1.创建新项目
2.建立菜单
3.建立菜单响应函数
4.橡皮筋技术
1.掌握创建Windows窗体应用程序得到基本步骤
2.掌握创建菜单的基本方法
3.掌握建立菜单响应函数的基本步骤
4.掌握用鼠标画直线的“橡皮筋”技术的基本方法
创建一个空的Windows窗体程序框架,如图所示
其中包含一个名为Form1的窗体,用鼠标调整Form1窗口的大小,如图所示
在Form1窗体被选中的情况下(如果没有被选中,用鼠标点击一下Form1窗体即可),系统窗口右下角的属性窗口列出了窗体Form1的属性值,找到Text属性,键入属性值“计算机图形学练习平台”(如图所示)。由于Form1窗体是应用程序的主窗口,该属性值在程序执行时作为程序的标题显示出来。
用鼠标指向 VS平台左边框架的“工具箱”,在“菜单和工具栏”项目中用鼠标将“MenuStrip”拖到Form1窗体,建立应用程序菜单系统,如图所示
在Form1窗体下面,系统建立了名为“MenuStrip1”的控件,用鼠标选中该控件,Form1窗体出现菜单第一项,显示“请在此处键入”,如图所示
输入“基本图形生成”,可以看到该菜单项右边和下面分别出现两个空菜单项,右边是与该菜单项同级并列的另一个菜单项,下面则是该菜单项的子菜单,在下面的子菜单项中输入“DDA 直线”,如图所示
在DDA直线菜单项选中的情况下,在该菜单项属性窗口中找到Name属性,鼠标点击属性值,改成DDALine
用同样的方法依次建立其他菜单项,各项子菜单如图所示
菜单响应函数定义了菜单项应该完成的动作,以“退出”菜单项为例说明如何建立一个菜单项的响应函数。首先将其Name属性值改为“Exit”,鼠标双击“退出”菜单项,系统出现如下代码段。可以看到,刚才的菜单设计是在“Form1.cs[设计]”页面中进行,现在打开的是“Form1.cs”页面,它是专门针对窗体Form1进行编程的环境,针对Form1编写的程序都存储在文件Forml.cs 中
namespace WinFormsApp1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Exit_Click(object sender, EventArgs e)
{
}
}
}
在鼠标双击“退出”菜单项后,系统在Form1.cs中自动添加了一个空函数Exit_Click。从函数名就可以看出,它是鼠标点击名为“Exit”的某个单元后的响应函数。Exit就是刚才在建立“退出”菜单项时为菜单项Name属性设置的属性值。所以该函数就是“退出”菜单响应函数,功能是结束应用程序。因此,添加内容如下所示
private void Exit_Click(object sender, EventArgs e)
{
this.Close();
}
按启动调试键,如果没有任何语法、逻辑上的错误,系统编译并执行程序,得到如图所示画面
用Visual Studio 2022打开刚刚编制的图形程序,可以看到上次编制的Form1窗体和菜单系统,它们都存在于Form1.cs[设计]页面中。Form1.cs页面用来保存设计页面的后台程序,点击Form1打开Form1.cs页面,
在这里,我们借用“DDA直线”菜单项.演示如何实现橡皮筋技术。在Form1.cs[设计]页面中,双击“DDA直线”菜单项,系统在Form1.cs页面自动生成空函粒,private void DDALine_Click(object sender , EventArgs e)。在程序中添加如下内容:
namespace WinFormsApp1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Exit_Click(object sender, EventArgs e)
{
this.Close();
}
Color BackColor1 = Color.White;
Color ForeColor1 = Color.Black;
public int MenuID, PressNum, FirstX, FirstY, OldX, OldY;
private void DDALine_Click(object sender, EventArgs e)
{
MenuID = 1;
PressNum = 0;
Graphics g = CreateGraphics(); //创建图形设备
g.Clear(BackColor1); //设置背景颜色
}
}
其中,MenuID变量是菜单项的标志,PressNum变量记录鼠标按键次数,FirstX、FirstY用来记录线段第一端点坐标。实际的选点操作用Form1窗体中的鼠标操作完成,但因为窗体中的鼠标操作还要为众多的其他图形操作服务,并非为DDA直线所专有,所以要设置MenuID变量使窗体能够明确鼠标操作的服务对象。
在Form1.cs[设计]页面点击Form1窗体空白处选中窗体,在系统窗口右下角的属性窗口中找到“MouseClick”事件(如图)和“MouseMove”事件(如图),并双击,系统自动建立空的响应函数Form1_MouseClick和Form1_MouseMove
在程序中添加如下内容:
namespace WinFormsApp1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void Exit_Click(object sender, EventArgs e)
{
this.Close();
}
Color BackColor1 = Color.White;
Color ForeColor1 = Color.Black;
public int MenuID, PressNum, FirstX, FirstY, OldX, OldY;
private void DDALine_Click(object sender, EventArgs e)
{
MenuID = 1;
PressNum = 0;
Graphics g = CreateGraphics(); //创建图形设备
g.Clear(BackColor1); //设置背景颜色
}
private void Form1_MouseClick(object sender, MouseEventArgs e)
{
Graphics g = CreateGraphics(); //创建图形设备
Pen MyPen = new Pen(Color.Red, 1);
if (MenuID == 1)
{
if (PressNum == 0) //第一点,保留
{
FirstX = e.X;
FirstY = e.Y;
OldX = e.X;
OldY = e.Y;
}
else //第二点,画线
{
g.DrawLine(MyPen, FirstX, FirstY, e.X, e.Y);
}
PressNum++;
if (PressNum >= 2)
{
PressNum = 0; //画线完毕,清零,为画下一条线做准备
}
}
}
private void Form1_MouseMove(object sender, MouseEventArgs e)
{
Graphics g = CreateGraphics(); //创建图形设备
Pen BackPen = new Pen(BackColor1, 1);
Pen MyPen = new Pen(ForeColor1, 1);
if (MenuID == 1 && PressNum == 1)
{
if (!(e.X == OldX && e.Y == OldY))
{
g.DrawLine(BackPen, FirstX, FirstY, OldX, OldY);
g.DrawLine(MyPen, FirstX, FirstY, e.X, e.Y);
OldX = e.X;
OldY = e.Y;
}
}
}
}
}
画线结果如图所示: