0

这是我的代码:

私人无效按钮1_Click(对象发送者,EventArgs e) { for (int i = 1; i < Application.OpenForms.Count; i++) { if (Application.OpenForms[i].WindowState == FormWindowState.Minimized) {

Application.OpenForms[i].WindowState = FormWindowState.Normal; using (var bmp = new Bitmap(Application.OpenForms[i].Width, Application.OpenForms[i].Height)) { Application.OpenForms[i].DrawToBitmap(bmp, new Rectangle(0, 0, bmp.Width, bmp.Height)); bmp.Save(@"d:\Duong\" + Application.OpenForms[i].Text + ".png"); } Application.OpenForms[i].WindowState = FormWindowState.Minimized; } else { using (var bmp = new Bitmap(Application.OpenForms[i].Width, Application.OpenForms[i].Height)) { Application.OpenForms[i].DrawToBitmap(bmp, new Rectangle(0, 0, bmp.Width, bmp.Height)); bmp.Save(@"d:\Duong\" + Application.OpenForms[i].Text + ".png"); } } } }

每个 Application.OpenForms[i] 都有一个 MdiParent。当其中一些被最小化,一些被激活时,我点击一个按钮来获取快照,我得到了每个表单的所有图片。但是任何最小化的表单在返回最小化之前都会出现闪烁。我知道问题来自 WindowState,但是如果它不显示,我该如何获取快照?..请帮助我..我已经看到有关 API GDI+ 的主题..但它们是用于最小化窗口应用程序的,我现在只需要我的表格和它的孩子。谢谢

4

3 回答 3

1

所有最小化窗口的屏幕截图。

private void button1_Click(object sender, EventArgs e)
{
    //MessageBox.Show(string.Format("{0}", Application.OpenForms.Count));

    System.Collections.IEnumerator myEnumerator = Application.OpenForms.GetEnumerator();
    while (myEnumerator.MoveNext())
    {
        Form current = (Form)myEnumerator.Current;
        if (current.WindowState == FormWindowState.Minimized )
        {
            current.WindowState = FormWindowState.Normal;
            current.Activate();

            Application.DoEvents();

            using (var bmp = new Bitmap(current.Width, current.Height))
            {
                current.DrawToBitmap(bmp, new Rectangle(0, 0, bmp.Width, bmp.Height));
                bmp.Save(@"c:\temp\childwindows\" + current.Text + ".png");
            }  
        }
    }
}

希望这会帮助你。最好的祝福。

于 2013-06-20T09:36:59.753 回答
0

尝试:

  • 暂停表格绘图
  • 拍摄快照
  • 简历表格绘图

您可以使用SendMessageWM_SETREDRAW暂停/恢复绘图。

在 For 循环之前暂停控件绘图,并在代码末尾恢复绘图。我建议使用Try/Catch 块,并在最后部分中包含恢复绘图。

暂停绘图:

SendMessage(ctrlControl.Handle, WM_SETREDRAW, 0, 0)

要恢复绘图:

SendMessage(ctrlControl.Handle, WM_SETREDRAW, 1, 0)
ctrlControl.Refresh()

ctrlControl 可以是任何控件:在您的情况下,我建议使用 MDI 容器。

于 2013-06-20T09:03:51.267 回答
0

这将恢复最小化的窗口并拍摄所有其他拥有的应用程序窗口的快照。

private void button1_Click(object sender, EventArgs e)
{

System.Collections.IEnumerator myEnumerator = Application.OpenForms.GetEnumerator();
while (myEnumerator.MoveNext())
{
    Form current = (Form)myEnumerator.Current;
    if (current.WindowState == FormWindowState.Minimized)
    {
        current.WindowState = FormWindowState.Normal;
        current.Activate();
        Application.DoEvents();
        SaveToFile(current); 
        current.WindowState = FormWindowState.Minimized;
        Application.DoEvents();
    }
    else
    {
        current.Activate();           
        Application.DoEvents();                
        SaveToFile(current); 
    }
}

}

private void SaveToFile(Form form)
{
    using (var bmp = new Bitmap(form.Width, form.Height))
    {
        form.DrawToBitmap(bmp, new Rectangle(0, 0, bmp.Width, bmp.Height));
        bmp.Save(@"c:\temp\childwindows\" + form.Text + ".png");
    }
}

希望这会有所帮助。问候。

于 2013-06-20T09:55:07.230 回答