Многопоточные приложения на C++
bytestream 14.05.2025
C++ всегда был языком, тесно работающим с железом, и потому особеннно эффективным для многопоточного программирования. Стандарт C++11 произвёл революцию, добавив в язык нативную поддержку потоков,. . .
Stack, Queue и Hashtable в C#
UnmanagedCoder 14.05.2025
Каждый опытный разработчик наверняка сталкивался с ситуацией, когда невинный на первый взгляд List<T> превращался в узкое горлышко всего приложения. Причина проста: универсальность – это прекрасно,. . .
Как использовать OAuth2 со Spring Security в Java
Javaican 14.05.2025
Протокол OAuth2 часто путают с механизмами аутентификации, хотя по сути это протокол авторизации. Представьте, что вместо передачи ключей от всего дома вашему другу, который пришёл полить цветы, вы. . .
Анализ текста на Python с NLTK и Spacy
AI_Generated 14.05.2025
NLTK, старожил в мире обработки естественного языка на Python, содержит богатейшую коллекцию алгоритмов и готовых моделей. Эта библиотека отлично подходит для образовательных целей и. . .
Реализация DI в PHP
Jason-Webb 13.05.2025
Когда я начинал писать свой первый крупный PHP-проект, моя архитектура напоминала запутаный клубок спагетти. Классы создавали другие классы внутри себя, зависимости жостко прописывались в коде, а о. . .
Обработка изображений в реальном времени на C# с OpenCV
stackOverflow 13.05.2025
Объединение библиотеки компьютерного зрения OpenCV с современным языком программирования C# создаёт симбиоз, который открывает доступ к впечатляющему набору возможностей. Ключевое преимущество этого. . .
POCO, ACE, Loki и другие продвинутые C++ библиотеки
NullReferenced 13.05.2025
В C++ разработки существует такое обилие библиотек, что порой кажется, будто ты заблудился в дремучем лесу. И среди этого многообразия POCO (Portable Components) – как маяк для тех, кто ищет. . .
Паттерны проектирования GoF на C#
UnmanagedCoder 13.05.2025
Вы наверняка сталкивались с ситуациями, когда код разрастается до неприличных размеров, а его поддержка становится настоящим испытанием. Именно в такие моменты на помощь приходят паттерны Gang of. . .
Создаем CLI приложение на Python с Prompt Toolkit
py-thonny 13.05.2025
Современные командные интерфейсы давно перестали быть черно-белыми текстовыми программами, которые многие помнят по старым операционным системам. CLI сегодня – это мощные, интуитивные и даже. . .
Конвейеры ETL с Apache Airflow и Python
AI_Generated 13.05.2025
ETL-конвейеры – это набор процессов, отвечающих за извлечение данных из различных источников (Extract), их преобразование в нужный формат (Transform) и загрузку в целевое хранилище (Load). . . .
Сегодня рассмотрим немаловажную функцию многих программ — сворачивание в трей (для тех кто не знает это область где находятся системные часы, регулятор громкости и т.п.). Вещь это порой очень полезная, а главное удобная. Не будем тянуть время и перейдем к сути вопроса…
Создадим новый Windows Form Application и из панели ToolBox перетащим в наш проект элемент NotifyIcon. Имя по умолчанию для данного элемента «notifyIcon1», что определенно неудобно, поэтому переименуем его в «Tray».
Из свойств нашего элемента «Tray» в первую очередь обратим внимание на следующие:
Icon - Иконка нашего значка; Text - Текст, который будет отображаться, если навести курсором на значок в трее; Visible - Отображается ли значок в трее или нет;
Теперь щелкнем на элементе «Tray» два раза. В коде проекта создастся обработчик события двойного клика по значку в трее. Здесь нам необходимо написать код, который будет показывать нашу форму, если она находилась в свернутом виде:
private void Tray_MouseDoubleClick(object sender, MouseEventArgs e) { if (this.WindowState == FormWindowState.Minimized) { this.Visible = true; this.ShowInTaskbar = true; this.WindowState = FormWindowState.Normal; } }
Так же нам необходимо перегрузить метод сварачивания нашей формы. Для этого укажем ключевое слово «ovveride«, нажмем пробел, и из списка выберем метод «OnResize«. В данном методе напишем:
protected override void OnResize(EventArgs e) { if (this.WindowState == FormWindowState.Minimized) { this.ShowInTaskbar = false; this.Visible = false; } }
Все! Дело сделано! Теперь при сворачивании приложения, оно полностью исчезнет с экрана и останется лишь в трее. При двойном клике на значок в трее мы снова увидим нашу форму.
{lang: ‘ru’}
Этот пост открывает серию статей, посвященных работе с треем. Описывать все в одном посте я не буду по одной причине: некоторые аспекты теряются за другими. Сначала я действительно написал статью под заголовком «Как реализовать сворачивание в трей на C#», однако по запросу «сворачивание в трей» на нее пришел только один человек. Остальные же искали нечто другое, не указанное в заголовке статьи, однако, естественно, затронутое в ней. И я не уверен, что, посмотрев на заголовок, они тут же не закрыли вкладку. Не все же будут лезть в конец страницы, если не уверены, что там будет ответ. Я и сам не всегда проверяю, где же на странице находится то, что по мнению поисковика я искал. В конечном итоге написание серии относительно коротких постов должно привести к двум приятностям: повышению релевантности страниц и более удобному поиску материала (это уже для меня лично, чтобы не забыть что и где).
Итак. За работу с областью уведомлений (или треем) в С# отвечает класс NotifyIcon. В нем есть несколько полезных свойств, которые позволяют:
- назначить значок (свойство Icon);
- указать контекстное меню для значка (свойство ContextMenu);
- определить тест-подсказку (свойство Text);
- свойство Visible позволяет скрыть значок в трее.
Перед использованием его естественно следует «кинуть» на форму в визуальном редакторе или объявить в ручную.
Здесь представлен фрагмент кода небольшой программы, демонстрирующий реализацию сворачивания формы в трей:
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 |
using System; using System.Drawing; using System.Windows.Forms; namespace rosskyru { public partial class FormForTray : Form { /// /// конструктор формы /// public FormForTray() { InitializeComponent(); //задаем всплывающий текст-подсказку (появляется при наведении указателя на иконку в трее) _notifyIcon.Text = «Текст-подсказка»; //устанавливаем значок, отображаемый в трее: //либо один из стандартных: //_notifyIcon.Icon = SystemIcons.Error; //либо свой из файла: _notifyIcon.Icon = new Icon(«favicon.ico»); //подписываемся на событие клика мышкой по значку в трее _notifyIcon.MouseClick += new MouseEventHandler(_notifyIcon_MouseClick); //подписываемся на событие изменения размера формы this.Resize += new EventHandler(FormForTray_Resize); } /// /// здесь хранится состояние окна до сворачивания (максимизированное или нормальное) /// private FormWindowState _OldFormState; /// /// обрабатываем событие клика мышью по значку в трее /// void _notifyIcon_MouseClick(object sender, MouseEventArgs e) { //проверяем, какой кнопкой было произведено нажатие if (e.Button == MouseButtons.Left)//если левой кнопкой мыши { //проверяем текущее состояние окна if (WindowState == FormWindowState.Normal || WindowState == FormWindowState.Maximized)//если оно развернуто { //сохраняем текущее состояние _OldFormState = WindowState; //сворачиваем окно WindowState = FormWindowState.Minimized; //скрываться в трей оно будет по событию Resize (изменение размера), которое сгенерировалось после минимизации строчкой выше } else//в противном случае { //и показываем на нанели задач Show(); //разворачиваем (возвращаем старое состояние «до сворачивания») WindowState = _OldFormState; } } } /// /// обрабатываем событие изменения размера /// void FormForTray_Resize(object sender, EventArgs e) { if (FormWindowState.Minimized == WindowState)//если окно «свернуто» { //то скрываем его Hide(); } } } } |
Надеюсь, что комментарии в коде объясняют все нюансы программы.
Она делает всего две вещи:
- сворачивается и разворачивается из трея по щелчку левой кнопки мыши на значке в области уведомлений;
- запоминает свое старое состояние и разворачивается сразу в него (т.е. если она была развернута на весь экран, а потом свернута в трей, то восстановится она снова на весь экран).
И, напоследок, архив с этим проектом.
Полезная статья? Их будет больше, если вы поддержите меня!
Всем привет, сегодня учимся сворачивать в трей программу написанную в C#. Итак создаем новый проект «Приложение Windows Forms». Переходим в конструктор форм и жмем «панель инструментов». Ищем элемент «NotifyIcon»
и перетаскиваем его на нашу форму.
Как видите он появился с низу, и если по нему кликнуть снизу, откроются свойства.
В свойствах нас интересуют параметры: Text, Icon. В Text мы задаем тот текст, который будет показываться при наведении на иконку в трее, Icon — та самая иконка что будет показываться, поэтому обязательно сделайте (я делал в GIMP’е) или найдите в интернете.
Итак, теперь нам надо привязать к нашей форме код убирания окна в трей, показ нашей иконки и добавить разворачивание нашего окна. Кликните 2 раза по нашей форме, и мы перейдем из конструктора в класс нашей формочки.
Моя форма называется w1 и следовательно функция конструктора тоже называется w1, вот начала кода:
using System; using System.Windows.Forms; namespace FwLogger { public partial class w1 : Form { public w1() { InitializeComponent(); } } }
Далее в конструктор класса мы добавляем код и все связанные с ним функции, и вот у нас получается:
public w1() { InitializeComponent(); // делаем невидимой нашу иконку в трее notifyIcon1.Visible = false; // добавляем Эвент или событие по 2му клику мышки, //вызывая функцию notifyIcon1_MouseDoubleClick this.notifyIcon1.MouseDoubleClick += new MouseEventHandler(notifyIcon1_MouseDoubleClick); // добавляем событие на изменение окна this.Resize += new System.EventHandler(this.Form1_Resize); } private void Form1_Resize(object sender, EventArgs e) { // проверяем наше окно, и если оно было свернуто, делаем событие if (WindowState == FormWindowState.Minimized) { // прячем наше окно из панели this.ShowInTaskbar = false; // делаем нашу иконку в трее активной notifyIcon1.Visible = true; } } private void notifyIcon1_MouseDoubleClick(object sender, MouseEventArgs e) { // делаем нашу иконку скрытой notifyIcon1.Visible = false; // возвращаем отображение окна в панели this.ShowInTaskbar = true; //разворачиваем окно WindowState = FormWindowState.Normal; }