GDI绘制图形问题

来源:百度知道 编辑:UC知道 时间:2024/06/18 03:55:05
在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:你的意思我明白!就如我上面说的矩形变化频繁了,你的方法也会出现闪烁的,有没有只清空距形的方法啊

一、消失问题:绘制动作要加在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 Bitm