C # / Windows Forms: приложение работает, но не отвечает - PullRequest
1 голос
/ 30 ноября 2009

Итак, я собрал эту программу преобразования графики, и внезапно некоторые изменения, которые я не могу понять, сделали приложение не отвечающим. Меню больше не работают, и предполагается, что на одной из панелей нарисованы оси и сетка ... ничего. Есть идеи?

 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)
        {

        }


    }
}

Спасибо! * * 1004

Ответы [ 2 ]

1 голос
/ 30 ноября 2009

Попробуйте закомментировать (отдельно) код "load" и "paint", посмотрите, в чем проблема.

Если проблема в краске ... Интересно - вместо того, чтобы создавать свой собственный Graphics, используйте тот, который вам дали? А именно e.Graphics. Обратите внимание, что вы не создали это, поэтому не стоит Dispose() делать это (так что не делайте этого). Я бы также кэшировал Pen и т. Д. В полях, а не создавал их каждый раз. Обратите внимание, что если вы делаете создаете Pen (и т. Д.) В методе, тогда using - лучший способ Dispose().

В коде краски также есть комментарий foreach, который предполагает, что что-то было удалено - это может иметь отношение к проблеме ...

0 голосов
/ 30 ноября 2009

Если это происходит при загрузке, то, очевидно, количество файлов в каталоге может привести к зависанию потока графического интерфейса.

Кроме того, мой быстрый просмотр заставляет меня задуматься о том, чтобы проверить bool, которые вы используете для управления рисованием, и убедиться, что панель, для которой вы используете событие рисования, действительно видима.

Вы также должны проверить, работает ли ваш таймер, и проверить его интервал.

Я бы также посмотрел на использование оператора using или хотя бы блока finally для вашего распоряжения. Но не об этом ваш вопрос.

Большинство из них очевидны, и вы, возможно, уже проверили их все, прежде чем публиковать здесь, но я подумал, что выложу что-нибудь на случай, если вы пропустили это. Надеюсь, у меня будет возможность просмотреть более подробно и найти что-то еще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...