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


Автор: SeeD 31.8.2006, 22:41
Приветсвую! 
Я свернул программу в трей. А как сделать, чтобы при клике на иконке правой мышкой появлялась меню? Например, чтобы можно было выбрать между выходом из программы и настройками.
И еще такой вопрос : 
Можно ли сделать, чтобы бы была только форма? Без кнопки закрытия, в правом углу.
Сильно н ругайтесь, на .net перешел вчера... =)

Автор: marcusmae 31.8.2006, 23:01
на второй вопрос :

Цитата

Можно ли сделать, чтобы бы была только форма? Без кнопки закрытия, в правом углу.


Можно. У формы есть свойство ControlBox. Под этим боксом понимаются сразу все три : MinimizeBox, MaximizeBox, CloseBox (ещё есть HelpBox, но он по умолчанию выключен). Так вот, чтобы разом уволить всех троих, нужно

Код

form1.ControlBox = false;


правда, кнопки минимизации тогда не будет, но остаётся работать то, что было, начиная с самых первых оконных систем : минимизация/максимизация двойным кликом по заголовку формы.

Можно по-другому : перехватывать сообщение, возникающее при нажатии кнопки закрытия. Для этого следующую перегрузку метода WndProc следует добавить в класс формы :

Код

        protected override void WndProc(ref Message m)
        {
            // шестнадцатиричные коды сообщений 
            int WM_SYSCOMMAND = System.Convert.ToInt32("112",16);
            int SC_CLOSE = System.Convert.ToInt32("F060", 16);

            // ловим нужные нам сообщения
            if ((m.Msg == WM_SYSCOMMAND) && (m.WParam.ToInt32() == SC_CLOSE))
            {
                // нажата кнопка закрытия
                DialogResult dialogResult = MessageBox.Show("Вы действительно хотите нас покинуть?", "Подтверждение",
                    MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2);
                if (dialogResult == DialogResult.Yes) this.Close();
                return;
            }

            // запускаем унаследованный стандартный обработчик для всех остальных сообщений
            base.WndProc(ref m);
        }


- научился у http://www.thescripts.com/forum/thread336114.html.

Добавлено @ 23:09 
На счёт первого вопроса - думаю, что стоит копать от трей-решения, которое предложил mr.DUDA в ответ на http://forum.vingrad.ru/index.php?showtopic=109492. То есть, либо навесить ContextMenuStrip на notifyIcon, либо добавить обработчик клика правой кнопкой. 

Автор: ivashkanet 1.9.2006, 08:16
Цитата(marcusmae @  31.8.2006,  23:01 Найти цитируемый пост)
ContextMenuStrip

Конечно его smile Он специально и создан для этих целей smile
Строишь меню, а потом присваеваешь его свойству ContextMenuStrip
 smile

Добавлено @ 08:18 
Цитата(marcusmae @  31.8.2006,  23:01 Найти цитируемый пост)
  protected override void WndProc(ref Message m)

Круто, такое нужно в ФАК

Автор: VisualProgrammerNET 1.9.2006, 13:40
Чем не нравится обычный Form_Closing?  smile 

Код

public void Form_Closing(Евент e)
{
     //показываем мессажбокс с выбором
     if (нет) e.Cancel = true;
} 

Зачем WinProc какой-то?  smile 
  
Кнопку закрытия и вообще форму без кнопок можно сделать указав в свойствах BorderStyle = none.

Автор: marcusmae 1.9.2006, 13:58
Цитата

Зачем WinProc какой-то?


да, согласен, Ваш пример проще. Пусть тогда мой будет иллюстрацией более общих возможностей. Всё-равно ведь, Form_Closing срабатывает при появлении сообщения SC_CLOSE ;)

Автор: ivashkanet 1.9.2006, 14:02
Цитата(VisualProgrammerNET @  1.9.2006,  13:40 Найти цитируемый пост)
Зачем WinProc какой-то? 

VisualProgrammerNET, тут он действительно не лучше smile
Но какая стоит за ним мощь smile Через него можно ведь отлавливать любое сообщение  smile 

Автор: SeeD 1.9.2006, 22:33
ух ты! спасибо! не ожидал таких полных ответов! благодарю! пойду пробовать

Автор: Legolas 28.8.2007, 11:01
Цитата(SeeD @ 31.8.2006,  22:41)
Можно ли сделать, чтобы бы была только форма? Без кнопки закрытия, в правом углу.

В свойствах формы поменяй значение параметра ControlBox на "false".

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