C# 在面板处于活动状态时绘制面板边框滚动

C# 在面板处于活动状态时绘制面板边框滚动,c#,.net,custom-controls,panel,system.drawing,C#,.net,Custom Controls,Panel,System.drawing,我在尝试创建面板边框时遇到了问题,首先我将属性面板设置为:“AutoScroll=true;” 然后我将边框图形代码放入面板事件: ControlPaint.DrawBorder(e.Graphics, ClientRectangle, Color.Black, 5, ButtonBorderStyle.Solid, Color.Black, 5, ButtonBorderStyle.Solid,

我在尝试创建面板边框时遇到了问题,首先我将属性面板设置为:“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);
事实上,我还有第二个问题,我会在这里解释。。我希望你不介意。 当面板滚动处于活动状态时,面板边框将发生一些崩溃。请看图片:

就连我

`e.Graphics.TranslateTransform(this.AutoScrollPosition.X, this.AutoScrollPosition.Y);`
它看起来不像一个边框面板,因为当滚动处于活动状态时,它只是在面板内部绘制一个矩形。这不是我所期望的,但我需要一个边框

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

这不会很好地工作,您正在与名为“拖动时显示窗口内容”的Windows系统选项进行斗争。它在所有最新的Windows版本中都已打开,您无法合理地将其关闭。该选项的作用是在操作滚动条时以优化的方式滚动窗口内容。它按滚动量复制窗口像素,并要求重新绘制滚动显示的窗口部分

问题是,这也移动了你的画框。因此,您将看到底部的黑线也向上移动。但它不会被删除,因为Windows只要求重新绘制滚动显示的窗口部分。所以它“抹黑”。顶行消失了,开始滚动。要修复此问题,需要重新绘制整个窗口。通过实现面板控件的滚动事件,操作简单:

    private void panel1_Scroll(object sender, ScrollEventArgs e) {
        panel1.Invalidate();
    }
这解决了问题,但您可能仍然会注意到较慢机器上的工件。这条黑线仍在向上移动,以便您的绘制事件处理程序再次快速地过度绘制。“快速”是问题所在,如果没有那么快,你仍然会看到这条线移动。这个人工制品,呃,很有趣,你会看到这条线在做pogo,上下跳跃。人类的眼睛对这样的运动非常敏感,能够在高高的稀树草原上发现狮子是一种进化优势

试图让对象在滚动窗口中保持静止并不能很好地工作。您可以使用panel控件,并为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);
    }

或者更简单一些,设置面板的边框样式。

为什么不使用
FlowLayoutPanel
?@DonA我想也会出现同样的问题。因为我所说的问题是:我们如何用我自己的自定义代码绘制面板的边框。当我们用活动卷轴绘制自己的边框时,问题就会出现。因此,即使我们使用FlowLayoutPanel,我想也会出现同样的问题,因为FlowLayoutPanel也有一个AutoScrolI意味着在
面板内部放置一个
FlowLayoutPanel
——在不弄乱自定义边框的情况下绘制面板和内容滚动条。这是一个非常聪明的主意。谢谢