2009-11-30 95 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

相关问题