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


Автор: cthutq 14.2.2007, 10:16
Хотелось бы при запуске приложения, чтоб окно не показывалось, а только
в трее появлялась иконка.

Я сделал что при двойном щелчке на иконке в трее окно показывалось, а при минимизации
окна отлавливалось событие и окно делалось невидимым. Но никак не могу
при запуске приложения сделать так, чтоб окно сразу не показывалось.

Ловлю при SizeChanged
Код

if (this.WindowState == FormWindowState.Minimal) this.Visible = false;


а при двойном клике
Код

this.Visible = true;
this.WindowState = FormWindowState.Normal.


Сделал свойство самого окна Minimal. При запуске событие приходит.
Я делаю Visible = false;, но после этого окно все-равно отображается свернутым
в панели задач.
Как все-таки при запуске сделать форму невидимой ?

Автор: Naum 14.2.2007, 11:22
Можно просто запускать приложение не с формы.
Найди процедуру Main(). В ней должно быть что-то вроде
Код

Application.Run(Form1);

Удали эту строчку и добавь примерно следующее
Код

NotifyIcon myNotifyIcon = new NotifyIcon();
//Определяем необходимые свойства myNotifyIcon, в том числе и устанавливаем myNotifyIcon.Visible = true.
Application.Run();

А при двойном клике по myNotifyIcon определяем, если нужная нам форма == null, тогда создаем ее и выполняем исходную логику.

Автор: mr.DUDA 14.2.2007, 12:15
Кстати тема о сворачивании приложения в трей уже поднималась много раз, поищите по форуму.

Автор: cthutq 14.2.2007, 15:07
Цитата(Naum @  14.2.2007,  11:22 Найти цитируемый пост)
Удали эту строчку и добавь примерно следующее

получается, что все менюшки, иконки, события... руками нужно прописывать ?
Слишком накладно

Автор: Naum 14.2.2007, 15:10
Цитата(cthutq @  14.2.2007,  16:07 Найти цитируемый пост)
получается, что все менюшки, иконки, события... руками нужно прописывать ?

Зачем? От удаления этой строки редактор форм не перестает работать. 

Автор: cthutq 17.2.2007, 01:07
Цитата(Naum @  14.2.2007,  15:10 Найти цитируемый пост)
Зачем? От удаления этой строки редактор форм не перестает работать. 

... Не совсем понял smile


Автор: Naum 19.2.2007, 10:33
cthutq, это я не понял, почему, при замене строки Application.Run(...), менюшки, иконки, события придется рисовать вручную?

Автор: ckopn 21.2.2007, 14:04
Цитата(cthutq @ 17.2.2007,  01:07)
Цитата(Naum @  14.2.2007,  15:10 Найти цитируемый пост)
Зачем? От удаления этой строки редактор форм не перестает работать. 

... Не совсем понял :)

Это значит пишешь

Form2 form = new Form2();
form.ShowDialog();

Form2 Это форма которую создал ты сам в Висуал Студио. Нарисовал короче.

Автор: cthutq 21.2.2007, 20:33
Цитата(ckopn @  21.2.2007,  14:04 Найти цитируемый пост)
Form2 form = new Form2();
form.ShowDialog();

Form2 Это форма которую создал ты сам в Висуал Студио. Нарисовал короче.

это я понял. Но ведь poppup-меню из трея создается на форме. А если создавать форму 
при щелчке на трее, то как тогда ?

Просто я не совсем понимаю как можно создать NotifyIcon и меню для него без главного окна приложения.

Можно простейший примерчик main (может понятней станет)

Автор: ivashkanet 22.2.2007, 10:03
Цитата(cthutq @  21.2.2007,  19:33 Найти цитируемый пост)
Но ведь poppup-меню из трея создается на форме

Нет. Это просто дизайнер создает его за тебя
Цитата(cthutq @  21.2.2007,  19:33 Найти цитируемый пост)
Можно простейший примерчик main (может понятней станет) 

Naum ведь давал его.

Автор: ivashkanet 22.2.2007, 10:59
Наваял проект (см. в атаче)

Класс Programm где и создается иконка в трее
Код

    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);

            // Создаем иконку в трее и назначаем ей менюшку 
            NotifyIcon trayMenu = new NotifyIcon();

            trayMenu.Icon = Properties.Resources.TrayIcon;
            trayMenu.ContextMenuStrip = new MenuInTray();

            // Показываем ее
            trayMenu.Visible = true;

            // Запускаем приложение
            Application.Run();
        }


Менюшка, которая будет висеть на иконке в трее
Код

    public class MenuInTray : ContextMenuStrip
    {
        private ToolStripMenuItem _showFormToolStripMenuItem;
        private ToolStripMenuItem _closeApplicationToolStripMenuItem;

        public MenuInTray()
            : base()
        {
            _showFormToolStripMenuItem = new ToolStripMenuItem("Показать форму");
            _showFormToolStripMenuItem.Click += new EventHandler(_showFormToolStripMenuItem_Click);
            this.Items.Add(_showFormToolStripMenuItem);

            _closeApplicationToolStripMenuItem = new ToolStripMenuItem("Выход");
            _closeApplicationToolStripMenuItem.Click += new EventHandler(_closeApplicationToolStripMenuItem_Click);

            this.Items.Add(_closeApplicationToolStripMenuItem);
        }

        void _showFormToolStripMenuItem_Click(object sender, EventArgs e)
        {
            MainFormInstance.MainForm.Show();
            if (MainFormInstance.MainForm.WindowState == FormWindowState.Minimized)
                MainFormInstance.MainForm.WindowState = FormWindowState.Normal;
        }

        void _closeApplicationToolStripMenuItem_Click(object sender, EventArgs e)
        {
            MainFormInstance.MainForm.Dispose();
            Application.Exit();
        }
    }


Форма, которая только что и делает, что сворачивается вместо закрытия
Код

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            this.WindowState = FormWindowState.Minimized;
            this.Hide();

            e.Cancel = true;
        }
    }


Небольшой классик, которы предоставляет доступ к форме из любого места
Код

    public class MainFormInstance
    {
        private static Form1 _mainForm;

        public static Form1 MainForm
        {
            get
            {
                if (_mainForm == null) _mainForm = new Form1();
                return _mainForm;
            }
        }
    }

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