自定义了一个Panel,每次Resize的时候,它的背景图都要重新画一下。因为它的背景比较特殊,右边是固定不变大小的图,然后左边是能拉伸的图,所以必须接管Paint事件。
代码如下,我想我已经用了双缓冲的概念。
private void CustomPanel_Paint(object sender, PaintEventArgs e)
{
Bitmap localBitmap = new Bitmap(ClientRectangle.Width, ClientRectangle.Height);
Graphics g = Graphics.FromImage(localBitmap);
Bitmap img = (Bitmap)this.BackgroundImage;
Color bkcolor = img.GetPixel(img.Width / 2, img.Height - 2);
g.Clear(bkcolor);
Rectangle regBack = new Rectangle(new Point(0, 0), new Size(this.Width - 100, 100));
Rectangle reg = new Rectangle(0, 0, 1, img.Height);
g.DrawImage(img, regBack, reg, GraphicsUnit.Pixel);Rectangle regImage = new Rectangle(new Point(this.Width - 100, 0), new Size(100, 100));
g.DrawImage(img, regImage);
//画边框的代码就省略了
e.Graphics.DrawImage(localBitmap, 0, 0);
}
/////////////////////////////////////////////////
现在的问题,当这个Panel上放置了一些控件的时候,拉伸panel,这些控件跟着移动时,会有很明显的闪,好像是白了一下。我也尝试了设置Panel的双缓冲属性
SetStyle(ControlStyles.DoubleBuffer, true);
SetStyle(ControlStyles.AllPaintingInWmPaint, true);
SetStyle(ControlStyles.UserPaint, true);
一旦加了这个,图根本显示不出来。有没有高人帮忙解决!

解决方案 »

  1.   

    资源我有立刻放掉。还是闪啊,闪的非常厉害,找了好多避免闪的文章,都是针对当前控件
    如果想让它的子控件不闪,不知道OnPaint里面该怎么写
      

  2.   

    你启动双缓冲绘图可能会好些,2005直接由支持http://community.csdn.net/Expert/topic/5385/5385667.xml?temp=.5261652或者使用cnming的方法
      

  3.   

    我用了BufferedGraphicsContext来启动双缓冲,发现效果还是不尽人意。
    就是一个背景的重画,为啥就会那么闪呢?真奇怪啊