
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.199] |
![]() |
|
Сообщ.
#1
,
|
|
|
каке событие в С# для окна отвечает за его сворачивание ?
|
Сообщ.
#2
,
|
|
|
Скорее всего придется перехватывать события, которые винда посылает окну - это если нужно отловить сам момент сворачивания.
Если нужно отлавливать уже измененное состояние, то событие SizeChanged() в котором смотри на свойство WindowState. |
Сообщ.
#3
,
|
|
|
Twilight, спасибо - вроде получилось.
Я отловил этот момент и делаю форму Visible = false; Для того, чтоб ее достать я дважды щелкаю на иконку в трее и она показывается this.Visible = true; this.WindowState = FormWindowState.Normal. Но вот никак не могу при запуске приложения эту форму сразу свернуть. Тоесть this.Visible = false не работает ни после инициадизации компонент, ни после FormLoad. Как ее запустить нефидимой ? или может есть какие свойства у компанент, чтоб это автоматом делалось ? |
Сообщ.
#4
,
|
|
|
Невидимой всмысле свернутой? Если так - то WindowState в Minimized ставь перед отображением формы
|
Сообщ.
#5
,
|
|
|
а отлавлю ли я тогда событие, если форма сразу показывается свернутой. Тоесть изменение размеров-то не произойдет... (SizeChanged)
|
Сообщ.
#6
,
|
|
|
отловишь
|
Сообщ.
#7
,
|
|
|
Цитата Twilight @ отловишь а вот почему-то и не отлавливается ![]() |
Сообщ.
#8
,
|
|
|
показывай код, раз не отлавливается
|
Сообщ.
#9
,
|
|
|
Цитата Twilight @ показывай код, раз не отлавливается да особо показывать-то и нечего ![]() в общем событие при запуске приходит. Причем 2 раза. Я делаю Visible = false, но после этого окно все-равно отображается свернутым в панели задач. А хотелось бы при запуске его доставать только из трея. Может как по-другому еще можно ? |
Сообщ.
#10
,
|
|
|
ShowInTaskbar=false;
|
Сообщ.
#11
,
|
|
|
Цитата cthutq @ в общем событие при запуске приходит. Причем 2 раза. что впринципе логично - создание окна и сворачивание окна |
Сообщ.
#12
,
|
|
|
Цитата cthutq @ А хотелось бы при запуске его доставать только из трея. Ты чего спросить то хотел? Про сворачивание формы или про то как поместить программу в трей? Если первое то тебе цуже ответили. если второе, то NotifyIcon используй. |
Сообщ.
#13
,
|
|
|
Цитата wdk @ ShowInTaskbar=false; это что ? Цитата Twilight @ что впринципе логично - создание окна и сворачивание окна да, но мне от этого не легче ![]() Цитата arbuzov @ Ты чего спросить то хотел? Про сворачивание формы или про то как поместить программу в трей? Если первое то тебе цуже ответили. если второе, то NotifyIcon используй. Сворачивание я понял как отловить. NotifyIcon использую, но мне нужно через NotifyIcon управлять формой. А для этого нужно хотябы для начала ее не показывать при запуске |
Сообщ.
#14
,
|
|
|
Цитата wdk @ ShowInTaskbar=false; + ![]() ![]() private void fmMain_Activated(object sender, EventArgs e) { Hide(); } зы а зачем форму создавать если ее сразу скрывать? |
Сообщ.
#15
,
|
|
|
Цитата arbuzov @ зы а зачем форму создавать если ее сразу скрывать? при ее инициализации происходит сетевое соединенние с сервером. попробую с Hide() & ShowInTaskbar. З.Ы. Нашел примерчик с ShowInTaskbar ![]() ![]() 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; } но почему-то слетает с исключением при создании окна ![]() |
Сообщ.
#16
,
|
|
|
Цитата cthutq @ при ее инициализации происходит сетевое соединенние с сервером. Если по хорошему - то надо разделять код представления (UI) от бизнес-логики, хотя бы разнеся их по разным классам, а еще лучше в разные namespaces Цитата cthutq @ но почему-то слетает с исключением при создании окна все вот надо клещами вытягивать ![]() |
Сообщ.
#17
,
|
|
|
Цитата Twilight @ Если по хорошему - то надо разделять код представления (UI) от бизнес-логики +1 Соединение с сервером незачем привязывать к создапнию главной формы |
Сообщ.
#18
,
|
|
|
вот тоже сталкивался с такими проблемами и решил добавить вопросик по тем
все вышесказанное(имеется в виду отлавливание сворачивания через ресайз окна) работает при условии что у формы например FormBorderStyle = FormBorderStyle.FixedToolWindow, или другой фиксированный, но как быть если FormBorderStyle = FormBorderStyle.Sizable. В этом случае события которые должны происходить при сворачивании формы будут срабатывать при каждом ресайзе формы |
Сообщ.
#19
,
|
|
|
Цитата Twilight @ Если по хорошему - то надо разделять код представления (UI) от бизнес-логики, хотя бы разнеся их по разным классам, а еще лучше в разные namespaces у меня класс отвечающий за соединение находится в отдельном классе и в отдельном namespace. Но сам класс-то является членом класса-формы. При запуске формы происходит попытка соединения и если удачно, то доступны некие кнопки. Интересно - как это можно разнести ? |
Сообщ.
#20
,
|
|
|
Цитата Pit-Bul @ но как быть если FormBorderStyle = FormBorderStyle.Sizable. можно делать по-простому - запоминать предыдущее состояние WindowState и сравнивать с текущим - не ихменилось - событие не о том что нам надо. Если делать по-хорошему, то переопределить оконную процедуру и отлавливать в ней события минимизации и максимизации. Впринципе добавится строк 10 кода. Мне больше этот вариант нравится. Еще хорош он и тем, что отлавливать эти события будешь в момент их возникновения, а не пост-фактум как с ловлей изменения размеров окна, т.е. если надо, сможешь его отменить. Цитата cthutq @ Интересно - как это можно разнести ? мое мнение вынести вызов метода соединения с сервером из конструктора в другое место, когда форма уже будет загружена. |
Сообщ.
#21
,
|
|
|
Цитата Twilight @ Скорее всего придется перехватывать события, которые винда посылает окну - это если нужно отловить сам момент сворачивания. Если нужно отлавливать уже измененное состояние, то событие SizeChanged() в котором смотри на свойство WindowState. Сори что старую тему поднял... Может лучше добавить свое событие, перекрыть свойство WindowState и при его вызове щелкать событием? И возможно ли такое? Просто как по мне способ с SizeChanged не очень красивый... |
Сообщ.
#22
,
|
|
|
меня интересует тот же вопрос:
все прекрасно работает: ![]() ![]() 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; } я тоже хочу чтоб при старте программа сразу заворачивалась в трей - прога стартует вместе с виндовсом, и каждый раз ее вручную сворачивать не очень удобно. добавил: ![]() ![]() private void Main_f_Activated(object sender, EventArgs e) { this.Hide(); } теперь порядок - прога при старте сразу в трее, но чтоб ее оттуда достать, надо сделать на notifyIcon три двойных щелчка)))) причем видно, на первые 2 она реагирует и тут же заворачивается, а на третий остается развернутой) Подскажите как поправить? |
Сообщ.
#23
,
|
|
|
Почему бы просто не поставить Visible=false у формы в дизайнере?
|
Сообщ.
#24
,
|
|
|
У формы есть методы Hide и Show - спрятать/показать форму.
Но в конструкторе или FormLoad они не срабатывают. Я сделал так - в FormLoad запускаю таймер на 0.5-1 сек, в событии этого таймера делаю Hide, после чего таймер выключаю. Форма висит эти 0.5-1 сек и исчезает. А дальше юзер из меню иконы в трее ее показывает/прячет когда захочет. Показать/спрятать - пункты меню. В обработчиках просто стоит this.Hide (); либо this.Show (). В этих же обработчиках можно флаг свой переключать - форма спрятана или нет. Проблем у меня с таким подходом никогда не возникало. |
Сообщ.
#25
,
|
|
|
![]() ![]() Но в конструкторе или FormLoad они не срабатывают. Я сделал так - в FormLoad запускаю таймер на 0.5-1 сек, в событии этого таймера делаю Hide, после чего таймер выключаю. Форма висит эти 0.5-1 сек и исчезает. Тихий ужас ![]() Алсо, как же вы всё сложно придумываете, не проще ли завести отдельное свойство которое будет отвечать за показ формы? Пусть это будет "IsMinimized", вот простейший пример: ![]() ![]() 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; } } И использовать его для скрытия/показа формы в процессе работы: ![]() ![]() private void NotifyIcon_Main_MouseClick (object sender, MouseEventArgs e) { if (!this.Created || e.Button != MouseButtons.Left) { return; } this.IsMinimized = !this.IsMinimized; } И в процессе загрузки формы: ![]() ![]() 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 строк в аттаче. Прикреплённый файл ![]() |
Сообщ.
#26
,
|
|
|
TerraGhost спасибо за пример)
а я сделал так: в свойстве формы WindowsState установил - Minimized и ![]() ![]() public Main_f() { InitializeComponent(); this.ShowInTaskbar = false; } private void notifyIcon_DoubleClick(object sender, EventArgs e) { Show(); WindowState = FormWindowState.Normal; this.ShowInTaskbar = true; } все как надо работает.)) |