2009-11-30 93 views
1

因此,我一直在將這個圖形轉換程序放在一起,突然發生了一些我無法弄清楚的變化,導致應用程序無法響應。菜單不再起作用,它應該在一個面板上繪製座標軸和網格......沒有任何東西。有任何想法嗎?C#/ Windows窗體:應用程序運行但無響應

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 
using System.IO; 

namespace Transformer 
{ 
    public partial class Transformer : Form 
    { 
     /* Initialize parameters */ 
     private bool drawAxes = true; 
     private bool drawGrid = true; 

     private List<ObjectSettings> dispObjects = new List<ObjectSettings>(); 


     /* Initialize form */ 

     public Transformer() 
     { 
      InitializeComponent(); 
     } 

     private void Transformer_Load(object sender, EventArgs e) 
     { 
      // Populate available objects listbox 
      string currentDir = Directory.GetCurrentDirectory(); 
      string[] fileEntries = Directory.GetFiles(currentDir + @"\Objects"); 
      foreach (string s in fileEntries) { 
       int start = s.LastIndexOf(@"\"); 
       int end = s.LastIndexOf(@"."); 
       availObjectsListBox.Items.Add(s.Substring(start + 1, end - start - 1)); 
      } // end foreach 
     } 



     /* Paint graphics */ 

     // Paint main form 
     private void Transformer_Paint(object sender, PaintEventArgs e) 
     { 
     } 

     // Paint graphics panel 
     private void splitContainer2_Panel1_Paint(object sender, PaintEventArgs e) 
     { 
      Rectangle r = splitContainer2.Panel1.ClientRectangle; 
      Graphics g = splitContainer2.Panel1.CreateGraphics(); 
      Pen axisPen = new Pen(Color.Gray, 2.0f); 
      Pen gridPen = new Pen(Color.Gray, 1.0f); 

      g.Clear(Color.White); 

      if (drawAxes) { 
       g.DrawLine(axisPen, r.Left + 0.5f * r.Width, r.Top, r.Left + 0.5f * r.Width, r.Bottom); 
       g.DrawLine(axisPen, r.Left, r.Top + 0.5f * r.Height, r.Right, r.Top + 0.5f * r.Height); 
      } 

      if (drawGrid) { 
       // Vertical lines 
       int xVal = 0; 
       int xCenter = r.Width/2; 
       g.DrawLine(gridPen, xCenter, r.Top, xCenter, r.Bottom); 
       for (int i = 0; i < 10; i++) { 
        xVal += r.Width/20; 
        g.DrawLine(gridPen, xCenter + xVal, r.Top, xCenter + xVal, r.Bottom); 
        g.DrawLine(gridPen, xCenter - xVal, r.Top, xCenter - xVal, r.Bottom); 
       } 

       // Horizontal lines 
       int yVal = 0; 
       int yCenter = r.Height/2; 
       g.DrawLine(gridPen, r.Left, yCenter, r.Right, yCenter); 
       for (int i = 0; i < 10; i++) { 
        yVal += r.Height/20; 
        g.DrawLine(gridPen, r.Left, yCenter + yVal, r.Right, yCenter + yVal); 
        g.DrawLine(gridPen, r.Left, yCenter - yVal, r.Right, yCenter - yVal); 
       } 
      } 



      // foreach object in displayed objects 
      // keep list of displayed objects and their settings (make struct) 


      g.Dispose(); 
      axisPen.Dispose(); 
      gridPen.Dispose(); 
     } 


     /* File menu */ 

     private void saveImageToolStripMenuItem_Click(object sender, EventArgs e) 
     { 

     } 

     private void exitToolStripMenuItem_Click(object sender, EventArgs e) 
     { 
      Close(); 
     } 


     /* Options menu */ 

     private void axesOnoffToolStripMenuItem_Click(object sender, EventArgs e) 
     { 
      if (drawAxes == true) 
       drawAxes = false; 
      else 
       drawAxes = true; 
     } 

     private void gridOnoffToolStripMenuItem_Click(object sender, EventArgs e) 
     { 
      if (drawGrid == true) 
       drawGrid = false; 
      else 
       drawGrid = true; 
     } 


     /* Help menu */ 

     private void helpToolStripMenuItem_Click(object sender, EventArgs e) 
     { 
      AboutBox dlg = new AboutBox(); 
      dlg.ShowDialog(); 
     } 


     /* Other stuff */ 

     private void timer1_Tick(object sender, EventArgs e) 
     { 
      Invalidate(); 
     } 

     // ">>" button 
     private void availToDispButton_Click(object sender, EventArgs e) 
     { 
      dispObjectsListBox.Items.Add(availObjectsListBox.SelectedItem); 
     } 

     // "<<" button 
     private void dispToAvailButton_Click(object sender, EventArgs e) 
     { 
      availObjectsListBox.Items.Add(dispObjectsListBox.SelectedItem); 
      dispObjectsListBox.Items.Remove(dispObjectsListBox.SelectedItem); 
     } 

     // Clear all button 
     private void clearAllButton_Click(object sender, EventArgs e) 
     { 

     } 

     // Update preview box 
     private void availObjectsListBox_SelectedIndexChanged(object sender, EventArgs e) 
     { 

     } 


    } 
} 

謝謝!

+2

「一些變化我想不通做出了反應遲鈍的應用程序」 - 這是版本控制的目的。 ;) – 2009-11-30 06:41:33

+0

如果你仍然有工作副本的組裝,你可以使用反射工具對其進行反向工程。比較兩者並查看是否可以找到差異。 – 2009-11-30 07:00:32

回答

0

如果在加載時發生這種情況,顯然目錄中的文件數量可能導致GUI線程掛起。

除此之外,我的快速瀏覽只讓我想到檢查您用來控制繪圖的布爾,並確保您使用繪畫事件的面板實際上可見。

您還應該檢查您的計時器是否正在滴答,並檢查其間隔時間。

我也看看使用using語句,或至少一個finally塊來處理。但這不是你的問題所在。

其中大部分是顯而易見的,你可能已經在發佈之前檢查了所有這些內容,但是我認爲我會安排一些事情以防萬一你錯過了它。希望我能有機會更詳細地看看並找出其他的東西。

+0

我檢查了計時器,能見度等等都很好。奇怪的是,菜單會下降,但當有一個事件處理程序時,點擊File-> Exit就不會執行任何操作。 – justin 2009-11-30 07:15:21

+0

設計師的代碼可以導致這樣的事情嗎? – justin 2009-11-30 07:23:57

+0

這是事件處理程序佈線的問題嗎?檢查將事件處理程序連接到事件的代碼仍然存在。如果菜單等工作,那麼這意味着GUI線程沒有掛起,所以你可能丟失了所有的事件連線。 – Glenn 2009-11-30 09:05:31

1

嘗試註釋(單獨)「加載」和「繪製」代碼,看看是哪個問題。

如果問題是油漆......我不知道 - 而不是創建自己的Graphics,使用給你的?即,e.Graphics。請注意,你沒有創建這個,所以它不是你的工作Dispose()它(所以不這樣做)。我也會緩存Pen等字段,而不是每次創建它們。請注意,如果你在創建一個Pen(等)的方法,那麼using是更好的方式Dispose()它。

也有在暗示什麼已被刪除的油漆代碼foreach評論 - 這可能是相關的問題...

+0

裝載和繪畫都不是問題...即使菜單事件處理程序也受到影響。他們下來,看起來選擇,但沒有做什麼,當我點擊它們 – justin 2009-11-30 07:20:25

相關問題