代码之家  ›  专栏  ›  技术社区  ›  Denis Biondic

窗体中内容的控件面板

  •  2
  • Denis Biondic  · 技术社区  · 16 年前

    WinForms对此有支持吗?假设我想显示一个包含由一些结果构成的ListView的面板。通过单击窗体角上的按钮来显示,面板显示在窗体内部,尤其是所有控件,最好在后面加阴影以使其更具吸引力。

    作为表单的一部分,我希望此面板始终位于表单内部。我想到的一个解决方案是用该面板创建一个无边框的窗体,并使其与原始窗体同步。

    有没有别的方法让我迷路了?

    2 回复  |  直到 15 年前
        1
  •  4
  •   MusiGenesis    16 年前

    下面是一个简单的方法,可以帮助您开始:

    public Panel CreateFloatingPanel(Panel originalPanel)
    {
        Bitmap bmp = new Bitmap(originalPanel.Width, 
            originalPanel.Height);
        Rectangle rect = new Rectangle(0, 0, 
            bmp.Width, bmp.Height);
        originalPanel.DrawToBitmap(bmp, rect);
        foreach (Control ctrl in originalPanel.Controls)
        {
            ctrl.Visible = false;
        }
        using (Graphics g = Graphics.FromHwnd(originalPanel.Handle))
        {
            g.DrawImage(bmp, 0, 0);
            bmp.Dispose();
            SolidBrush brush = 
                new SolidBrush(Color.FromArgb(128, Color.Gray));
            g.FillRectangle(brush, rect);
            brush.Dispose();
        }
        Panel floater = new Panel();
        floater.Size = originalPanel.Size;
        floater.Left = originalPanel.Left - 50;
        floater.Top = originalPanel.Top - 50;
        this.Controls.Add(floater);
        floater.BringToFront();
        return floater;
    }
    

    此方法获取一个面板,其中包含一些控件,将面板及其所有控件绘制到临时位图上,使所有控件不可见,将临时位图绘制到面板上,然后在面板上添加半透明灰色层。然后,该方法创建一个新面板,并将其浮动在原始面板的上方和左侧,然后返回它。这基本上使新面板成为一种模式弹出窗口,有点像网页有时做的那样。

    若要在窗体上使用此项,请将所有要变灰的控件置于面板下方,然后让按钮的单击事件执行以下操作:

    Panel floater = CreateFloatingPanel(panel1);
    floater.BackColor = Color.White;
    ListView lv = new ListView();
    floater.Controls.Add(lv);
    

    要撤消此效果,只需从窗体的控件集合中删除浮动面板,然后使原始面板上的所有控件再次可见,然后刷新或使面板无效以除去灰显的内容。简单的失效将起作用,因为灰显效果不会持续——要使这一切变得更加复杂。但这至少能让你开始。

        2
  •  2
  •   Armbrat    16 年前

    你能在表单的后面创建一个隐藏的面板,然后让它可见,然后放到前面吗?

    推荐文章