透明面板无法正确呈现滚动条

时间:2011-01-26 20:36:18

标签: c# .net

我希望我的面板真正透明,所以我按照本文的说明操作: http://www.bobpowell.net/transcontrols.htm

但是,我强制我的面板始终显示垂直滚动条。它最初不会被渲染,除非我将鼠标光标悬停在它上面,此时它开始出现。除了将VerticalScroll.Visible设置为true之外,还可以在上面的文章中添加更多内容以确保我的面板的滚动条始终可见?

这是我到目前为止我的自定义Panel类。这是在Visual Studio 2010中使用C#.NET 4.0:

public class SkinnedList : Panel
{
    protected override CreateParams CreateParams
    {
        get
        {
            CreateParams cp = base.CreateParams;
            cp.ExStyle |= 0x00000020; // WS_EX_TRANSPARENT
            return cp;
        }
    }

    public SkinnedList()
    {
        AdjustFormScrollbars( true );
    }

    public new void AdjustFormScrollbars( bool visible )
    {
        VerticalScroll.Visible = true;
        HorizontalScroll.Visible = false;
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);
    }

    protected override void OnPaintBackground(PaintEventArgs e)
    {
        // Do not render background
    }

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

2 个答案:

答案 0 :(得分:1)

这是你选择的窗口样式。控件是透明的,这意味着如果不是活动的,它应该混合到背景中,并且只在需要时才是交互式的。

一些建议,我不知道它们中的任何一个是否适合您的情况:

  • 将透明面板嵌套在普通面板中,并使透明的AutoSize本身适合其内容。然后,滚动条将位于包含的面板上,并将滚动自动调整的透明面板。这样可以根据需要始终显示滚动条,但可能会破坏透明效果。

  • 将透明面板放在UserControl中,该控件具有导航按钮(向上,向下,向上翻页,向下翻页等),这些按钮将触发透明面板上的事件(Scroll是最重要的)。这将要求您的透明Panel具有按钮单击事件的处理程序,在该事件中它将调用其自己的OnScroll()方法。这看起来不像标准的滚动条,你将无法点击和拖动(除非你使用滑块),但你可以轻松地绕行。

答案 1 :(得分:1)

InvalidateEx()方法不正确,您需要将矩形从面板坐标映射到父坐标。像这样:

protected void InvalidateEx() {
    if (Parent != null) {
        Rectangle rc = new Rectangle(0, 0, this.ClientSize.Width - SystemInformation.VerticalScrollBarWidth, this.ClientSize.Height);
        rc = this.RectangleToScreen(rc);
        rc = Parent.RectangleToClient(rc);
        Parent.Invalidate(rc, false);
    }
}

获取滚动条的最佳方法是使用AutoScrollMinSize属性:

public SkinnedList() {
    this.AutoScroll = true;
    this.AutoScrollMinSize = new Size(0, 1000);
    this.Scroll += delegate { this.InvalidateEx(); };
}

这应该解决你的问题,除了一个。您会注意到“拖动时显示窗口内容”系统选项的效果。它最好被描述为“做pogo”。无法解决此问题,您无法合理地关闭系统选项。这不能很好地运作。