当面板被激活滚动时,绘制边框。

3

我在尝试制作面板边框时遇到了问题。首先,我将我的属性面板设置为"AutoScroll = true;",然后将边框绘制代码放入面板事件中:

    ControlPaint.DrawBorder(e.Graphics, 
        ClientRectangle,  
        Color.Black, 5, 
        ButtonBorderStyle.Solid,
        Color.Black, 5, ButtonBorderStyle.Solid, 
        Color.Black, 5, ButtonBorderStyle.Solid,
        Color.Black, 5, ButtonBorderStyle.Solid);

实际上我还有第二个问题,我会在这里解释一下。希望你不介意。 当面板滚动时,面板边框会出现一些崩溃。看一下这张图片: enter image description here 即使我放置了

标签,问题仍然存在。
`e.Graphics.TranslateTransform(this.AutoScrollPosition.X, this.AutoScrollPosition.Y);`

它看起来不像是一个边框面板,因为当滚动条被激活时,它只是在面板内部绘制一个矩形。这不是我期望的,但我需要一个边框

我敢打赌,问题出在源代码上,这并不是因为不可能实现,看看System.Windows.Forms.Panel,我认为它是完美的面板,尽管它很简单。 请帮助我解决这个问题。这让我感到困惑。


为什么你不使用 FlowLayoutPanel - undefined
@DonA我猜这个问题会出现相同的情况。因为我指的问题是:如何使用自定义代码绘制面板的边框。当我们使用活动滚动时,这个问题会发生。所以,即使我们使用FlowLayoutPanel,我猜也会出现相同的问题,因为FlowLayoutPanel也具有AutoScroll功能。 - undefined
我的意思是在你的面板内放置一个FlowLayoutPanel - 绘制你的面板并且内容可以滚动而不会破坏你自定义的边框。 - undefined
1个回答

6

这样做效果不好,你正在与Windows系统选项“拖动时显示窗口内容”作斗争。在所有最新的Windows版本中,它都已经开启,你不能合理地关闭它。该选项的作用是在你操作滚动条时以一种优化的方式滚动窗口内容。它通过滚动量复制窗口像素并要求重新绘制被滚动揭示的窗口部分。

问题是,它也移动了你绘制的边框。 因此,您将看到底部的黑线也向上移动。但是它没有被擦除,因为Windows仅请求重新绘制被滚动揭示的窗口部分。所以它会“涂抹”。 顶部的线就消失了,被滚动掉了。 要解决这个问题,需要重新绘制整个窗口。 通过实现面板控件的滚动事件很容易实现:

    private void panel1_Scroll(object sender, ScrollEventArgs e) {
        panel1.Invalidate();
    }

那样可以解决问题,但是在较慢的计算机上仍然可能会出现一些问题。这条黑线仍然被向上移动,然后很快就被Paint事件处理程序再次覆盖。如果这个过程不够快,那么您仍然会看到那条线在移动。这个现象有点"有趣",你会看到这条线上下弹跳。人眼对这种运动非常敏感,这是进化中具有优势的能力,可以帮助我们在高草丛中发现狮子。
尝试在滚动窗口中保持对象静止并不太有效。您可以调整面板控件并实现WM_NCCALCSIZE的消息处理程序,以为面板提供一个非客户区域,但这相当麻烦。
简单的解决方法是让窗体在面板周围画一个矩形:
    protected override void OnPaint(PaintEventArgs e) {
        var rc = panel1.Bounds;
        rc.Inflate(1, 1);
        e.Graphics.DrawRectangle(Pens.Black, rc);
        base.OnPaint(e);
    }

或者更简单地,设置面板的BorderStyle。

这是一个非常聪明的想法。谢谢。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接