2013-06-20 47 views
0

這是我的代碼: 我們如何才能解決每個孩子形式獲取快照時,他們最小化?

private void button1_Click(object sender, 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 +的主題..但它們是爲了最小化窗口的應用,我是什麼現在只需要我的形式和它的孩子。由於

回答

0

嘗試:

  • 暫停形式繪製
  • 取快照
  • 簡歷表格繪製

您可以暫停/恢復使用SendMessageWM_SETREDRAW繪製。

在For循環之前掛起控制圖並在代碼結束時恢復繪製。我建議使用Try/Catch block,並在Finally部分包含resume畫圖。

暫停圖紙:

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

要恢復繪圖:

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

ctrlControl可任意控制:在你的情況我建議使用MDI容器。

+0

謝謝你的回覆..但我不是一個專業的程序員..所以我很難理解這些方法如何使用..請給我更多的細節..或只是一個例子,如果可以..加入了 –

+0

添加細節到我的答案。 – tezzo

+0

哦感謝上帝..你救了我的生命..最終我找到了解決這個問題的最佳途徑。我花了兩天的時間感覺疲憊不堪,這個問題..謝謝你這麼多..但還有一個關於你的想法的問題..爲什麼我們必須試試catch塊?如果我們不這樣做,會導致錯誤? –

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

希望這會幫助你。最好的祝福。

+0

感謝您的幫助..但它仍然顯示任何兒童形式最小化..如果我把「current.WindowState = FormWindowState.Normal;」在if條件的最後一行。它只是出現和消失..我現在想要的是最小化形式不加載回來,我仍然得到它的快照.. –

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

希望這會有所幫助。問候。

+0

嗯..它也有GDI +錯誤,因爲我目前的[0]不能繪製..但此外,也許你不明白我的目標..我不想恢復所有最小化的形式。我只是希望他們什麼都不做,但我仍然可以把它畫成圖片..真的很感謝你的幫助.. –

相關問題