【问题标题】:Draw Border of Panel When it is being Active Scroll活动滚动时绘制面板边框
【发布时间】:2013-08-15 04:44:41
【问题描述】:

我在尝试制作面板边框时遇到问题,首先我将我的属性面板设置为:"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我认为它是完美的面板,虽然它很简单。 请帮我解决这个问题。这让我很困惑

【问题讨论】:

  • 你为什么不使用FlowLayoutPanel
  • @DonA 我猜它会发生同样的问题。因为我的意思是:我们如何用我自己的带有代码的自定义绘图来绘制面板的边框。当我们使用活动滚动绘制自己的边框时会出现问题。所以即使我们使用 FlowLayoutPanel 我猜也会出现同样的问题,因为 FlowLayoutPanel 也有一个 AutoScroll
  • 我的意思是在您的Panel 中添加一个FlowLayoutPanel - 绘制您的面板并且内容滚动而不会弄乱您的自定义边框。

标签: c# .net custom-controls panel system.drawing


【解决方案1】:

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

麻烦的是,这也移动了你的画边框。所以你会看到底部的黑线也向上移动。但它并没有被删除,因为 Windows 只要求重新绘制由滚动显示的窗口部分。所以它“涂抹”。顶行消失,滚动关闭。要解决此问题,您需要重新绘制 整个 窗口。通过实现面板控件的滚动事件很容易做到:

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

这解决了问题,但您可能仍会注意到速度较慢的机器上的伪影。那条黑线仍在向上移动,以便您的 Paint 事件处理程序再次快速覆盖。 “快速”是问题所在,如果不是那么快,那么您仍然会看到那条线移动。这个神器,嗯,很有趣,你会看到这条线在做 pogo,上下跳跃。人眼对这样的运动非常敏感,能够擅长在高大的稀树草原中检测狮子是一种进化优势。

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

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

【讨论】:

  • 这是一个非常聪明的主意。谢谢。
猜你喜欢
  • 2012-10-29
  • 1970-01-01
  • 1970-01-01
  • 2013-10-19
  • 2011-05-17
  • 1970-01-01
  • 1970-01-01
  • 2017-03-31
  • 1970-01-01
相关资源
最近更新 更多