gpt4 book ai didi

c# - 面板处于事件状态滚动时绘制边框

转载 作者:行者123 更新时间:2023-12-02 21:53:00 25 4
gpt4 key购买 nike

我在尝试制作面板边框时遇到了问题,首先我将我的属性面板设置为:"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);`

它看起来不像边框面板,因为当滚动处于事件状态时,它只是在面板内部绘制一个矩形。这不是我所期望的,但我需要一个Border

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

最佳答案

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

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

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

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

试图让对象在滚动窗口中保持静止是行不通的。您可以随意使用面板控件并为 WM_NCCALCSIZE 实现一个消息处理程序来为面板提供一个非客户区,但这非常痛苦。

简单的解决方案是让 Form 在面板周围画一个矩形:

    protected override void OnPaint(PaintEventArgs e) {
var rc = panel1.Bounds;
rc.Inflate(1, 1);
e.Graphics.DrawRectangle(Pens.Black, rc);
base.OnPaint(e);
}

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

关于c# - 面板处于事件状态滚动时绘制边框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18246467/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com