我有一个可以覆盖GUI中多个C#用户控件的Control。这个控件有一个半透明的背景,以便“灰显”GUI的部分,这个类看起来像是这样的想法:
public greyOutControl: UserControl
{
// Usual stuff here
protected overide OnPaint()
{
paintBackround();
base.OnPaint();
}
}
目前,控件有时会陷入循环并不断重新绘制背景,使半透明颜色显得越来越透明。
我打击这个的想法如下(广义而言):
1)确定greyOutControl在哪个控件之上 2)在这些控件上调用Refresh()来更新显示 3)继续绘制greyOutControl。
我的问题是:如何确定greyOutControl与哪些控件重叠?或者是否有一种方法可以只刷新greyOutControl所涵盖的GUI部分?
答案 0 :(得分:2)
为什么不跟踪透明控件并在绘制完所有其他控件后绘制它们?在Z顺序顶部绘制任何内容都不应该导致其他控件重新绘制。
答案 1 :(得分:0)
我没有看到找到重叠控件的直接方法。我想你可能需要检查整个控制树来找出它。关于刷新,您可以使用Control.Invalidate(Rectangle)
方法指定要刷新的部分。
答案 2 :(得分:0)
我发现这个问题的解决方案是以编程方式拍摄被覆盖区域的屏幕截图,然后使用该图像作为覆盖控件的背景。然后,您可以将Alpha叠加层放入OnPaint()方法中的图像中,并使控件正确绘制。
这样做的缺点是背景在重叠控件中没有更新,但是除非有许多事件处理程序在观察某些内容是否发生了变化,然后更新了重叠控件,否则无法解决问题。有时我后悔没有尝试使用WPF!