Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка Windows Forms > Восстановление формы


Автор: PashaSem 14.2.2007, 11:28
Всем Привет!
Подскажите как форму сделать активной.
Тоесть форма уже открыта но свернута  и по клику  кнопки на другой форме она должна развернуться (восстановиться).


Спасибо!  

Автор: HellMasterHaiL 14.2.2007, 11:31
метод Show

Код

Me.Hide () 'сворачивание формы
Me.Show () 'восстановление формы


таким образом можно управлять любой формой проекта (сворачивать и разворачивать)

А вообще на форуме есть поиск, еще хорошие люди придумали MSDN, поковырялся бы сначала там, там точно есть примеры работы с Windows-формами!

Автор: PashaSem 14.2.2007, 12:03
К сожаление данный код работает если окно еще не открыто.
Но если оно уже открыто мне нужно чтоб переклчиться  как клавиши Alt+Tab но на frm2

Код


          job frm2;

        private void button16_Click(object sender, EventArgs e)
        {
            if (frm2 == null || frm2.IsDisposed)
            {
                frm2 = new job();
                frm2.Show();
          
            }
         
        }

Автор: HellMasterHaiL 14.2.2007, 12:50
тогда метод Activate()

Автор: PashaSem 14.2.2007, 15:40
Метод Activate() применим когда мы вызываем новую форму тоесть создаем экземпляр.
А как быть если форма уже открыта .
Например Form1 уже существует и она не вызывалась из Form2
Как сделать чтоб по клику мышки на кнопке на Form2 форма (Form1 )стала активной!

Автор: -Mikle- 14.2.2007, 16:02
Цитата

frm2.Show();

если правильно тебя понял, то вынеси эту строчку за пределы услови if


Цитата(PashaSem @  14.2.2007,  18:40 Найти цитируемый пост)
Например Form1 уже существует и она не вызывалась из Form2

Ты имеешь ввиду что ссылки на Form1 в Form2 нету? То есть Form1 вызвалась из другого места (не из Form2)?
Если да, то учточни еще:
1. Может ли форма Form1 иметь несколько экземпляров для всего твоего приложения?
2. Нужно ли в Form2 работать с экземпляром активированной Form1? (То есть иметь ссылку на нее)

После уточнения, следующим постом будет пример smile

Добавлено @ 16:14 
 smile 
И еще какой вариант примера тебе удобнее: Который должен встраивается в код формы или который существует независимо для всех форм (без дописывания кода в класс формы)?
 smile 

Автор: PashaSem 14.2.2007, 16:24
Есть проект при запуске вызываеться Form1
из Form1 вызываеться форма job и только один экземпляр при необходимости она разварачиваеться    frm2.Activate();
Код

 job frm2;

        private void button16_Click(object sender, EventArgs e)
        {
            if (frm2 == null || frm2.IsDisposed)
            {
                frm2 = new job();
                frm2.Show();
          
            }
            frm2.Activate();
        }

Form1 может загрузиться один раз при запуске ( 1 экземпляр)
В принципе работать с  ней не  нужно если я понял пересылать данные на Form1 я не собираюсь просто нужно сделать ее активной.(развернуть)
из формы job по клику кнопки
Я не могу написать frm3 = new Form1();.... так как экземпляр Form1 уже существует и должен оставаться только один.

Автор: -Mikle- 14.2.2007, 20:59
Вариант встраиваемый в форму JOB

Код

public JOB : Form
{
        private static JOB _instance;
        public static void ShowForm()
        {
            if (_instance == null)
                _instance = new JOB();

            if (_instance.Visible == false)
                _instance.Show();

            if (_instance.WindowState == FormWindowState.Minimized)
                _instance.WindowState = FormWindowState.Normal;

            _instance.Activate();
        }
}


Здесь я предполагал, что форма JOB никогда не бывает Maximaized, и может имееть только два других состояния (Minimized и Normal).

Добавлено @ 21:01 
Забыл про исполбзование:

Код

    // всегда покажет на переднем плане один экземпляр формы JOB
    JOB.ShowForm();

Автор: PashaSem 16.2.2007, 16:24
Я чего то не понял!
Мне нужно сделать активной форму Form1 которая открываеться при запуске проекта и остаеться открытой.
А сделать ее нужно активной из формы job которая открываеться по клику из формы Form1.

Автор: -Mikle- 19.2.2007, 16:41
Ну разницы нет. Идея остается такой же. Сейчас я в командировке, и потому нет времени расписывть новый код. Когда вернусь, могу написать, если не разберещься до этого времени.

Автор: MrDale 19.10.2009, 12:09
Цитата(-Mikle- @ 14.2.2007,  20:59)
Здесь я предполагал, что форма JOB никогда не бывает Maximaized, и может имееть только два других состояния (Minimized и Normal).

Возник похожий вопрос, но у меня форма как раз может быть Maximaised. Как поступить в данном случае?

Автор: KelTron 19.10.2009, 18:44
Перед сворачиванием запоминаешь текущее состояние, потом при разворачивании устанавливаешь его же...

Автор: MrDale 20.10.2009, 10:59
Цитата(KelTron @ 19.10.2009,  18:44)
Перед сворачиванием запоминаешь текущее состояние, потом при разворачивании устанавливаешь его же...

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

Автор: MrDale 23.10.2009, 14:24
Решил проблему так:
Код

public partial class Form1 : Form
{
        int SW_RESTORE = 9;
        [DllImport("user32.dll")]
        static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

        public void Show()
        {
            if (WindowState == FormWindowState.Minimized)
            ShowWindow(this.Handle, SW_RESTORE);
        }
}

Нашел ответ http://www.codenewsgroups.net/vb/t954-restore-form-prior-state.aspx

Если же нужно просто узнать состояние окна до минимизации:
Код

        [DllImport("user32.dll")]
        [return: MarshalAs(UnmanagedType.Bool)]
        static extern bool GetWindowPlacement(IntPtr hWnd, ref WINDOWPLACEMENT lpwndpl);

        private const int WPF_RESTORETOMAXIMIZED = 2;

        [StructLayout(LayoutKind.Sequential)]
        public struct WINDOWPLACEMENT
        {
            public int length;
            public int flags;
            public int showCmd;
            public System.Drawing.Point ptMinPosition;
            public System.Drawing.Point ptMaxPosition;
            public System.Drawing.Rectangle rcNormalPosition;

            public static WINDOWPLACEMENT Default
            {
                get
                {
                    WINDOWPLACEMENT result = new WINDOWPLACEMENT();
                    result.length = Marshal.SizeOf(result);
                    return result;
                }
            }
        }

        public FormWindowState GetRestoredState(Form form)
        {
            if (form.WindowState == FormWindowState.Minimized)
            {
                WINDOWPLACEMENT pl = WINDOWPLACEMENT.Default;
                GetWindowPlacement(form.Handle, ref pl);

                return pl.flags == WPF_RESTORETOMAXIMIZED ? FormWindowState.Maximized
                    : FormWindowState.Normal;
            }
            else return FormWindowState.Normal;
        }

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)