资源描述
实训九 、综合训练二 多功能画图板
目的 掌握对话框、菜单、工具栏的进一步应用
掌握图形技术的应用。
问题 设计一个多功能画图板,能够在窗体上绘制各种图形,如直线、矩形、椭圆等,能够用橡皮擦进行修改,能够保存画好的图片,能够新建一张空白的画布,能够选择任意画笔颜色。
要求 窗体设计符合实训要求,布局合理,程序逻辑结构正确、合理,程序正确执行,满足宾馆管理的基本要求
解决方案
(1) 新建一个Windows应用程序,将其命名为“Drawing”,默认主窗体为Form1
(2) 在Form1窗体中添加控件,如图
Form1上控件的各属性如下表
控件名称
Name属性
Text属性
menuStrip1
menuStrip1
toolStrip1
toolStrip1
colorDialog1
colorDialog1
menuStrip1控件中,两个顶级菜单文件和颜色属性
控件名称
Name属性
Text属性
ToolStripMenuItem
文件ToolStripMenuItem
文件
ToolStripMenuItem
颜色ToolStripMenuItem
颜色
menuStrip1控件中,文件下拉菜单中的各项的属性
控件名称
Name属性
Text属性
ToolStripMenuItem
新建ToolStripMenuItem
新建
ToolStripMenuItem
保存ToolStripMenuItem
保存
ToolStripMenuItem
退出ToolStripMenuItem
退出
toolStrip1控件中,各项的属性
控件名称
Name属性
Text属性
toolStripButton
pen
铅笔
toolStripButton
line
直线
toolStripButton
rectangle
矩形
toolStripButton
ellipse
椭圆
toolStripButton
rubber
橡皮擦
(1) 首先定义一些全局变量
在Form1.cs中定义如下全局变量
public partial class Form1 : Form
{
//布尔型变量,是否正在绘图
private bool isDrawing = false;
//绘图时记录鼠标的位置
private Point startPoint, oldPoint;
//枚举类型,各种绘图工具
private enum drawTools
{
Pen = 0, Line, Ellipse, Rectangle, String, Rubber, None
};
//当前使用的工具
private drawTools drawTool = drawTools.None;
//进行操作的位图
private Image myImage;
//绘制位图的Graphics实例
private Graphics ig;
//绘图使用的色彩
private Color foreColor = Color.Black;
private Color backColor = Color.White;
(2)为 “文件” 菜单中的“新建”菜单项编辑代码,用来新建一张空白的画布
Graphics graphcis = this.CreateGraphics();
graphcis.Clear(Color.White);
myImage = new Bitmap(this.ClientRectangle.Width, this.ClientRectangle.Height);
ig = Graphics.FromImage(myImage);
ig.Clear(backColor);
(3)为 “文件” 菜单中的“保存”菜单项编辑代码
saveFileDialog1.Filter = "图像(*.bmp)|*.bmp";
if (saveFileDialog1.ShowDialog() == DialogResult.OK)
{
myImage.Save(saveFileDialog1.FileName);
}
(5)为 “文件” 菜单中的“退出”菜单项编辑代码
private void 退出ToolStripMenuItem_Click(object sender, EventArgs e)
{
Application.Exit();
}
(6) “颜色” 菜单项编辑代码,用于选择画笔的颜色
if(colorDialog1.ShowDialog()==DialogResult.OK)
foreColor = colorDialog1.Color;
为工具条中各按钮的单击事件编辑代码,以铅笔单击事件为例
private void pen_Click(object sender, EventArgs e)
{
drawTool = drawTools.Pen;
}
(7)当在窗体上按下鼠标左键时执行的操作代码如下
private void Form1_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
isDrawing =true;
startPoint.X = e.X;
startPoint.Y = e.Y;
oldPoint.X = e.X;
oldPoint.Y = e.Y;
}
}
(8)当在窗体上移动鼠标时执行的操作代码如下
private void Form1_MouseMove(object sender, MouseEventArgs e)
{
Graphics g;
g = this.CreateGraphics();
//从上一个点到当前点绘制线段
if (drawTool == drawTools.Pen&&isDrawing==true)
{
g.DrawLine(new Pen(foreColor), oldPoint.X, oldPoint.Y, e.X, e.Y);
ig.DrawLine(new Pen(foreColor), oldPoint.X, oldPoint.Y, e.X, e.Y);
oldPoint.X = e.X;
oldPoint.Y = e.Y;
}
//首先恢复此次操作之前的图像,然后再添加Line
if (drawTool == drawTools.Line && isDrawing == true)
{
this.Form1_Paint(this, new PaintEventArgs(this.CreateGraphics(), this.ClientRectangle));
g.DrawLine(new Pen(foreColor), startPoint.X, startPoint.Y, e.X, e.Y);
}
//首先恢复此次操作之前的图像,然后再添加Ellipse
if (drawTool == drawTools.Ellipse && isDrawing == true)
{
this.Form1_Paint(this, new PaintEventArgs(this.CreateGraphics(), this.ClientRectangle));
g.DrawEllipse(new Pen(foreColor), startPoint.X, startPoint.Y, e.X - startPoint.X, e.Y - startPoint.Y);
}
//首先恢复此次操作之前的图像,然后再添加Rectangle
if (drawTool == drawTools.Rectangle && isDrawing == true)
{
this.Form1_Paint(this, new PaintEventArgs(this.CreateGraphics(), this.ClientRectangle));
g.DrawRectangle(new Pen(foreColor), startPoint.X, startPoint.Y, e.X - startPoint.X, e.Y - startPoint.Y);
}
//用背景色绘制宽线段
if (drawTool == drawTools.Rubber && isDrawing == true)
{
g.DrawLine(new Pen(backColor,20), oldPoint.X, oldPoint.Y, e.X, e.Y);
ig.DrawLine(new Pen(backColor, 20), oldPoint.X, oldPoint.Y, e.X, e.Y);
oldPoint.X = e.X;
oldPoint.Y = e.Y;
}
}
(9)当在窗体上松开鼠标左键时执行的操作代码如下
private void Form1_MouseUp(object sender, MouseEventArgs e)
{
isDrawing = false;
if (drawTool == drawTools.Line )
ig.DrawLine(new Pen(foreColor), startPoint.X, startPoint.Y, e.X, e.Y);
if (drawTool == drawTools.Rectangle)
ig.DrawRectangle(new Pen(foreColor), startPoint.X, startPoint.Y, e.X - startPoint.X, e.Y - startPoint.Y);
if(drawTool==drawTools.Ellipse)
ig.DrawEllipse(new Pen(foreColor), startPoint.X, startPoint.Y, e.X - startPoint.X, e.Y - startPoint.Y);
}
(10)定义Form1_Paint事件中的代码,用于将将Image中保存的图像,绘制出来
//将Image中保存的图像,绘制出来
Graphics g = this.CreateGraphics();
if (myImage != null)
{
g.Clear(Color.White);
g.DrawImage(myImage, this.ClientRectangle);
}
四、测试程序运行结果
展开阅读全文