2012-01-17 41 views
0

我有一個項目,我需要做一層容器。如何使用「玻璃」背景進行控制?

容器必須有類似:

Form.Opacity = 0; 

用戶可以看到在頂層的元素,但不能使用它們。

我看到很多帶透明背景的例子,但以我的方式,我需要在此Container上移動元素。我發現的更好:

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

對不起,它閃爍,但工作更快。我用InvalidateEx(),在: 私人無效element_MouseMove(對象發件人,MouseEventArgs E) { 如果(e.Button == MouseButtons.Left) { ((DrawElement)發送器)。左+ =的eX - SL .X + SP.X; ((DrawElement)sender).Top + = e.Y - SL.Y + SP.Y; ((xPanel)Parent).InvalidateEx(); } } 對不起,我不知道如何在這裏寫代碼=) – justAuser 2012-01-17 08:33:13

+0

有問題的代碼^ – justAuser 2012-01-17 08:52:36

+0

@justAuser:你是否啓用雙緩衝? – Tigran 2012-01-17 09:05:48

0

如果使面板的BackColor和TransparancyKey屬性相同,面板將變爲透明。但嘗試選擇一種不常用的顏色。

+0

隨着TransparancyKey我會看到我的電腦的背景......我需要看回元素......用戶可以選擇一天這種顏色(它會像一個錯誤) – justAuser 2012-01-17 08:22:24