2009-09-25 102 views
2

WinForms是否支持此功能?假设我想显示一个包含ListView的面板,其中包含一些结果。它通过点击窗体角上的按钮显示,并且面板显示在窗体内部,高于所有控件,最好是背部有阴影以使其更具吸引力。控制面板上的内容形式

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

有没有可能是我失踪的其他方式?

回答

4

这里有一个粗略的方法,将让你开始:

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

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

要在表格上使用此功能,把所有你想变成灰色的控制之下到面板上,然后让你的按钮的Click事件做这样的事情:

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

要撤消的效果,您只需从窗体的Controls集合中删除浮动面板,然后再次使原始面板上的所有控件可见,然后再次刷新或使面板失效以摆脱灰色的东西。简单的Invalidate可以工作,因为灰色的效果不会持续 - 让你不得不使这一切变得更加复杂。但是这至少会让你开始。

2

你能不能创建在表格背面的隐藏面板,然后使其可见,然后把它前面?

+0

没有必要把它放回去,然后把它放在前面...只是切换其可见性。 – JustLoren 2009-09-25 19:40:03

+0

不是我想要的...... :( – 2009-09-25 19:45:23