Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / А как грамотно стартануть Form1 с изначально .Visible=false ? / 16 сообщений из 16, страница 1 из 1
02.02.2015, 19:49
    #38869814
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
А как грамотно стартануть Form1 с изначально .Visible=false ?
Скорее всего буду использовать вариант запуска через 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
02.02.2015, 20:26
    #38869828
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
А как грамотно стартануть Form1 с изначально .Visible=false ?
Дмитрий77Какие нормальные четкие варианты?
Согласен на API.
WM_CREATE ловить через Protected Overrides Sub WndProc ?
и переопределять стиль окна?
ты всё через задний проход делаешь?

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

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

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

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

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

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

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

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

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

форма не нужна, нужен ApplicationContext ( с иконкой, меню и т д)
...
Рейтинг: 0 / 0
02.02.2015, 22:37
    #38869901
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
А как грамотно стартануть Form1 с изначально .Visible=false ?
Дмитрий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
02.02.2015, 22:41
    #38869903
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
А как грамотно стартануть Form1 с изначально .Visible=false ?
Ну и содержимое 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
02.02.2015, 22:51
    #38869906
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
А как грамотно стартануть Form1 с изначально .Visible=false ?
Накидал пример без "главной" формы
Код: 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
03.02.2015, 02:14
    #38869972
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
А как грамотно стартануть Form1 с изначально .Visible=false ?
ИзопропилНакидал пример без "главной" формы
Мне окно нужно - с 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
03.02.2015, 04:44
    #38869987
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
А как грамотно стартануть Form1 с изначально .Visible=false ?
Дмитрий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
03.02.2015, 05:56
    #38869996
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
А как грамотно стартануть Form1 с изначально .Visible=false ?
ИзопропилДмитрий77,

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

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

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

Произвольный Singleton/StaticClass, для хранения меню, таймеров и прочего - вполне устраивает.
...
Рейтинг: 0 / 0
03.02.2015, 06:10
    #38869998
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
А как грамотно стартануть Form1 с изначально .Visible=false ?
Алексей К 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
03.02.2015, 07:32
    #38870015
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
А как грамотно стартануть Form1 с изначально .Visible=false ?
ИзопропилАлексей К 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
03.02.2015, 09:23
    #38870058
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
А как грамотно стартануть Form1 с изначально .Visible=false ?
Дмитрий77За пример с Net-овским NotifyIcon спасибо, но скорее всего мне все-таки придется использовать родную Shell_NotifyIcon+ NOTIFYICONDATA.Надо, используйте.

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

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

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

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


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