powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / А как грамотно стартануть Form1 с изначально .Visible=false ?
16 сообщений из 16, страница 1 из 1
А как грамотно стартануть Form1 с изначально .Visible=false ?
    #38869814
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скорее всего буду использовать вариант запуска через main(), т.е.
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
Module Module1
  Public Form1 As frm1
  Sub main()
    Application.EnableVisualStyles()
    Form1 = New frm1
    Application.Run(Form1)
  End Sub
End Module


хотя думаю main/стартовая форма вопрос можно ставить одинаково.

.Visible=false в конструкторе делать в .Net нельзя.
В frm1_Load это не работает.
В frm1_Shown это делать поздно - она промелькнет.

!!! frm1_Load должна отрабатывать
(в .Net есть какие-то идиотские методы но при этом не отрабатывает Load)

Какие нормальные четкие варианты?
Согласен на API.
WM_CREATE ловить через Protected Overrides Sub WndProc ?
и переопределять стиль окна?

Обсуждать зачем желания нет. Консоль не годится. Например форма нужна для TrayIcon или если мне нужен валидный Handle/Text окна.
...
Рейтинг: 0 / 0
А как грамотно стартануть Form1 с изначально .Visible=false ?
    #38869828
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Какие нормальные четкие варианты?
Согласен на API.
WM_CREATE ловить через Protected Overrides Sub WndProc ?
и переопределять стиль окна?
ты всё через задний проход делаешь?

Пока форме Show() не скажешь, она никак не появится .
...
Рейтинг: 0 / 0
А как грамотно стартануть Form1 с изначально .Visible=false ?
    #38869837
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропил,

опять ты со своим задним проходом а полезной информации в твоих словах ноль.

И вроде ведь разбираешься и понимаешь о чем я говорю и что любое окно имеет право быть создано без стиля WS_VISIBLE.

>Пока форме Show() не скажешь

Да хоть Application.Run(Form1) хоть .Show хоть .ShowDialog

Вот мне и нужно чтоб было Load() без Show().
А в .Net конструктивно так не получается.
Но обойти думаю можно.
...
Рейтинг: 0 / 0
А как грамотно стартануть Form1 с изначально .Visible=false ?
    #38869862
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77, а зачем обходить?
Приложение прекрасно запускается и без показа формы. А логику, что Вы запихнули в Load, следует вынести в отдельный класс.
ООП и никаких костылей :)
...
Рейтинг: 0 / 0
А как грамотно стартануть Form1 с изначально .Visible=false ?
    #38869872
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANA,

А как предлагаешь? Пример кода не дашь?
Исходим из того что форма мне нужна в "запущенном" виде но без показа ее самой.
Т.е. есть на ней таймер - должен тикать.
Есть меню - должно функционировать (то кот. в трей выводится, ну с этим пока не разбирался).
Причем именно форма должна "держать приложение"

Имею ввиду что Application.Run(Form1) - передает управление форме из main() и main не завершается до закрытия формы.
...
Рейтинг: 0 / 0
А как грамотно стартануть Form1 с изначально .Visible=false ?
    #38869890
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77,

с разборок с треем и следует начинать

форма не нужна, нужен ApplicationContext ( с иконкой, меню и т д)
...
Рейтинг: 0 / 0
А как грамотно стартануть Form1 с изначально .Visible=false ?
    #38869901
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77, ну вот откопал проект времён .Net 2.0 (на C#):

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
using System.Windows.Forms;

namespace Something.Client
{
    public partial class MainForm : Form
    {
        const string ITEM_EXIT = "Exit";
        const string ITEM_HIDE_WINDOW = "Hide window";
        const string ITEM_SHOW_WINDOW = "Show window";

        public MainForm()
        {
            InitializeComponent();

            // Создаём объект для иконки в System Tray
            notifyIcon = new NotifyIcon();
            notifyIcon.Icon = this.Icon;

            // Создаём и инициализируем контекстное меню
            MenuItem[] menuItems = new MenuItem[] { new MenuItem(ITEM_SHOW_WINDOW), new MenuItem(ITEM_HIDE_WINDOW), new MenuItem(ITEM_EXIT) };

            notifyIcon.ContextMenu = new ContextMenu(menuItems);
            notifyIcon.ContextMenu.MenuItems[1].Enabled = false;

            foreach (MenuItem menuItem in notifyIcon.ContextMenu.MenuItems)
            {
                menuItem.Click += new EventHandler(OnMenuItemClick);
            }

            notifyIcon.BalloonTipClicked += new EventHandler(OnBalloonTipClicked);
            notifyIcon.MouseClick += new MouseEventHandler(OnNotifyIconMouseClick);
            notifyIcon.Visible = true;
        }

        private void OnBalloonTipClicked(object sender, EventArgs e)
        {
            if (!Visible)
            {
                ShowDialog();
            }

            if (WindowState == FormWindowState.Minimized)
            {
                WindowState = FormWindowState.Normal;
            }
        }

        private void OnMenuItemClick(object sender, EventArgs e)
        {
            MenuItem menuItem = sender as MenuItem;

            // Анализируем какой MenuItem clik'нули и выполняем соответствующее действие
            switch (menuItem.Text)
            {
                // Убираем иконку из system tray и завершаем работу приложения
                case ITEM_EXIT:
                    notifyIcon.Visible = false;
                    Application.Exit();
                    break;
                case ITEM_HIDE_WINDOW:
                    Close();
                    break;
                case ITEM_SHOW_WINDOW:
                    ShowDialog();
                    break;
            }
        }

        private void OnNotifyIconMouseClick(object sender, MouseEventArgs e)
        {
            if (e.Button != MouseButtons.Left)
            {
                return;
            }

            if (Visible)
            {
                Close();
            }
            else
            {
                ShowDialog();
            }
        }
    }
}
...
Рейтинг: 0 / 0
А как грамотно стартануть Form1 с изначально .Visible=false ?
    #38869903
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну и содержимое Sub main():

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
static class Program
{
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main(string[] args)
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);

        // Запускаем приложение, но не делаем форму видимой
        mainForm = new MainForm();
        Application.Run();
    }
}
...
Рейтинг: 0 / 0
А как грамотно стартануть Form1 с изначально .Visible=false ?
    #38869906
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Накидал пример без "главной" формы
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public class CustomApplicationContext : ApplicationContext
    {
        private System.ComponentModel.Container components;
        private NotifyIcon notifyIcon;
        private System.Windows.Forms.Timer timer;
        private int tics = 0;
        public CustomApplicationContext()
        {                  
            components = new System.ComponentModel.Container();
            notifyIcon = new NotifyIcon(components)            
            {
                Icon = new Icon(SystemIcons.Exclamation, 16, 16),
                Text = "Zero",               
                Visible = true
            };
            notifyIcon.DoubleClick += (s, e) => { MessageBox.Show("DoubleClick"); };            
            notifyIcon.ContextMenu = new ContextMenu(new MenuItem[]{
              new MenuItem("&Show", (s, e) => { MessageBox.Show("Show"); }),
              new MenuItem("E&xit", (s, e) => { ExitThread(); })
            });
            timer = new Timer(components);
            timer.Interval = 1000;
            timer.Tick += (s, e) => { notifyIcon.Text = "Tics"+(tics++).ToString(); };
            timer.Start();
        }        
    }

    static class Program
    {
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
         
            ApplicationContext applicationContext = new CustomApplicationContext();         
            Application.Run(applicationContext);
        }
    }
}
...
Рейтинг: 0 / 0
А как грамотно стартануть Form1 с изначально .Visible=false ?
    #38869972
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилНакидал пример без "главной" формы
Мне окно нужно - с handle и с заголовком, по которому его можно найти извне.
И скажем так, нет желания создавать подконтролы ApplicationContext и обработчики событий из кода -больше устраивает стандартная модель формы.

skyANA,

skyANA
Код: c#
1.
2.
3.
4.
5.
   // Запускаем приложение, но не делаем форму видимой
        mainForm = new MainForm();
        Application.Run();
    }
}




У тебя из-за Application.Run() надо делать Application.Exit()
Я привык закрывать форму
когда Application.Run(mainForm) предотвращает main() от выхода.

Опять же, при Application.Run() мало того что не работает Load формы(но это ладно, бог с ним), ее handle/text (который мне нужен) автоматом не грузится.

За пример с Net-овским NotifyIcon спасибо, но скорее всего мне все-таки придется использовать родную Shell_NotifyIcon+ NOTIFYICONDATA. У меня там довольно сложная конструкция (меню+уведомления+примечание при наведении мыши в стиле висты) и я не уверен что Net-обертка это покрывает хотя бы частично и реально хотя бы комбинировать - надо смотреть возможности контрола.

=================

По теме вопроса (как я его задал, а не что можно придумать вместо) вроде как прокатывает такой вариант:

В конструкторе формы:
ShowInTaskBar = False
WindowState=Minimized

Код запуска такой:

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Module Module1
  Public Form1 As frm1

  Sub main()
    Application.EnableVisualStyles()
    Form1 = New frm1
    Application.Run(Form1)
  End Sub
End Module

Public Class frm1
  Private Sub frm1_Load(sender As Object, e As EventArgs) Handles Me.Load
    Me.Visible = False
  End Sub
End Class



По крайней мере это работает без мультипликаций и обеспечивает ожидаемое поведение.
Me.Visible = False в Load срабатывает корректно (при этой конфигурации конструктора)

Последовательность (проверял) получается такая:

Код: vbnet
1.
2.
3.
4.
5.
WM_CREATE
WM_SHOWWINDOW(m.WParam=SW_SHOWNORMAL) 'полагаю заложено конструктивно в .Net -если его подавить то Form_Load не вызывается
Form_Load (.Net событие)
WM_SHOWWINDOW(m.WParam=SW_HIDE) 'как результат Me.Visible = False из Load
Form_Shown (.Net событие)



Т.е. реально форма загружается с "изначально" Visible=False, при этом имеет handle, Load отрабатывает и main() держится именно за счет загруженной формы.
Надо еще смотреть, насколько этот вариант приемлим и безглючен.
...
Рейтинг: 0 / 0
А как грамотно стартануть Form1 с изначально .Visible=false ?
    #38869987
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77,

с чем воюешь - непонятно
Дмитрий77У тебя из-за Application.Run() надо делать Application.Exit()
Я привык закрывать форму
когда Application.Run(mainForm) предотвращает main() от выхода.
закрывай, какая разница?
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public class CustomApplicationContext : ApplicationContext
    {       
        private NotifyIcon notifyIcon;
        private Form frm;
        public CustomApplicationContext()
        {                              
            notifyIcon = new NotifyIcon()
            {
                Icon = new Icon(SystemIcons.Exclamation, 16, 16),
                Text = "Zero",
                BalloonTipTitle = "TL",
                BalloonTipText = "TX",
                BalloonTipIcon = ToolTipIcon.Info,                
                Visible = true
            };
            notifyIcon.DoubleClick += (s, e) => { MessageBox.Show("DoubleClick"); };            
            notifyIcon.ContextMenu = new ContextMenu(new MenuItem[]{
              new MenuItem("Show&Tip", (s, e) => { notifyIcon.ShowBalloonTip(3000); }),
              new MenuItem("&Show", (s, e) => { MainForm.Show(); }),
              new MenuItem("&Close", (s, e) => { MainForm.Close(); }),
              new MenuItem("E&xit", (s, e) => { ExitThread(); })
            });            
            MainForm = new Form();
            MainForm.Load += (s, e) => { 
                (s as Form).Visible = false;
                (s as Form).ShowInTaskbar = false;
            };
        }
        protected override void OnMainFormClosed(object sender, EventArgs e)
        {
            notifyIcon.Dispose();
            ExitThread();            
        }
    }

    static class Program
    {
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
         
            ApplicationContext applicationContext = new CustomApplicationContext();         
            Application.Run(applicationContext);
        }
    }
}

...
Рейтинг: 0 / 0
А как грамотно стартануть Form1 с изначально .Visible=false ?
    #38869996
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилДмитрий77,

с разборок с треем и следует начинать

форма не нужна, нужен ApplicationContext ( с иконкой, меню и т д)Зачем ApplicationContext?

Begins running a standard application message loop on the current thread, without a form.

Произвольный Singleton/StaticClass, для хранения меню, таймеров и прочего - вполне устраивает.
...
Рейтинг: 0 / 0
А как грамотно стартануть Form1 с изначально .Visible=false ?
    #38869998
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей К Begins running a standard application message loop on the current thread, without a form.

здесь и ответ - авторMost Windows Forms developers will not need to use this version of the method. You should use the Run(Form) overload to start an application with a main form, so that the application terminates when the main form is closed. For all other situations, use the Run(ApplicationContext) overload, which supports supplying an ApplicationContext object for better control over the lifetime of the application.
...
Рейтинг: 0 / 0
А как грамотно стартануть Form1 с изначально .Visible=false ?
    #38870015
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилАлексей К Begins running a standard application message loop on the current thread, without a form.

здесь и ответ - авторMost Windows Forms developers will not need to use this version of the method. You should use the Run(Form) overload to start an application with a main form, so that the application terminates when the main form is closed. For all other situations, use the Run(ApplicationContext) overload, which supports supplying an ApplicationContext object for better control over the lifetime of the application. Что нам даёт "better control over the lifetime of the application"? Что я не смогу сделать, используя глобальный объект Application?
...
Рейтинг: 0 / 0
А как грамотно стартануть Form1 с изначально .Visible=false ?
    #38870058
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77За пример с Net-овским NotifyIcon спасибо, но скорее всего мне все-таки придется использовать родную Shell_NotifyIcon+ NOTIFYICONDATA.Надо, используйте.

Только используйте правильно: напишите свой компонент (или поищите готовый). А не вбивайте сбоку костыли к стандартным.
Чтобы не создавать топики вроде этого :)
...
Рейтинг: 0 / 0
А как грамотно стартануть Form1 с изначально .Visible=false ?
    #38870325
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAДмитрий77За пример с Net-овским NotifyIcon спасибо, но скорее всего мне все-таки придется использовать родную Shell_NotifyIcon+ NOTIFYICONDATA.Надо, используйте.

Только используйте правильно: напишите свой компонент (или поищите готовый). А не вбивайте сбоку костыли к стандартным.
Чтобы не создавать топики вроде этого :)

Не-не. Уже глянул. Мешать ничего не буду. Net-компонент NotifyIcon не поддерживает NOTIFYICON_VERSION_4, т.е. например для Ballon Notification можно использовать только 4 маленькие стандартные иконки (error, info...). Не годится он.

>Чтобы не создавать топики вроде этого
Ну, собственно топик этот был на совершенно другую тему. Как всегда съехали в сторону от темы.
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / А как грамотно стартануть Form1 с изначально .Visible=false ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]