【发布时间】:2021-01-28 23:56:43
【问题描述】:
我一直在开发一个基于 Windows 窗体的小型程序(使用 C#),大约 3 周前我才开始开发。我遇到的这个问题可能没有解决方案,但我想我会问,以防有人有解决方案。我也不擅长解释事情,所以如果您有任何其他问题,我很乐意回答!
所以,我遇到的具体问题是,当我使用滚动条时,我的文本出现故障/轨迹,然后当我停止滚动时,文本看起来很正常。请记住,背景是渐变的,我尝试过使用双缓冲,改变了一些改变性能的东西,以及与双缓冲相关的一些其他东西,但无济于事。这个问题在没有渐变的情况下不太明显,但是当我使用渐变而不是纯色作为背景时,“拖尾”更为普遍。我确实有很多面板和标签位于渐变背景之上,它们也是透明的。
这是我用于渐变的代码:
private void MainForm_Paint(object sender, PaintEventArgs e)
{
LinearGradientBrush brush = new LinearGradientBrush(this.ClientRectangle, Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(180)))), ((int)(((byte)(255))))), Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(30)))), ((int)(((byte)(70))))), 90F);
e.Graphics.FillRectangle(brush, this.ClientRectangle);
}
同样,我不确定为什么会出现这个问题,但我不知道这可能只是 Windows 窗体的限制。如果查看此内容的任何人遇到此问题并有解决方案,我将乐于听取!谢谢你,祝你有美好的一天!
【问题讨论】:
-
首先,更改为:
using (var brush = new LinearGradientBrush(this.ClientRectangle, Color.FromArgb(0, 180, 255), Color.FromArgb(0, 30, 70), 90F)) { e.Graphics.FillRectangle(brush, this.ClientRectangle); }。 -- 什么文本出故障?您是否在透明面板上绘制文本?你是如何让这些面板透明的?无论如何,面板都不是双缓冲的(除非您执行特定的操作来启用该功能 - 这在这里很可能无济于事),但如果这适合您的 layout,它可能不是一个 sense 选择。 -
如果你真的想要这种渲染,你需要非常小心如何在 WinForms 中使用和创建自定义对象。如果 - 如前所述 - 我所描述的内容实际上与您当前的设置相匹配,那么迁移到 WPF 可能是一个更好的主意。但是,当然,您应该提供该描述。
-
@Jimi 啊,我明白了。我也会做出这些改变。出现故障的文本是面板顶部的文本(通过标签),面板本身似乎是这种奇怪故障的一部分。我相信我在透明面板上绘制文字是的。我还使面板透明,但通过 Visual Studio Community 2019 中的外观选项卡将“BackColor”更改为透明。我也不知道面板不是双缓冲的。也许显示问题的图片可能会有所帮助?
-
我不知道你在那里做什么。无论如何,您不能在 WinForms 中使用自动保留分层透明度的重叠透明控件(因为它根本不存在)。您需要伪造 Container Controls(您的面板),在BufferedGraphics 对象(或多个对象)中绘制所有内容。没那么容易,在这个阶段。
-
@Jimi 我明白了,我很害怕,但我会尝试更多地了解 BufferedGraphics 等。我也不希望这个程序接近完美,考虑到它是我的第一个项目,在我了解更多关于 C# 并转向 WPF 之前,我暂时只想要一个函数式程序。仅供参考,以下是我的具体问题:drive.google.com/drive/folders/…