面板控件到图像

时间:2012-11-01 19:23:50

标签: vb.net winforms

我正在尝试将面板内容保存到图片框中显示的图像。我正在使用drawtobitmap方法,如下所示:

Private Sub Button3_Click(sender As System.Object, e As System.EventArgs) Handles Button3.Click

    Dim bmp As New Bitmap(Panel1.Width, Panel1.Height)
    Panel1.DrawToBitmap(bmp, Panel1.ClientRectangle)
    PictureBox1.BackgroundImage = bmp

End Sub

图片框显示图像,但绘制顺序不正确。

enter image description here

左侧的框是带有3个按钮的面板。右边的框是图片框。注意排序有何不同。有没有人有任何关于如何解决此问题的建议,以便排序与面板上显示的相同?

3 个答案:

答案 0 :(得分:2)

我在c#中这样做了,但你应该能够翻译:

private void button3_Click(object sender, EventArgs e)
{
    ReverseControls(panel1);

    var bmp = new Bitmap(panel1.Width, panel1.Height);
    panel1.DrawToBitmap(bmp, panel1.ClientRectangle);
    pictureBox1.BackgroundImage = bmp;

    ReverseControls(panel1);
}

static void ReverseControls(Panel panel)
{
    var controls = panel.Controls.Cast<Control>().Reverse().ToArray();
    panel.Controls.Clear();
    panel.Controls.AddRange(controls);
}

由于它以相反的顺序绘制控件,我只是得到一个反向的控件列表并删除/读取它们。然后在绘制位图后取消它们的反转。

答案 1 :(得分:1)

Jon B.你是正确的扭转z顺序,但我发现下面这个方法为我做这个似乎工作。谢谢您的帮助! :)

For Each ctl As Control In Me.Controls.OfType(Of Control).OrderBy(Function(c) Me.Controls.GetChildIndex(c))
ctl.BringToFront()
Next

答案 2 :(得分:0)

这适用于VB.net

' flip all Controls to reverse order

For I As Int32 = MyPanel.Controls.Count - 1 To 0 Step -1

  MyPanel.Controls(I).SendToBack()

Next


'create Bitmap of Panel for Printer 

MyPanel.DrawToBitmap(bm, r)


' flip Controls again to restore original order on Screen 

For I As Int32 = MyPanel.Controls.Count- 1 To 0 Step -1

  MyPanel.Controls(I).SendToBack()

Next