我有一个透明背景的面板。当我向控件添加其中一些时,索引最高的子项将呈现在顶部。有人能告诉我发生了什么以及如何解决这个问题吗?
这是小组的代码:
public ref class TransparentPanel : public Panel
{
public:
Bitmap^ _image;
TransparentPanel(Bitmap^ image){_image = image;Width = image->Width;Height = image->Height;}
virtual property System::Windows::Forms::CreateParams^ CreateParams{
System::Windows::Forms::CreateParams^ get(void) override {
System::Windows::Forms::CreateParams^ cp = Panel::CreateParams;
cp->ExStyle |= 0x00000020;//WS_EX_TRANSPARENT
return cp;
}
}
virtual void OnPaintBackground(PaintEventArgs^ e) override {}
virtual void OnPaint(PaintEventArgs^ e) override {e->Graphics->DrawImage(_image, Rectangle(0, 0, Width, Height));}
};
答案 0 :(得分:0)
不确定您的期望,但通常的做法是将最后插入的控件绘制在之前的控件之上。
如果您有精确的订购,您可以使用z-indexing进行播放,以便正确定位面板。
否则你不能简单地以相反的顺序插入它们;)应该解决这个问题。
答案 1 :(得分:0)
我知道这个问题已经过了一年多了,但我现在已经在几天内遇到类似的问题了。由于我现在已经找到了一个似乎有效的解决方案,我以为我会在这里发布给未来的患者(包括我自己!)。
似乎为一系列相互叠加的自定义绘制控件设置 WS_EX_TRANSPARENT 样式(0x20)具有奇怪的效果,即它们按照与其z-相反的顺序绘制顺序,即z-index为0的控件将首先被绘制(为了测试它,在你重写的OnPaint方法中将每个控件的z-index写入控制台)。
到目前为止似乎对我有用的解决方案是扩展父控件(在我的例子中是一个DevExpress PanelControl,虽然我也尝试过使用标准的.Net Panel)并启用 WS_EX_COMPOSITED 扩展窗口样式:
protected override CreateParams CreateParams {
get {
CreateParams cp = base.CreateParams;
cp.ExStyle |= 0x02000000; //WS_EX_COMPOSITED
return cp;
}
}
此样式设置只是反转绘制子控件的顺序(因此它从下到上),从而解决了问题:)
有关扩展窗口样式的详细信息,请参阅此处:http://msdn.microsoft.com/en-us/library/windows/desktop/ff700543(v=vs.85).aspx 这个页面警告说在Windows 8中会有闪存,但是我在Windows 8.1中尝试过并没有看到任何问题,所以可能已经修复了。
我只能假设.NET控件以某种方式呈现不同(可能使用裁剪区域等),这就是为什么它们没有表现出相同的行为,但是从上到下的绘制控件确实看起来像一个bug对我来说,因为我无法想到你想要这样做的情况!