GDI绘制图形问题
在C#winform中我写了绘制矩形的方法如下,Graphicsg=panel1.CreateGraphics();g.Clear(panel1.BackColor);P...
在C# winform中我写了绘制矩形的方法如下,
Graphics g = panel1.CreateGraphics();
g.Clear(panel1.BackColor);
Pen p = new Pen(Color.Red);
g.DrawRectangle(p,0,0,10,10);
问题:
1.为什么我画出来的矩形在窗口切换焦点,或者用其他窗口档住一下这个矩形时,它就会消失,这是为什么啊?
2.就是如果我绘制的这个矩形我想把它清除掉应该怎么清除?我试过用g.clear(panel1.BackColor)方法来清除是可以的,但是它会把panel1的背景图片也清除了,现在就是清除它而不影响背景图片?
在这先谢谢各位高手了,在线等候。
areshh:你好!你的方法我试过了!第一个问题是可以确实可以不会消失,第二个我问题你的意思就是把图片和距形一起画到panel中去!我现在就是想路就是想在图片上面画矩形!矩形是可以随便变动的!就是当mouseDown点下的时候获得坐标,根据在mouseMove事件中根据坐标的移动而改变矩形大小,所以现在就是坐标不断改变的时候g.Clear(panel1.BackColor)都要把图片和矩形一起清空!所以我只想把画的东西清空,图片不变!如果是一起清空的话清空的频率太频繁了就会闪烁。
emptils:你的意思我明白!就如我上面说的矩形变化频繁了,你的方法也会出现闪烁的,有没有只清空距形的方法啊 展开
Graphics g = panel1.CreateGraphics();
g.Clear(panel1.BackColor);
Pen p = new Pen(Color.Red);
g.DrawRectangle(p,0,0,10,10);
问题:
1.为什么我画出来的矩形在窗口切换焦点,或者用其他窗口档住一下这个矩形时,它就会消失,这是为什么啊?
2.就是如果我绘制的这个矩形我想把它清除掉应该怎么清除?我试过用g.clear(panel1.BackColor)方法来清除是可以的,但是它会把panel1的背景图片也清除了,现在就是清除它而不影响背景图片?
在这先谢谢各位高手了,在线等候。
areshh:你好!你的方法我试过了!第一个问题是可以确实可以不会消失,第二个我问题你的意思就是把图片和距形一起画到panel中去!我现在就是想路就是想在图片上面画矩形!矩形是可以随便变动的!就是当mouseDown点下的时候获得坐标,根据在mouseMove事件中根据坐标的移动而改变矩形大小,所以现在就是坐标不断改变的时候g.Clear(panel1.BackColor)都要把图片和矩形一起清空!所以我只想把画的东西清空,图片不变!如果是一起清空的话清空的频率太频繁了就会闪烁。
emptils:你的意思我明白!就如我上面说的矩形变化频繁了,你的方法也会出现闪烁的,有没有只清空距形的方法啊 展开
2个回答
展开全部
一、消失问题:绘制动作要加在Paint事件中。
二、背景问题:不要单独设背景,在绘制时再绘制背景。
public Form1()
{
InitializeComponent();
this.Paint += new PaintEventHandler(Form1_Paint);
}
void Form1_Paint(object sender, PaintEventArgs e)
{
Graphics g = panel1.CreateGraphics();
Bitmap bmp = xxxxx;//背景图片
g.Clear(panel1.BackColor);
Pen p = new Pen(Color.Red);
g.DrawImage(bmp, 0, 0);
g.DrawRectangle(p, 0, 0, 10, 10);
}
===========================
用双缓存可以解决闪的问题,下面的代码经测试过了,不会闪
public partial class Form1 : Form
{
Point p1 = new Point(0, 0);
Point p2 = new Point(0, 0);
bool isDown = false;
Bitmap bmpBuff;
Bitmap bmp;
public Form1()
{
InitializeComponent();
bmpBuff = new Bitmap(panel1.Width, panel1.Height);//背景图片
bmp = new Bitmap(panel1.Width, panel1.Height);//背景图片
this.Paint += new PaintEventHandler(Form1_Paint);
this.panel1.MouseDown += new MouseEventHandler(Form1_MouseDown);
this.panel1.MouseUp += new MouseEventHandler(Form1_MouseUp);
this.panel1.MouseMove += new MouseEventHandler(Form1_MouseMove);
}
void Form1_MouseMove(object sender, MouseEventArgs e)
{
p2 = new Point(e.X, e.Y);
this.Invalidate();
}
void Form1_MouseUp(object sender, MouseEventArgs e)
{
isDown = false;
p1 = new Point(0, 0);
p2 = new Point(0, 0);
}
void Form1_MouseDown(object sender, MouseEventArgs e)
{
p1 = new Point(e.X, e.Y);
isDown = true;
}
void Form1_Paint(object sender, PaintEventArgs e)
{
Graphics gb = Graphics.FromImage(bmpBuff);
Pen p = new Pen(Color.Red);
gb.Clear(Color.Green);
gb.DrawImage(bmp, 0, 0);
if (isDown)
gb.DrawRectangle(p, p1.X, p1.Y, p2.X-p1.X, p2.Y-p1.Y);//这里你要判断下p1 p2的位置
gb.Dispose();
Graphics gp = panel1.CreateGraphics();
gp.DrawImage(bmpBuff, 0, 0);
}
}
二、背景问题:不要单独设背景,在绘制时再绘制背景。
public Form1()
{
InitializeComponent();
this.Paint += new PaintEventHandler(Form1_Paint);
}
void Form1_Paint(object sender, PaintEventArgs e)
{
Graphics g = panel1.CreateGraphics();
Bitmap bmp = xxxxx;//背景图片
g.Clear(panel1.BackColor);
Pen p = new Pen(Color.Red);
g.DrawImage(bmp, 0, 0);
g.DrawRectangle(p, 0, 0, 10, 10);
}
===========================
用双缓存可以解决闪的问题,下面的代码经测试过了,不会闪
public partial class Form1 : Form
{
Point p1 = new Point(0, 0);
Point p2 = new Point(0, 0);
bool isDown = false;
Bitmap bmpBuff;
Bitmap bmp;
public Form1()
{
InitializeComponent();
bmpBuff = new Bitmap(panel1.Width, panel1.Height);//背景图片
bmp = new Bitmap(panel1.Width, panel1.Height);//背景图片
this.Paint += new PaintEventHandler(Form1_Paint);
this.panel1.MouseDown += new MouseEventHandler(Form1_MouseDown);
this.panel1.MouseUp += new MouseEventHandler(Form1_MouseUp);
this.panel1.MouseMove += new MouseEventHandler(Form1_MouseMove);
}
void Form1_MouseMove(object sender, MouseEventArgs e)
{
p2 = new Point(e.X, e.Y);
this.Invalidate();
}
void Form1_MouseUp(object sender, MouseEventArgs e)
{
isDown = false;
p1 = new Point(0, 0);
p2 = new Point(0, 0);
}
void Form1_MouseDown(object sender, MouseEventArgs e)
{
p1 = new Point(e.X, e.Y);
isDown = true;
}
void Form1_Paint(object sender, PaintEventArgs e)
{
Graphics gb = Graphics.FromImage(bmpBuff);
Pen p = new Pen(Color.Red);
gb.Clear(Color.Green);
gb.DrawImage(bmp, 0, 0);
if (isDown)
gb.DrawRectangle(p, p1.X, p1.Y, p2.X-p1.X, p2.Y-p1.Y);//这里你要判断下p1 p2的位置
gb.Dispose();
Graphics gp = panel1.CreateGraphics();
gp.DrawImage(bmpBuff, 0, 0);
}
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询