2012-01-17 12 views
0

私はコンテナのレイヤーを行う必要があるプロジェクトを持っています。"ガラス"の背景を持つコントロールを作成するには?

コンテナのようなものを持っている必要があります

Form.Opacity = 0; 

ユーザーは、トップ層の下の要素を見ることができますが、それらを使用することはできません。

私は透明な背景を持つ多くの例を見ましたが、私のやり方では、このコンテナ上の要素を移動する必要があります。私が見つけたものより良い:

class xPanel : Panel 
{ 
    public xPanel() 
    { 
    SetStyle(ControlStyles.Opaque, true); 
    } 

    protected override CreateParams CreateParams 
    { 
    get 
    { 
     CreateParams createParams = base.CreateParams; 
     createParams.ExStyle |= 0x00000020; // WS_EX_TRANSPARENT 
     return createParams; 
    } 
    } 

    protected override void OnPaint(PaintEventArgs e) 
    { 
    //PaintParentBackground(e); 
    e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(0, Color.White)), 
     0, 0, Width, Height); 
    } 

    public void InvalidateEx() 
    { 
    if (Parent == null) 
     return; 
    Rectangle rc = new Rectangle(this.Location, this.Size); 
    Parent.Invalidate(rc, true); 
    } 
} 

しかし、ドラッグ要素間トレイル、または再描画に点滅があります。

この問題の解決方法はわかりません。アイデアはありますか?

私はInvalidateEx()を使用し

、中:

protected override void OnLocationChanged(EventArgs e) 
{ 
    if (Parent != null) 
    ((xPanel)Parent).InvalidateEx(); 
} 

答えて

0

ので、背景を再描画しません

protected override OnPaintBackground(...) 
{ 
    //base.OnPaintBackground(...); 
} 

を追加しようと、少なくとも、点滅を削除する必要があります。

これが役に立ちます。

+0

申し訳ありませんが、点滅していますが、より速く動作します。 ます。private void element_MouseMove(オブジェクト送信者、MouseEventArgs e)の { (e.Button == MouseButtons.Left)であれば { ((DrawElement)送信者).LEFT + =のeX - SL:私は中、)(InvalidateExを使用します.X + SP.X; ((DrawElement)送信者)。トップ+ = e.Y - SL.Y + SP.Y; ((xPanel)親).InvalidateEx(); } } 申し訳ありません、ここにコードを書く方法がわかりません=) – justAuser

+0

問題のコード^ – justAuser

+0

@justAuser:ダブルバッファリングを有効にしましたか? – Tigran

0

パネルのBackColorプロパティとTransparancyKeyプロパティを同じにすると、パネルは透明になります。しかし、一般的に使用されていない色を選択してみてください。

+0

TransparancyKeyを使用すると、私のコンピュータの背景が表示されます...私は要素を戻す必要があります...そして、ユーザーはこの色を1日選択することができます(それはバグのようになります) – justAuser

関連する問題