none
перерисовка форм?! RRS feed

  • Вопрос

  • Есть некоторое приложение, в котором как бы есть большое количество различного интерфейса...
    я делал двумя способами:
    1)Делал часть видимой вторую часть невидимой, в следствии каких либо действий делаю видимой нужную часть не видимую убираю...наблюдается много багов и както геморрой...
    2)Сделал две и более виндовс форм отдельных самих по себе которые я выключаю и создаю заново.. что тоже как понимаете не есть правильно.. примерно так:
    Application.Run(new Form1());
    Application.Run(new Form2());
    Application.Run(new Form3());

    Мне кажется есть еще третий вариант, добавлять элементы по мере их нужды и потом удалять... или классы интерфейса.... но что-то я пока не особо представляю куда копать...
    Если еще кинете пару примеров буду примного благодарен
    • Перемещено I.Vorontsov 12 января 2010 г. 7:48 (От:Visual C#)
    • Перемещено SachinW 1 октября 2010 г. 22:12 MSDN Forums Consolidation (От:Начинающие разработчики)
    20 декабря 2009 г. 9:33

Ответы

  • В играх, по крайней мере в тех, что директикс пользуют другая система, там происходит рендеринг графического устройства, а вывод можно привязать к любому контролу, будь-то Form, PictureBox, и т.д.
    В том-то и дело, что независимо от того сколько форм вы запустили из Form1, при закрытии из Form2 формы Form1 у вас закроется всё приложение, т.к. имеется всего один цикл обработки сообщений для Form1 в одном потоке  и закрывая её, вы закроете и все дочерние формы.
    Проводить операции над главной формой из дочерней можно через ссылку на на главную форму. В случае MDI приложений имеется свойство MDIParent, в случае SDI вы можете передать ссылку на главную форму в дочернюю с помощью какого-нибудь свойства, или например, переопределить конструктор дочерней формы
     //Form1
    public partial class Form1 : Form
    {
    public Form1()
    {
    InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
    Form2 wnd = new Form2(this);
    wnd.Show();
    }

    private void button2_Click(object sender, EventArgs e)
    {
    this.Visible = false;
    }
    }

    //Form2
    public partial class Form2 : Form
    {
    public Form2()
    {
    InitializeComponent();
    }

    /// <summary>
    /// Конструктор с ссылкой на родительскую форму
    /// </summary>
    public Form2(Form1 form)
    {
    InitializeComponent();
    this.parentForm = form;
    }
    private Form1 parentForm;

    /// <summary>
    /// Закрытие родительской формы - закрытие всего приложение
    /// </summary>
    private void button1_Click(object sender, EventArgs e)
    {
    if (parentForm != null)
    {
    parentForm.Close();
    }
    }

    /// <summary>
    /// Сделать родительскую форму видимой
    /// </summary>
    private void button2_Click(object sender, EventArgs e)
    {
    if (parentForm != null)
    {
    if (!parentForm.Visible)
    {
    parentForm.Visible = true;
    }
    }
    }
    }
    • Помечено в качестве ответа dampirik 22 декабря 2009 г. 9:57
    22 декабря 2009 г. 8:28

Все ответы

  • Я бы рекомендовал не деалть
    Application.Run(new Form1());
    Application.Run(new Form2());
    Application.Run(new Form3());
    а делать в форме 1:
    Form2 f2=new Form2();
    Form3 f3=new Form3();
    f2.Show();
    f3.Show();
    И в Program.cs только
    Application.Run(new Form1());

    На счет скрытия части формы могу предложить свойство формы TransparencyKey, которое назначает цвет, считающийся прозрачным. Т. е. если TransparencyKey равно например синиму цвету, то все синие элименты (напримеры нарисованные через Graphics) будут прозрачными (их не будет, в этих местах будут видны части окон других программ).

    Добавлять и удалять элементы можно через свойство Controls формы.
    Код
    this.Controls.Add(элемент_например_экземпляр_кнопки);
    написанный в любом из методов класса формы добавляет эдемент,
    this.Controls.Remove(элемент);
    удаляет
    20 декабря 2009 г. 12:10
  • А для чего используются .dll? может как раз для таких целей их применяют?
    Лебедев Алексей - это тоже самое, что и у меня тока более культурно)
    20 декабря 2009 г. 17:43
  • Я думаю *.dll в данном случае не стоит использовать. Библиотеки (*.dll) - это набор классов (во всяком случае в C#). Их разумнее использовать когда у тебя две программы, использующее общие фрагменты кода. Например программа 1 создаёт файлы какого-то типа, она нужна сугубо профессионалов. А программа 2 читает эти файлы, она нужна простым пользователям. Они используют одну и туже библиотеку.
    Однако можно можно делать библиотеки пользовательских элементов управления (они тоже dll). Но в вашем случае лучше делать пользовательские элементы управления в проекте, и динамически добавлять их на форму. 

    А на счет
    Form2 f2=new Form2();
    Form3 f3=new Form3();
    f2.Show();
    f3.Show();
    Это и разумнее, и практичнее, и правильнее.
    20 декабря 2009 г. 18:06
  • Вообще не понятно, что за приложение, которому нужно постоянно отображать несколько форм с разным контентом. Может быть TabControl поможет? =)
    На самом деле есть подозрение, что интерфейс нужно кардинально менять. На какую из известных программ похож ваш интерфейс?

    Насчет dll... dll - файлы в .net - это просто сборки, которые отличаются от exe только тем, что в них нет точки входа (проще говоря, указателя на метод Main). Эти сборки создаются в том числе для хранения совместно используемого кода (контрактов, ресурсов), но не только для этого.
    20 декабря 2009 г. 21:49
  • Есть некоторое приложение, в котором как бы есть большое количество различного интерфейса...
    я делал двумя способами:
    1)Делал часть видимой вторую часть невидимой, в следствии каких либо действий делаю видимой нужную часть не видимую убираю...наблюдается много багов и както геморрой...
    2)Сделал две и более виндовс форм отдельных самих по себе которые я выключаю и создаю заново.. что тоже как понимаете не есть правильно.. примерно так:
    Application.Run(new Form1());
    Application.Run(new Form2());
    Application.Run(new Form3());

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

    Методом Application.Run запускает стандартный цикл обработки сообщений в текущем потоке для окна, переданного как параметр. Стандартный цикл обработки сообщений заканчивается только при получении соответствующего сообщения WM_CLOSE.  Поэтому создать новый цикл обработки сообщений вы сможете только после того, как отработает старый, т.е. когда закроется окно Form1(), только тогда код доберется до Application.Run(new Form2()).
    Построение качественного интерфейса - это скорей искусство, чем конкретная методология, поэтому всё ограничивается вашей фантазией.
    21 декабря 2009 г. 9:19
  • Ну я зацикливал Application.Run(new Form3()); и выход по какому нить параметру затем другой и тд...
    А вот для примера в играх: как это реализуется, например в 3d....вся территория это одна большая форма? а если используются какие либо кнопки - то вырисовываются другая форма типо того?типо вызов меню  и тд?
    21 декабря 2009 г. 16:59
  • Решил попробовать как Лебедев Алексей   предлагает...
    создаю две формы
    Application.Run(new Form1()); - стартует одна форма
    в Form1()
    прописываю
    Form2 f2 = new Form2();
    f2.Show();
     стартует две форму все замечательно... но возникает пара вопросов:
    1) как находясь в Form2 закрыть Form1 (чтобы закрыть процесс...)
    2) как находясь в Form2 сделать видимой Form1(если ту отправить в инвиз....)
    3) возможно ли из дочерней формы сделать главную?
    22 декабря 2009 г. 5:44
  • В играх, по крайней мере в тех, что директикс пользуют другая система, там происходит рендеринг графического устройства, а вывод можно привязать к любому контролу, будь-то Form, PictureBox, и т.д.
    В том-то и дело, что независимо от того сколько форм вы запустили из Form1, при закрытии из Form2 формы Form1 у вас закроется всё приложение, т.к. имеется всего один цикл обработки сообщений для Form1 в одном потоке  и закрывая её, вы закроете и все дочерние формы.
    Проводить операции над главной формой из дочерней можно через ссылку на на главную форму. В случае MDI приложений имеется свойство MDIParent, в случае SDI вы можете передать ссылку на главную форму в дочернюю с помощью какого-нибудь свойства, или например, переопределить конструктор дочерней формы
     //Form1
    public partial class Form1 : Form
    {
    public Form1()
    {
    InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
    Form2 wnd = new Form2(this);
    wnd.Show();
    }

    private void button2_Click(object sender, EventArgs e)
    {
    this.Visible = false;
    }
    }

    //Form2
    public partial class Form2 : Form
    {
    public Form2()
    {
    InitializeComponent();
    }

    /// <summary>
    /// Конструктор с ссылкой на родительскую форму
    /// </summary>
    public Form2(Form1 form)
    {
    InitializeComponent();
    this.parentForm = form;
    }
    private Form1 parentForm;

    /// <summary>
    /// Закрытие родительской формы - закрытие всего приложение
    /// </summary>
    private void button1_Click(object sender, EventArgs e)
    {
    if (parentForm != null)
    {
    parentForm.Close();
    }
    }

    /// <summary>
    /// Сделать родительскую форму видимой
    /// </summary>
    private void button2_Click(object sender, EventArgs e)
    {
    if (parentForm != null)
    {
    if (!parentForm.Visible)
    {
    parentForm.Visible = true;
    }
    }
    }
    }
    • Помечено в качестве ответа dampirik 22 декабря 2009 г. 9:57
    22 декабря 2009 г. 8:28