winfrom程序中,给Panel.BackgroundImage设置大图片后,拉动滚动条后,背景图破碎形成百叶窗效果,如何解决

时间:2020-12-27 04:55:57
winfrom程序中,给Panel.BackgroundImage设置大图片作为背景图片,拉动滚动条后,背景图破碎形成百叶窗效果,如何解决?

网上搜了一下,好像需要用到重绘?但是苦于没有具体的例子,谁能具体指点一下

17 个解决方案

#1


OnPaint中画,加双缓冲,试试呢

#2


双缓冲的方法 我是这么做的:
1.写了一个类 public class PanelEx : Panel
然后在这个类PanelEx 中写了一个 构造函数
 public PanelEx()
{
    SetStyle(ControlStyles.UserPaint, true);
    SetStyle(ControlStyles.AllPaintingInWmPaint, true);   //   禁止擦除背景. 
    SetStyle(ControlStyles.DoubleBuffer, true);
}
然后用这个类PanelEx去操作, 但是没有效果

#3


引用 1 楼 bdmh 的回复:
OnPaint中画,加双缓冲,试试呢



OnPaint中画 

这个怎么画? 能给个例子嘛?

#4


有人帮忙看看不.......

#5


form1.DoubleBuffered=true;

#6


容器类控件在滚动具有大背景图的情况时,会出现抖动,这个是.NET性能造成的。目前除了自己编写需要的控件外,别无其他完美的方法。

#7


c#高级编程里面有关于滚动条滚动后重新绘制滚动区域的例子,可以参考下


也就是说只是重新绘制可显示的部分即可

#8


引用 7 楼 pengcwl 的回复:
c#高级编程里面有关于滚动条滚动后重新绘制滚动区域的例子,可以参考下


也就是说只是重新绘制可显示的部分即可


在OnPanit里面重画 注意 只要画 能显示部分即可

#9


引用 7 楼 pengcwl 的回复:
c#高级编程里面有关于滚动条滚动后重新绘制滚动区域的例子,可以参考下


也就是说只是重新绘制可显示的部分即可


目前在看这一部分章节,希望能找到解决方法 谢谢了

#10


搞不定啊, 有没有人帮忙看下

#11


你可以继承panel写一个自己的myPanel,在myPanel 中重写OnPaint事件,进行显示区域重绘,然后再自己的myPanel 中放一个size大于myPanel 的pictureBox,把图片放到picturebox里面,别设置为背景图
然后再用c#高级编程里面那个例子

#12


panel 里放稍大点的背景图片都会闪!  我当时也搞了好久...  最后还是没搞出来。 用pictureBox  代替了!

#13


双缓存能好一点,也只是好一点而已。

#14


可不可以将图片直接画到Panel上,在Panel尺寸发生变化时,改动你画图的区域大小。

#15


引用 11 楼 pengcwl 的回复:
你可以继承panel写一个自己的myPanel,在myPanel 中重写OnPaint事件,进行显示区域重绘,然后再自己的myPanel 中放一个size大于myPanel 的pictureBox,把图片放到picturebox里面,别设置为背景图
然后再用c#高级编程里面那个例子


恩 我现在差不多是用你这种思路,做了一个实现了. 现在拉动滚动条,不破碎了

#16


现在有一个问题是,我给panel 设置了背景图片, 但是这个背景图片会被放大. 比图片的实际大小还要大, 有人知道这个是怎么解决嘛?

#17


说以下我自己的做法吧

和pengcwl给我的思路雷同;

写了这么一个类

 public class PanelEx : Panel
    {
        public PanelEx()
        {
            SetStyle(ControlStyles.UserPaint, true);
            SetStyle(ControlStyles.AllPaintingInWmPaint, true);   //   禁止擦除背景. 
            SetStyle(ControlStyles.DoubleBuffer, true);
        }

        private Point rectangleTopLeft = new Point(0, 0);
        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);
            Graphics dc = e.Graphics;
            Bitmap bm = new Bitmap(@"E:\Work\WDO\Devlpment\V1\Main\Source\Code\Pic\b3.jpg");
            //这里是处理背景图变大的问题
            bm.SetResolution(96, 96);
            Size scrolloffset = new Size(this.AutoScrollPosition);
            dc.DrawImage(bm, rectangleTopLeft + scrolloffset);
        }

    }

#1


OnPaint中画,加双缓冲,试试呢

#2


双缓冲的方法 我是这么做的:
1.写了一个类 public class PanelEx : Panel
然后在这个类PanelEx 中写了一个 构造函数
 public PanelEx()
{
    SetStyle(ControlStyles.UserPaint, true);
    SetStyle(ControlStyles.AllPaintingInWmPaint, true);   //   禁止擦除背景. 
    SetStyle(ControlStyles.DoubleBuffer, true);
}
然后用这个类PanelEx去操作, 但是没有效果

#3


引用 1 楼 bdmh 的回复:
OnPaint中画,加双缓冲,试试呢



OnPaint中画 

这个怎么画? 能给个例子嘛?

#4


有人帮忙看看不.......

#5


form1.DoubleBuffered=true;

#6


容器类控件在滚动具有大背景图的情况时,会出现抖动,这个是.NET性能造成的。目前除了自己编写需要的控件外,别无其他完美的方法。

#7


c#高级编程里面有关于滚动条滚动后重新绘制滚动区域的例子,可以参考下


也就是说只是重新绘制可显示的部分即可

#8


引用 7 楼 pengcwl 的回复:
c#高级编程里面有关于滚动条滚动后重新绘制滚动区域的例子,可以参考下


也就是说只是重新绘制可显示的部分即可


在OnPanit里面重画 注意 只要画 能显示部分即可

#9


引用 7 楼 pengcwl 的回复:
c#高级编程里面有关于滚动条滚动后重新绘制滚动区域的例子,可以参考下


也就是说只是重新绘制可显示的部分即可


目前在看这一部分章节,希望能找到解决方法 谢谢了

#10


搞不定啊, 有没有人帮忙看下

#11


你可以继承panel写一个自己的myPanel,在myPanel 中重写OnPaint事件,进行显示区域重绘,然后再自己的myPanel 中放一个size大于myPanel 的pictureBox,把图片放到picturebox里面,别设置为背景图
然后再用c#高级编程里面那个例子

#12


panel 里放稍大点的背景图片都会闪!  我当时也搞了好久...  最后还是没搞出来。 用pictureBox  代替了!

#13


双缓存能好一点,也只是好一点而已。

#14


可不可以将图片直接画到Panel上,在Panel尺寸发生变化时,改动你画图的区域大小。

#15


引用 11 楼 pengcwl 的回复:
你可以继承panel写一个自己的myPanel,在myPanel 中重写OnPaint事件,进行显示区域重绘,然后再自己的myPanel 中放一个size大于myPanel 的pictureBox,把图片放到picturebox里面,别设置为背景图
然后再用c#高级编程里面那个例子


恩 我现在差不多是用你这种思路,做了一个实现了. 现在拉动滚动条,不破碎了

#16


现在有一个问题是,我给panel 设置了背景图片, 但是这个背景图片会被放大. 比图片的实际大小还要大, 有人知道这个是怎么解决嘛?

#17


说以下我自己的做法吧

和pengcwl给我的思路雷同;

写了这么一个类

 public class PanelEx : Panel
    {
        public PanelEx()
        {
            SetStyle(ControlStyles.UserPaint, true);
            SetStyle(ControlStyles.AllPaintingInWmPaint, true);   //   禁止擦除背景. 
            SetStyle(ControlStyles.DoubleBuffer, true);
        }

        private Point rectangleTopLeft = new Point(0, 0);
        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);
            Graphics dc = e.Graphics;
            Bitmap bm = new Bitmap(@"E:\Work\WDO\Devlpment\V1\Main\Source\Code\Pic\b3.jpg");
            //这里是处理背景图变大的问题
            bm.SetResolution(96, 96);
            Size scrolloffset = new Size(this.AutoScrollPosition);
            dc.DrawImage(bm, rectangleTopLeft + scrolloffset);
        }

    }