【高分】请教一个关于c#制作画图软件关于填充操作的问题

简单创造 2015-05-07 02:21:25
您好,现在在做一个关于类似windows画图的软件,但是碰到一个问题,就是实现填充功能的时候,只能填充一个对象,当填充第二个对象的时候,之前填充的图案就消失了,能否请大神帮忙解决下,以下是我贴的代码,麻烦了。


private void Form1_Paint(object sender, PaintEventArgs e)//实现无闪烁绘图
{
//Rectangle rect = e.ClipRectangle;
BufferedGraphicsContext currentContext = BufferedGraphicsManager.Current;
BufferedGraphics myBuffer = currentContext.Allocate(e.Graphics, e.ClipRectangle);
Graphics g = myBuffer.Graphics;
g.SmoothingMode = SmoothingMode.HighQuality;
g.PixelOffsetMode = PixelOffsetMode.HighSpeed;
g.Clear(this.BackColor);

if (theImage != null)
{
//g.Clear(Color.White);
g.DrawImage(theImage, this.ClientRectangle);
}

myBuffer.Render(e.Graphics);
g.Dispose();
myBuffer.Dispose();//释放资源

}
private void Form1_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
//如果开始绘制,则开始记录鼠标位置
if ((isDrawing = !isDrawing) == true)
{
startPoint = new Point(e.X, e.Y);
oldPoint = new Point(e.X, e.Y);
}
}
}
Rectangle rect;
Rectangle elli;
int juj;//判断是矩形还是椭圆
private void Form1_MouseMove(object sender, MouseEventArgs e)
{
Graphics g;
g = this.CreateGraphics();
if (isDrawing)
{
switch (drawTool)
{
case drawTools.None:
break;
case drawTools.Pen:
//从上一个点到当前点绘制线段
g.DrawLine(new Pen(foreColor, line_width), oldPoint, new Point(e.X, e.Y));
ig.DrawLine(new Pen(foreColor, line_width), oldPoint, new Point(e.X, e.Y));
oldPoint.X = e.X;
oldPoint.Y = e.Y;
break;
case drawTools.Line:
//首先恢复此次操作之前的图像,然后再添加Line
this.Form1_Paint(this, new PaintEventArgs(this.CreateGraphics(), this.ClientRectangle));//可能是这一步使得之前的填充步骤失效了。
g.DrawLine(new Pen(foreColor, line_width), startPoint, new Point(e.X, e.Y));
break;
case drawTools.Ellipse:
//首先恢复此次操作之前的图像,然后再添加Ellipse
this.Form1_Paint(this, new PaintEventArgs(this.CreateGraphics(), this.ClientRectangle));
g.DrawEllipse(new Pen(foreColor, line_width), startPoint.X, startPoint.Y, e.X - startPoint.X, e.Y - startPoint.Y);
break;
case drawTools.Rectangle:
//首先恢复此次操作之前的图像,然后再添加Rectangle
this.Form1_Paint(this, new PaintEventArgs(this.CreateGraphics(), this.ClientRectangle));
g.DrawRectangle(new Pen(foreColor, line_width), startPoint.X, startPoint.Y, e.X - startPoint.X, e.Y - startPoint.Y);
//Rectangle rect;

break;
case drawTools.String:
break;
case drawTools.Rubber:
//用背景色绘制宽线段
g.DrawLine(new Pen(backColor, 20), oldPoint, new Point(e.X, e.Y));
ig.DrawLine(new Pen(backColor, 20), oldPoint, new Point(e.X, e.Y));
oldPoint.X = e.X;
oldPoint.Y = e.Y;
break;
}
}
}
private void Form1_MouseUp(object sender, MouseEventArgs e)
{
isDrawing = false;
switch (drawTool)
{
case drawTools.Line:
ig.DrawLine(new Pen(foreColor, line_width), startPoint, new Point(e.X, e.Y));

break;
case drawTools.Ellipse:
ig.DrawEllipse(new Pen(foreColor, line_width), startPoint.X, startPoint.Y, e.X - startPoint.X, e.Y - startPoint.Y);
elli = new Rectangle(startPoint.X, startPoint.Y, e.X - startPoint.X, e.Y - startPoint.Y);
juj = 2;
break;
case drawTools.Rectangle:
ig.DrawRectangle(new Pen(foreColor, line_width), startPoint.X, startPoint.Y, e.X - startPoint.X, e.Y - startPoint.Y);
rect = new Rectangle(startPoint.X, startPoint.Y, e.X - startPoint.X, e.Y - startPoint.Y);//试验
juj = 1;
break;
}
}
private void toolStripButton6_Click_1(object sender, EventArgs e)填充操作
{
switch(juj)
{
case 1:
{
Bitmap bit = new Bitmap(1000, 1000);//绘图一般画在位图上
//Graphics g = Graphics.FromImage(bit);
Graphics g = this.CreateGraphics();
SolidBrush b1 = new SolidBrush(Color.Red);//
g.FillRectangle(b1, rect);//这句实现填充矩形的功能
g.Dispose();
break;
}
case 2:
{
Bitmap bit = new Bitmap(1000, 1000);//绘图一般画在位图上
//Graphics g = Graphics.FromImage(bit);
Graphics g = this.CreateGraphics();
SolidBrush b1 = new SolidBrush(Color.Red);//
g.FillEllipse(b1, elli);//这句实现填充矩形的功能
g.Dispose();
break;

}


}



}
...全文
233 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_26815423 2015-12-17
  • 打赏
  • 举报
回复
能不能把你做的发给我看看。
汪小哥 2015-05-09
  • 打赏
  • 举报
回复
杭电的
tcmakebest 2015-05-08
  • 打赏
  • 举报
回复
引用 7 楼 sinat_21723435 的回复:
[quote=引用 6 楼 tcmakebest 的回复:] Form1_Paint就是纯一次性显示用的,是画在屏幕上的无法保存的,最小化再显示肯定消失. 要实现持久,要么把原来的填充操作记录下来,每次都要调用, 要么画的时候就画在图片上,然后再显示图片.
您好,我按您的方法做了,成功了,非常感谢您。我想再问您一下,画图的时候我打开一张图片,为什么显示的只是这个图片的一部分,而且如果在上面做一个矩形,在画第二个矩形的时候第一个矩形会挪位置,画第三个矩形的时候,第二个矩形又会挪位置,这是什么原因?[/quote] 可能是你图片与PictureBox大小不一致,并且显示时自动缩放造成的.
简单创造 2015-05-08
  • 打赏
  • 举报
回复
引用 6 楼 tcmakebest 的回复:
Form1_Paint就是纯一次性显示用的,是画在屏幕上的无法保存的,最小化再显示肯定消失. 要实现持久,要么把原来的填充操作记录下来,每次都要调用, 要么画的时候就画在图片上,然后再显示图片.
您好,我按您的方法做了,成功了,非常感谢您。我想再问您一下,画图的时候我打开一张图片,为什么显示的只是这个图片的一部分,而且如果在上面做一个矩形,在画第二个矩形的时候第一个矩形会挪位置,画第三个矩形的时候,第二个矩形又会挪位置,这是什么原因?
tcmakebest 2015-05-07
  • 打赏
  • 举报
回复
Form1_Paint就是纯一次性显示用的,是画在屏幕上的无法保存的,最小化再显示肯定消失. 要实现持久,要么把原来的填充操作记录下来,每次都要调用, 要么画的时候就画在图片上,然后再显示图片.
assky124 2015-05-07
  • 打赏
  • 举报
回复
强制执行下Paint事件而已,最好不要这样调用 Control都有Invalid 和Refresh方法,可以刷新界面
简单创造 2015-05-07
  • 打赏
  • 举报
回复
大神,我一直不了解这个有什么用,this.Form1_Paint(this, new PaintEventArgs(this.CreateGraphics(), this.ClientRectangle));能给我解答一下么?
简单创造 2015-05-07
  • 打赏
  • 举报
回复
是这样子的,我用 g.FillEllipse(b1, elli);对椭圆进行填充了,但是画第二个椭圆的时候第一次填充的东西就没有了。是要把填充的储存起来么?
assky124 2015-05-07
  • 打赏
  • 举报
回复

public class Form{
    List<IShape> shapes;
    OnPaint(e){
        foreach(shape in shapes){shape.Draw(e.Graphics);}
    }
}
assky124 2015-05-07
  • 打赏
  • 举报
回复
太长,懒得看,你应该定义一个对象列表

public interface IShape{
  draw(Graphics g);
}

public class Line{
  public draw(g){
     //TODO DrawLine
  }
}

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧