我在这里和其他网站上关注了许多帖子,为WinForms创建具有“真实”透明度(即,它不仅继承了其所在容器的背景色)的透明面板控件。
这是我派生的面板类,因此您可以了解我的做法:
namespace TransparencyPOC
{
public partial class TransPictureBox : Panel
{
public TransPictureBox()
{
InitializeComponent();
}
public TransPictureBox(IContainer container)
{
container.Add(this);
InitializeComponent();
}
protected override void OnPaintBackground(PaintEventArgs e)
{
//do nothing
}
protected override void Onmove(EventArgs e)
{
RecreateHandle();
}
protected override CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;
cp.ExStyle |= 0x20; //WS_EX_TRANSPARENT
return cp;
}
}
private Image m_Image;
public Image Image
{
get
{
return m_Image;
}
set
{
m_Image = value;
}
}
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
Graphics g = e.Graphics;
Bitmap bmp = new Bitmap(m_Image);
bmp.MakeTransparent();
g.DrawImage(bmp,100,100);
g.Dispose();
}
}
}
我正在使用此面板控件来保存具有透明背景的PNG,并且需要将其定位在其他控件上方,例如其他透明面板,按钮等。
两个问题:
- 如果将此面板部分地放置在按钮控件上,则只能在面板不与控件重叠的区域中单击按钮。有什么方法可以使悬停和单击事件通过透明面板,以便当我在按钮上悬停或单击任何位置时,即使按钮的某些部分被PNG遮盖,按钮也会收到这些单击?假定这是动态的,即我不知道该图像位于上方的控制位置,只是希望它能够通过悬停并单击进入其下方的任何内容。
- 当我将鼠标悬停在面板未覆盖的部分按钮上时,按钮会在透明面板上方重新绘制自身的颜色(之前和之后请参见下图)
悬停之前:
悬停后:
问题:
- 我可以允许按钮在透明面板中徘徊/单击吗?理想情况下,我希望基础按钮的任何可见部分都是可悬停/可点击的,但是,如果那不是可行的,那么我希望它是可单击/悬停的,就像上面没有任何东西一样。
- 当我将按钮悬停在面板上时,是否可以防止它在面板上重绘?和/或在发生这种情况时触发面板的重新粉刷?
提前谢谢!