На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
> Сворачивание окна
    каке событие в С# для окна отвечает за его сворачивание ?
      Скорее всего придется перехватывать события, которые винда посылает окну - это если нужно отловить сам момент сворачивания.
      Если нужно отлавливать уже измененное состояние, то событие SizeChanged() в котором смотри на свойство WindowState.
        Twilight, спасибо - вроде получилось.

        Я отловил этот момент и делаю форму Visible = false;
        Для того, чтоб ее достать я дважды щелкаю на иконку в трее и она показывается
        this.Visible = true;
        this.WindowState = FormWindowState.Normal.

        Но вот никак не могу при запуске приложения эту форму сразу свернуть.
        Тоесть this.Visible = false не работает ни после инициадизации компонент, ни после FormLoad.

        Как ее запустить нефидимой ? или может есть какие свойства у компанент, чтоб это автоматом делалось ?
          Невидимой всмысле свернутой? Если так - то WindowState в Minimized ставь перед отображением формы
            а отлавлю ли я тогда событие, если форма сразу показывается свернутой. Тоесть изменение размеров-то не произойдет... (SizeChanged)
              отловишь
                Цитата Twilight @
                отловишь

                а вот почему-то и не отлавливается :(
                  показывай код, раз не отлавливается
                    Цитата Twilight @
                    показывай код, раз не отлавливается

                    да особо показывать-то и нечего :)

                    в общем событие при запуске приходит. Причем 2 раза.
                    Я делаю Visible = false, но после этого окно все-равно отображается свернутым в панели задач.
                    А хотелось бы при запуске его доставать только из трея.

                    Может как по-другому еще можно ?
                      ShowInTaskbar=false;
                        Цитата cthutq @
                        в общем событие при запуске приходит. Причем 2 раза.

                        что впринципе логично - создание окна и сворачивание окна
                          Цитата cthutq @
                          А хотелось бы при запуске его доставать только из трея.

                          Ты чего спросить то хотел? Про сворачивание формы или про то как поместить программу в трей?
                          Если первое то тебе цуже ответили. если второе, то NotifyIcon используй.
                            Цитата wdk @
                            ShowInTaskbar=false;

                            это что ?


                            Цитата Twilight @
                            что впринципе логично - создание окна и сворачивание окна

                            да, но мне от этого не легче :) форма-то показывается


                            Цитата arbuzov @
                            Ты чего спросить то хотел? Про сворачивание формы или про то как поместить программу в трей?
                            Если первое то тебе цуже ответили. если второе, то NotifyIcon используй.

                            Сворачивание я понял как отловить. NotifyIcon использую, но мне нужно через NotifyIcon управлять формой.
                            А для этого нужно хотябы для начала ее не показывать при запуске
                              Цитата wdk @
                              ShowInTaskbar=false;


                              +

                              ExpandedWrap disabled
                                private void fmMain_Activated(object sender, EventArgs e)
                                        {
                                            Hide();
                                        }


                              зы а зачем форму создавать если ее сразу скрывать?
                              Сообщение отредактировано: arbuzov -
                                Цитата arbuzov @
                                зы а зачем форму создавать если ее сразу скрывать?

                                при ее инициализации происходит сетевое соединенние с сервером.

                                попробую с Hide() & ShowInTaskbar.

                                З.Ы. Нашел примерчик с ShowInTaskbar
                                ExpandedWrap disabled
                                   private void frmMain_Resize(object sender, System.EventArgs e)
                                  {
                                  ShowInTaskbar = !(this.WindowState == FormWindowState.Minimized);
                                  notifyIcon1.Visible = this.WindowState == FormWindowState.Minimized;
                                  }
                                   
                                  private void notifyIcon1_Click(object sender, System.EventArgs e)
                                  {
                                  this.WindowState = FormWindowState.Normal;
                                  }


                                но почему-то слетает с исключением при создании окна :(
                                  Цитата cthutq @
                                  при ее инициализации происходит сетевое соединенние с сервером.

                                  Если по хорошему - то надо разделять код представления (UI) от бизнес-логики, хотя бы разнеся их по разным классам, а еще лучше в разные namespaces

                                  Цитата cthutq @
                                  но почему-то слетает с исключением при создании окна

                                  все вот надо клещами вытягивать :) какое исключение?
                                    Цитата Twilight @
                                    Если по хорошему - то надо разделять код представления (UI) от бизнес-логики

                                    +1
                                    Соединение с сервером незачем привязывать к создапнию главной формы
                                      вот тоже сталкивался с такими проблемами и решил добавить вопросик по тем

                                      все вышесказанное(имеется в виду отлавливание сворачивания через ресайз окна) работает при условии что у формы например FormBorderStyle = FormBorderStyle.FixedToolWindow, или другой фиксированный, но как быть если FormBorderStyle = FormBorderStyle.Sizable. В этом случае события которые должны происходить при сворачивании формы будут срабатывать при каждом ресайзе формы
                                        Цитата Twilight @
                                        Если по хорошему - то надо разделять код представления (UI) от бизнес-логики, хотя бы разнеся их по разным классам, а еще лучше в разные namespaces

                                        у меня класс отвечающий за соединение находится в отдельном классе и в отдельном namespace.
                                        Но сам класс-то является членом класса-формы. При запуске формы происходит попытка соединения и если удачно, то
                                        доступны некие кнопки.

                                        Интересно - как это можно разнести ?
                                          Цитата Pit-Bul @
                                          но как быть если FormBorderStyle = FormBorderStyle.Sizable.

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

                                          Цитата cthutq @
                                          Интересно - как это можно разнести ?

                                          мое мнение вынести вызов метода соединения с сервером из конструктора в другое место, когда форма уже будет загружена.
                                          Сообщение отредактировано: Twilight -
                                            Цитата Twilight @
                                            Скорее всего придется перехватывать события, которые винда посылает окну - это если нужно отловить сам момент сворачивания.
                                            Если нужно отлавливать уже измененное состояние, то событие SizeChanged() в котором смотри на свойство WindowState.

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

                                              все прекрасно работает:

                                              ExpandedWrap disabled
                                                        private void Main_f_Resize(object sender, EventArgs e)
                                                        {
                                                            if (FormWindowState.Minimized == WindowState) Hide();
                                                        }
                                                 
                                                        private void notifyIcon_DoubleClick(object sender, EventArgs e)
                                                        {
                                                            Show();
                                                            WindowState = FormWindowState.Normal;
                                                        }


                                              я тоже хочу чтоб при старте программа сразу заворачивалась в трей - прога стартует вместе с виндовсом, и каждый раз ее вручную сворачивать не очень удобно.
                                              добавил:
                                              ExpandedWrap disabled
                                                        private void Main_f_Activated(object sender, EventArgs e)
                                                        {
                                                            this.Hide();
                                                         }


                                              теперь порядок - прога при старте сразу в трее, но чтоб ее оттуда достать, надо сделать на notifyIcon три двойных щелчка))))
                                              причем видно, на первые 2 она реагирует и тут же заворачивается, а на третий остается развернутой)
                                              Подскажите как поправить?
                                                Почему бы просто не поставить Visible=false у формы в дизайнере?
                                                  У формы есть методы Hide и Show - спрятать/показать форму.
                                                  Но в конструкторе или FormLoad они не срабатывают. Я сделал так - в FormLoad запускаю таймер на 0.5-1 сек, в событии этого таймера делаю Hide, после чего таймер выключаю.
                                                  Форма висит эти 0.5-1 сек и исчезает. А дальше юзер из меню иконы в трее ее показывает/прячет когда захочет.
                                                  Показать/спрятать - пункты меню. В обработчиках просто стоит this.Hide (); либо this.Show ().
                                                  В этих же обработчиках можно флаг свой переключать - форма спрятана или нет.
                                                  Проблем у меня с таким подходом никогда не возникало.
                                                  Сообщение отредактировано: hd44780 -
                                                    ExpandedWrap disabled
                                                      Но в конструкторе или FormLoad они не срабатывают. Я сделал так - в FormLoad запускаю таймер на 0.5-1 сек, в событии этого таймера делаю Hide, после чего таймер выключаю.
                                                      Форма висит эти 0.5-1 сек и исчезает.


                                                    Тихий ужас :D

                                                    Алсо, как же вы всё сложно придумываете, не проще ли завести отдельное свойство которое будет отвечать за показ формы? Пусть это будет "IsMinimized", вот простейший пример:

                                                    ExpandedWrap disabled
                                                              private FormWindowState LastWindowState;
                                                       
                                                              private bool IsMinimized
                                                              {
                                                                  get
                                                                  {
                                                                      return this.WindowState == FormWindowState.Minimized;
                                                                  }
                                                                  set
                                                                  {
                                                                      if (this.IsMinimized == value)
                                                                      {
                                                                          return;
                                                                      }
                                                       
                                                                      if (value)
                                                                      {
                                                                          this.WindowState = FormWindowState.Minimized;
                                                                          this.ShowInTaskbar = false;
                                                                          this.Hide ();
                                                                      }
                                                                      else
                                                                      {
                                                                          this.Show ();                    
                                                                          this.ShowInTaskbar = true;
                                                                          this.WindowState = this.LastWindowState;
                                                                      }
                                                                  }
                                                              }
                                                       
                                                              private void MainForm_Resize (object sender, EventArgs e)
                                                              {
                                                                  if (this.IsMinimized)
                                                                  {
                                                                      this.ShowInTaskbar = false;
                                                                      this.Hide ();
                                                                  }
                                                                  else
                                                                  {
                                                                      this.LastWindowState = this.WindowState;
                                                                  }
                                                              }


                                                    И использовать его для скрытия/показа формы в процессе работы:

                                                    ExpandedWrap disabled
                                                              private void NotifyIcon_Main_MouseClick (object sender, MouseEventArgs e)
                                                              {
                                                                  if (!this.Created || e.Button != MouseButtons.Left)
                                                                  {
                                                                      return;
                                                                  }
                                                       
                                                                  this.IsMinimized = !this.IsMinimized;
                                                              }


                                                    И в процессе загрузки формы:

                                                    ExpandedWrap disabled
                                                              private void MainForm_Load (object sender, EventArgs e)
                                                              {
                                                                  this.IsMinimized = this.CheckBox_AutoHide.Checked; //Properties.Settings.Default.AutoHide
                                                              }
                                                       
                                                              private void Form1_FormClosing (object sender, FormClosingEventArgs e)
                                                              {
                                                                  Properties.Settings.Default.AutoHide = this.CheckBox_AutoHide.Checked;
                                                                  Properties.Settings.Default.Save ();
                                                              }


                                                    Пример на 10 строк в аттаче.
                                                    Сообщение отредактировано: TerraGhost -

                                                    Прикреплённый файлПрикреплённый файлMinimizedToTray.rar (7.46 Кбайт, скачиваний: 68)
                                                      TerraGhost спасибо за пример)
                                                      а я сделал так:
                                                      в свойстве формы WindowsState установил - Minimized
                                                      и
                                                      ExpandedWrap disabled
                                                                public Main_f()
                                                                {
                                                                    InitializeComponent();
                                                                    this.ShowInTaskbar = false;
                                                                
                                                                }
                                                         
                                                                private void notifyIcon_DoubleClick(object sender, EventArgs e)
                                                                {
                                                                    Show();
                                                                    WindowState = FormWindowState.Normal;
                                                                    this.ShowInTaskbar = true;
                                                                }



                                                      все как надо работает.))
                                                      Сообщение отредактировано: freeway -
                                                      1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                                      0 пользователей:


                                                      Рейтинг@Mail.ru
                                                      [ Script execution time: 0,0548 ]   [ 15 queries used ]   [ Generated: 14.07.25, 17:26 GMT ]