最新C画图小程序汇总.docx
《最新C画图小程序汇总.docx》由会员分享,可在线阅读,更多相关《最新C画图小程序汇总.docx(17页珍藏版)》请在冰豆网上搜索。
最新C画图小程序汇总
C画图小程序
图像编辑软件
班级:
网工1班姓名:
张田新学号:
1225114042完成日期:
2014.05.16
一、需求分析
a)画线类型,即绘图时所采用的线型,包括:
实线、点线、长划线、点划线、双点划线等
b)绘图类型,即不同的绘图形状,包括:
直线、椭圆、矩形
c)填充类型,即画刷模式下的形状填充,包括:
实心、十字、斜纹等
d)画线颜色修改(按钮控件),弹出ColorDialog
e)清空按钮(按钮控件)
f)画线宽度(NumericUpDown控件)
g)画刷模式(复选框控件)
h)状态栏(在绘画时显示当前光标所处坐标位置)
i)其它:
组合框、控件标题属性等
二、框架设计
1、窗口
Form1
publicpartialclassMainForm:
Form
{
publicMainForm()
{
InitializeComponent();
}
}
Form2
publicpartialclassForm2:
Form
{
publicForm2()
{
InitializeComponent();
}
}
2、设定数据类型定义:
PenMyPen=newSystem.Drawing.Pen(System.Drawing.Color.SaddleBrown,2);//定义画笔,并且初始化颜色和宽度
PointFpStart;//开始点坐标
PointFpEnd;//结束点坐标
PointFpWork;//移动点坐标
Booleanworking;//运动中
Booleanbrushmode;//画刷
Stringdmode="line";
ColorDialogColorDialog1=newColorDialog();//颜色对话框
BitmapmyBitmap=newBitmap(194,294);//位图上绘制图形,创建位图,大小为PictureBox1的尺寸
privateinttickcounts;//计时器
3、基本操作:
Form1:
自定义DrawShape函数,用于实现画图类型的实现
voidDrawShape()
MainForm_Load用于初始化绘图类型和画笔颜色
privatevoidMainForm_Load(objectsender,EventArgse)
在PictureBox1中添加MouseDown事件,用于记录绘图的起点
privatevoidPictureBox1_MouseDown_1(objectsender,MouseEventArgse)
在PictureBox1中添加MouseMove事件,显示鼠标的位置,并画连续线
privatevoidPictureBox1_MouseMove(objectsender,System.Windows.Forms.MouseEventArgse)
在PictureBox1中添加MouseUp事件,用于设置绘图终点并开始绘图
privatevoidPictureBox1_MouseUp(objectsender,System.Windows.Forms.MouseEventArgse)
button1的Click事件,用于设置画笔颜色,显示颜色对话框
privatevoidbutton1_Click(objectsender,EventArgse)
BtnClear的Click事件,用PictureBox1的背景颜色清空绘图区域和位图
privatevoidBtnClear_Click(objectsender,EventArgse)
checkBox2_CheckedChanged事件,用于设置启动定时器
privatevoidcheckBox2_CheckedChanged_1(objectsender,EventArgse)
在定时器控件Tick事件中添加响应代码,用于改变状态栏颜色
privatevoidtimer1_Tick_1(objectsender,EventArgse)
右键剪切功能
privatevoidcutToolStripMenuItem_Click(objectsender,EventArgse)
右键粘贴功能
privatevoidpasteToolStripMenuItem_Click(objectsender,EventArgse)
右键清空功能
privatevoidclearToolStripMenuItem_Click(objectsender,EventArgse)
右键保存,需要先添加saveFileDialog对话框,显示该对话框
privatevoidsaveFileDialog2_FileOk(objectsender,CancelEventArgse)
右键about点击事件,显示新的窗体,需要新建Form2
privatevoidaboutToolStripMenuItem_Click(objectsender,EventArgse)
给pctureBox1添加paint事件,使窗口重绘后内容不消失
privatevoidpictureBox1_Paint(objectsender,PaintEventArgse)
Form2:
Label控件、panel
linkLabel1_LinkClicked用于点击链接相应的网址
三、实现细节
privatevoidPictureBox1_MouseUp(objectsender,MouseEventArgse)
{
if(e.Button==MouseButtons.Left)
{
if(working==true)
{
pEnd.X=e.X;
pEnd.Y=e.Y;
MyPen.Color=button1.BackColor;
MyPen.Width=(int)numericUpDown1.Value;
brushmode=checkBox1.Checked;
//a)画线类型,即绘图时所采用的线型,包括:
实线、点线、长划线、点划线、双点划线等
if(rbShiline.Checked==true)
MyPen.DashStyle=System.Drawing.Drawing2D.DashStyle.Solid;
if(rbDianline.Checked==true)
MyPen.DashStyle=System.Drawing.Drawing2D.DashStyle.Dot;
if(rbChanghualine.Checked==true)
MyPen.DashStyle=System.Drawing.Drawing2D.DashStyle.Dash;
if(rbZidingyi.Checked==true)
MyPen.DashStyle=System.Drawing.Drawing2D.DashStyle.Custom;
if(rbShuangdianline.Checked==true)
MyPen.DashStyle=System.Drawing.Drawing2D.DashStyle.DashDotDot;
if(rbDianhualine.Checked==true)
MyPen.DashStyle=System.Drawing.Drawing2D.DashStyle.DashDot;
//b)绘图类型,即不同的绘图形状,包括:
直线、椭圆、矩形
if(rbZhiline.Checked==true)
dmode="line";
if(rbTuoyuan.Checked==true)
dmode="circle";
if(rbJuxing.Checked==true)
dmode="rect";
if(rbXiewen.Checked==true)
MyPen.Brush=new
System.Drawing.Drawing2D.HatchBrush(
System.Drawing.Drawing2D.HatchStyle.DarkDownwardDiagonal,
MyPen.Color);
//c)填充类型,即画刷模式下的形状填充,包括:
实心、十字、斜纹等
if(rbShizi.Checked==true)
MyPen.Brush=new
System.Drawing.Drawing2D.HatchBrush(
System.Drawing.Drawing2D.HatchStyle.Cross,MyPen.Color);
if(rbShixin.Checked==true)
MyPen.Brush=newSolidBrush(MyPen.Color);
DrawShape(PictureBox1.CreateGraphics(),
pStart,pEnd,brushmode,MyPen,dmode);
working=false;
}
}
}
Case:
画直线
switch(dmode)
{
case"line":
g.DrawLine(MyPen,pStart,pEnd);
e.DrawLine(penmode,startp.X,startp.Y,endp.X,endp.Y);
break;
case:
矩形:
case"rect":
//当第二点的X或Y坐标小于第一点时,矩形无法绘制的问题(bug)
if((int)endp.Y>(int)startp.Y&&(int)endp.X>(int)startp.X)
{
if(brushmode==true)
{
g.FillRectangle(MyPen.Brush,rect1);
e.FillRectangle(penmode.Brush,rect1);
}
else
g.DrawRectangle(MyPen,rect1);
e.DrawRectangle(penmode,rect1);
}
//当第二点的Y坐标小于第一点时,矩形无法绘制的问题
if((int)endp.Y<(int)startp.Y&&(int)endp.X>(int)startp.X)
{
if(brushmode==true)
{
g.FillRectangle(MyPen.Brush,rect2);
e.FillRectangle(penmode.Brush,rect2);
}
else
g.DrawRectangle(MyPen,rect2);
e.DrawRectangle(penmode,rect2);
}
//当第二点的X坐标小于第一点时,矩形无法绘制的问题
if((int)endp.Y>(int)startp.Y&&(int)endp.X<(int)startp.X)
{
if(brushmode==true)
{
g.FillRectangle(MyPen.Brush,rect3);
e.FillRectangle(penmode.Brush,rect3);
}
else
g.DrawRectangle(MyPen,rect3);
e.DrawRectangle(penmode,rect3);
}
//当第二点的X和Y坐标小于第一点时,矩形无法绘制的问题
if((int)endp.Y<(int)startp.Y&&(int)endp.X<(int)startp.X)
{
if(brushmode==true)
{
g.FillRectangle(MyPen.Brush,rect4);
e.FillRectangle(penmode.Brush,rect4);
}
else
g.DrawRectangle(MyPen,rect4);
e.DrawRectangle(penmode,rect4);
}
break;
case画椭圆:
case"circle":
if(brushmode==true)
{
g.FillEllipse(MyPen.Brush,rect1);
e.FillEllipse(penmode.Brush,rect1);
}
else
g.DrawEllipse(MyPen,rect1);
e.DrawEllipse(penmode,rect1);
break;
d)画线颜色修改(按钮控件),弹出ColorDialog
privatevoidbutton1_Click_1(objectsender,EventArgse)
{
ColorDialog1.ShowDialog();
button1.BackColor=ColorDialog1.Color;
}
e)清空按钮(按钮控件)
privatevoidBtnClear_Click(objectsender,EventArgse)
{
PictureBox1.CreateGraphics().Clear(PictureBox1.BackColor);
Graphicsg=Graphics.FromImage(myBitmap);
g.Clear(PictureBox1.BackColor);
}
f)画线宽度(NumericUpDown控件)
MyPen.Width=(int)numericUpDown1.Value;
g)画刷模式(复选框控件)
if(brushmode==true)
{
g.FillRectangle(MyPen.Brush,rect1);//利用位图画矩形
e.FillRectangle(penmode.Brush,rect1);
}
h)状态栏(在绘画时显示当前光标所处坐标位置)
privatevoidcheckBox2_CheckedChanged_1(objectsender,EventArgse)
{
tickcounts=0;
if(checkBox2.Checked==true)
timer1.Start();//启动定时器
timer1.Enabled=true;
}
privatevoidtimer1_Tick(objectsender,EventArgse)
{
if(tickcounts%4==0)//第一个颜色
statusStrip1.BackColor=arrColor[0];
if(tickcounts%4==1)
statusStrip1.BackColor=arrColor[1];
arrColor[0].ToString();
if(tickcounts%4==2)
statusStrip1.BackColor=arrColor[2];
if(tickcounts%4==3)
statusStrip1.BackColor=arrColor[3];
arrColor[1].ToString();
tickcounts++;
}
j)其它:
组合框、控件标题属性等
2.教材原例Bug修改(15分)
a)窗口刷新后图像消失问题
//给pctureBox1添加paint事件,使窗口重绘后内容不消失
privatevoidPictureBox1_Paint(objectsender,PaintEventArgse)
{
e.Graphics.DrawImage(myBitmap,0,0);
}
b)画矩形:
当第二点的X或Y坐标小于第一点时,矩形无法绘制的问题
当第二点的Y坐标小于第一点时,矩形无法绘制的问题
Rectanglerect2=newRectangle((int)startp.X,
(int)endp.Y,(int)(endp.X-startp.X),(int)(startp.Y-endp.Y));
if((int)endp.Y<(int)startp.Y&&(int)endp.X>(int)startp.X)
{
if(brushmode==true)
{
g.FillRectangle(MyPen.Brush,rect2);
e.FillRectangle(penmode.Brush,rect2);
}
else
g.DrawRectangle(MyPen,rect2);
e.DrawRectangle(penmode,rect2);
}
其他两种情况类似处理,这里不再赘述
c)鼠标的响应:
左键右键均响应,应修改为仅响应鼠标左键进行绘图操作
例如:
if(e.Button==MouseButtons.Left)//仅响应鼠标左键
{
working=true;
pStart.X=e.X;
pStart.Y=e.Y;
toolStripStatusLabel1.Text="["+e.X+","+e.Y+"]";
}
}
d)初始颜色问题,原初始颜色与背景色相同,无法显示图像
PenMyPen=newSystem.Drawing.Pen(System.Drawing.Color.SaddleBrown,2);
System.Drawing.Drawing2D.HatchStyle.DarkDownwardDiagonal,Color.SaddleBrown);
e)清空功能:
用原PictureBox背景来清空而不用Color属性所代表的颜色来清空绘图区
privatevoidBtnClear_Click_1(objectsender,EventArgse)
{
PictureBox1.CreateGraphics().Clear(PictureBox1.BackColor);//清空绘图区域®
Graphicsg=Graphics.FromImage(myBitmap);
g.Clear(PictureBox1.BackColor);//清空位图
}
3.特色功能
a)连续线:
即通常采用的画笔画出连续线条(20分)
//在PictureBox1中添加MouseMove事件,显示鼠标的位置,并画连续线
privatevoidPictureBox1_MouseMove(objectsender,MouseEventArgse)
{
Graphicsg=Graphics.FromImage(myBitmap);//位图
Graphicsh=PictureBox1.CreateGraphics();
if(e.Button==MouseButtons.Left)
{
if(working==true)
{
pWork.X=e.X;
pWork.Y=e.Y;
toolStripStatusLabel1.Text="["+e.X+","+e.Y+"]";
}
if(rbLianxuline.Checked==true)
{//画连续线
g.DrawLine(MyPen,pStart,pWork);//位图
h.DrawLine(MyPen,pStart.X,pStart.Y,pWork.X,pWork.Y);//pictureBox1
pStart.X=pWork.X;//将上一个终点作为新的起点
pStart.Y=pWork.Y;
}
}
}
b)timer复选框:
实现间隔的改变状态条背景色(10分)
//checkBox2_CheckedChanged事件,用于设置启动定时器
privatevoidcheckBox2_CheckedChanged_1(objectsender,EventArgse)
{
tickcounts=0;
if(checkBox2.Checked==true)
timer1.Start();//启动定时器
timer1.Enabled=true;
}
//改变复选框颜色
privatevoidtimer1_Tick(objectsender,EventArgse)
{
if(tickcounts%4==0)//第̨²一°?
个?
颜?
色¦?
statusStrip1.BackColor=arrColor[0];
if(tickcounts%4==1)
statusStrip1.BackColor=arrColor[1];
arrColor[0].ToString();
if(tickcounts%4==2)
statusStrip1.BackColor=arrColor[2];
if(tickcounts%4==3)
statusStrip1.BackColor=arrColor[3];
arrColor[1].ToString();
tickcounts++;
}
c)右键弹出上下文菜单:
剪切:
完成剪切图像功能(5分)
//---------右键的剪切功能--------------
privatevoidcutToolStripMenuItem_Click(objectsender,EventArgse)
{
Clipboard.SetDataObject(myBitmap,true);
PictureBox1.CreateGraphics().Clear(PictureBox1.BackColor);//pictureBox1绘图区域清空
Graphicsg=Graphics.FromImage(myBitmap);
g.Clear(PictureBox1.BackColor);//位图清空
}
粘贴:
完成图像粘贴(5分)
//--------右键粘贴功能-----------
privatevoidpasteToolStripMenuItem_Click(objects