0

背景が透明なパネルがあります。これらのいくつかをコントロールに追加すると、インデックスが最も高い子が一番上にレンダリングされます。誰かが何が起こっているのか、どうすればこれを解決できるのか教えてもらえますか?

これはパネルのコードです:

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));}
};
4

2 に答える 2

0

私はこの質問が1年以上前のものであることを知っていますが、私は数日間同様の問題に苦しんでいます. うまくいくと思われる解決策を見つけたので、将来の患者のためにここに投稿すると思いました(私自身も含まれています!)。

互いの上にある一連のカスタム ペイント コントロールにWS_EX_TRANSPARENTスタイル (0x20) を設定すると、z オーダーとは逆の順序でペイントされるという奇妙な効果があるようです。つまり、z インデックスが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 コントロールが何らかの方法でレンダリングされると仮定することしかできません (クリッピング領域などを使用する可能性があります)。これが、同じ動作を示さない理由ですが、コントロールを上から下にペイントすることは、私にはバグのように思えます。あなたがそれをしたい状況を考えないでください!

于 2014-09-25T11:50:33.180 に答える
0

何を期待しているのかわかりませんが、最後に挿入されたコントロールを前のコントロールの上に描画するのが一般的な方法です。

正確な順序がある場合は、パネルが正しく配置されるように z-indexing で遊ぶことができます。

それ以外の場合は、単に逆の順序で挿入することはできません;)これで問題が解決するはずです。

于 2013-06-07T17:21:42.877 に答える