Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++ Builder
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.53/17: Рейтинг темы: голосов - 17, средняя оценка - 4.53
Maestro
Маэстро
Вирусоборец
1242 / 366 / 40
Регистрация: 06.09.2009
Сообщений: 790
1

Вопрос о вечном TrayIcon...

27.10.2011, 19:23. Просмотров 3069. Ответов 10
Метки нет (Все метки)

Приветствую всех.

Вопрос в общем-то такой. Есть форма, отображает как кнопку на панели задач так и значок в трее. По нажатии на кнопку сворачивания, программа помещается в трей и кнопка исчезает с панели задач, одиночный щелчёк на значке в трее возвращает программу обратно. Контекстное меню значка в трее (открыть программу\скрыть программу) работает безупречно, но хочется большего. Хочу чтобы одиночный щелчёк на значке в трее как сворачивал программу, так и разворачивал если она свёрнута, но как это сделать не знаю. Поможете с реализацией? Спасибо.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.10.2011, 19:23
Ответы с готовыми решениями:

VCL Forms Application, программа зависает при вечном цикле
Здравствуйте, мне надо в программе выполнять функции пока она работает, в...

TrayIcon
День добрый! Есть такой код. Всё хорошо, только одна проблема кнопка...

TrayIcon
Здравствуйте. Написал программку, создал ярлык к экзешнику и поместил в...

TrayIcon
Имеется программа которая по нажатию на кнопку скрытие или закрытие появляется...

PopUpMenu в TrayIcon
Подскажите в как исправить проблему с PopUpMenu в TrayIcon, - он почему-то...

10
LK
Заблокирован
27.10.2011, 19:36 2
можно попытаться
C++
1
2
3
4
5
6
7
if (Form1->Visible == false) {
  Form1->Visible = true;
//  Form1->Show();
else if (Form1->Visible == true) {
    Form1->Visible = false;
//  Form1->Hide();
}
0
Maestro
Маэстро
Вирусоборец
1242 / 366 / 40
Регистрация: 06.09.2009
Сообщений: 790
27.10.2011, 20:47  [ТС] 3
Ммм... Не совсем так как я хотел.

Смотрите, код работает, форму скрывает\показывает по нажатию на значёк в трее, никаких нареканий, но кнопку с панели задач не убирает, нужно только жать принудительно на кнопочку минимизации. Я перед тем как задать вопрос поискал по форуму по ключевому слову TrayIcon, нашёл такой код сокрытия кнопки в панели задач, но он также не помогает.
C++
1
  ShowWindow(Application->Handle,SW_HIDE); // Скрываем кнопку с TaskBar'а
Может не туда пишу? Пишу код в обработчик OnClick компонента TrayIcon

Вот мой код

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
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
 
#include "TrayIcon1.h"
#include <shellapi.h>
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "trayicon"
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::TrayIcon1Minimize(TObject *Sender)
{
  Form1->Visible = false;
  //  Form1->Visible = true;
}
// Разворачиваем из контекстного меню трей-иконки------------------------
void __fastcall TForm1::MaximalClick(TObject *Sender)
{
  Form1->Visible = true;
  TrayIcon1->Restore();
}
// Сворачиваем из контекстного меню трей-иконки--------------------------
 
void __fastcall TForm1::MinimizeClick(TObject *Sender)
{
   Form1->Visible = false;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::TrayIcon1Click(TObject *Sender)
{
if (Form1->Visible == false){
  Form1->Visible = true;
//  Form1->Show();
//  ShowWindow(Application->Handle,SW_SHOW);
}
else if (Form1->Visible == true){
    Form1->Visible = false;
//    ShowWindow(Application->Handle,SW_HIDE); // Скрываем кнопку с TaskBar'а
//    Form1->Hide();
  }
}
0
QVO
644 / 455 / 80
Регистрация: 26.10.2010
Сообщений: 1,263
Записей в блоге: 4
Завершенные тесты: 3
27.10.2011, 21:43 4
Maestro, если мне не изменяет память, там нужно добавить PopMenu и с ним работать.
0
LK
Заблокирован
27.10.2011, 21:49 5
тогда проверяйте состояние формы :
C++
1
Form->WindowState: wsNormal , wsMaximized , wsMinimized
или отлавливайте сообщения WM_SYSCOMMAND, SC_MINIMIZE, SC_MAXIMIZE
чтобы иконки приложения не было на панели задач, можно послать ему сообщение:
C++
1
2
ShowWindow(Application->Handle, SW_HIDE);//Скрыть
ShowWindow(Application->Handle, SW_SHOW);//Показать
0
Maestro
Маэстро
Вирусоборец
1242 / 366 / 40
Регистрация: 06.09.2009
Сообщений: 790
27.10.2011, 22:43  [ТС] 6
Оно есть
Цитата Сообщение от Maestro Посмотреть сообщение
Контекстное меню значка в трее (открыть программу\скрыть программу) работает безупречно, но хочется большего
Добавлено через 2 минуты
В принципе перепробовал это всё.
Цитата Сообщение от LK Посмотреть сообщение
чтобы иконки приложения не было на панели задач, можно послать ему сообщение:
C++
1
2
ShowWindow(Application->Handle, SW_HIDE);//Скрыть
ShowWindow(Application->Handle, SW_SHOW);//Показать
Цитата Сообщение от Maestro Посмотреть сообщение
нашёл такой код сокрытия кнопки в панели задач, но он также не помогает.
C++
1
 ShowWindow(Application->Handle,SW_HIDE); // Скрываем кнопку с TaskBar'а
Добавлено через 7 минут
Собственно не шибко получилось
C++
1
2
3
4
5
6
7
8
9
10
11
12
void __fastcall TForm1::TrayIcon1Click(TObject *Sender)
{
if (Form1->Visible == false)
  Form1->Visible = true;
else if (Form1->Visible == true) {
   if(!Form1->WindowState){
      Form1->Visible = false;
      ShowWindow(Application->Handle, SW_HIDE);//Скрыть
     }
   }
}
//---------------------------------------------------------------------------
А вот этого я не умею.
Цитата Сообщение от LK Посмотреть сообщение
или отлавливайте сообщения WM_SYSCOMMAND, SC_MINIMIZE, SC_MAXIMIZE
Добавлено через 41 минуту
Короче в билдере 6.0 ни в какую. В CodeGear Rad Studio C++ Builder 2009 достаточно этого кода

C++
1
2
3
4
5
6
7
void __fastcall TForm1::TrayIcon1Click(TObject *Sender)
{
   if (Form1->Visible == false)
      Form1->Visible = true;
   else if (Form1->Visible == true)
      Form1->Visible = false;
}
0
DefineTrueFalse
870 / 447 / 35
Регистрация: 25.10.2011
Сообщений: 910
27.10.2011, 23:44 7
C++
1
Application->Minimize();
Не пробовал?
0
QVO
644 / 455 / 80
Регистрация: 26.10.2010
Сообщений: 1,263
Записей в блоге: 4
Завершенные тесты: 3
27.10.2011, 23:45 8
Maestro,
C++
1
2
3
 //  Восстановление формы.
  Form1->Visible = true;
  TrayIcon1->Restore();
C++
1
2
 // Скрытие формы.
  Form1->Visible = false;
C++
1
2
// Закрывает приложение
Application->Terminate();
Вложение на RAD

Не по теме:

Извиняюсь плохо прочел тему.

0
Вложения
Тип файла: rar trayicon.rar (5.6 Кб, 54 просмотров)
Maestro
Маэстро
Вирусоборец
1242 / 366 / 40
Регистрация: 06.09.2009
Сообщений: 790
28.10.2011, 00:16  [ТС] 9
В общем кое-какие успехи проделаны, но хз отчего, работает способ 50\50 из 10 циклов скрыл\отобразил форму, половина может нормально скрывать и форму и кнопку, а потом ни с того ни сего скрывается только форма, а кнопка висит. Завтра отпишусь детальнее. В принципе ничего нового не изобрёл...

Добавлено через 3 минуты
Цитата Сообщение от DefineTrueFalse Посмотреть сообщение
C++
1
Application->Minimize();
Не пробовал?
Я даже пробовал это.
C++
1
Form1->MinimizeClick(Form1);
Этот код работает хорошо когда вызван из контекстного меню трей-иконки, код выше имитирует вызов функции.
Цитата Сообщение от Maestro Посмотреть сообщение
C++
1
2
3
4
5
// Сворачиваем из контекстного меню трей-иконки-------------------------
void __fastcall TForm1::MinimizeClick(TObject *Sender)
{
 Form1->Visible = false;
}
0
DefineTrueFalse
870 / 447 / 35
Регистрация: 25.10.2011
Сообщений: 910
28.10.2011, 01:04 10
Цитата Сообщение от Maestro Посмотреть сообщение
Я даже пробовал это.
Самый короткий путь всегда по прямой, не стоит накручивать процессору работы без нужды.

C++
1
2
3
4
5
6
7
8
9
10
void __fastcall TForm1::TrayIcon1Click(TObject *Sender)
{
   if (TrayIcon1->RestoreOn == imNone)
   {
      Application->Minimize();
      ShowWindow(Application->Handle, SW_HIDE);
      TrayIcon1->RestoreOn = imClick;
   }
   else TrayIcon1->RestoreOn = imNone;
}
Если я правильно понял задачу, то так. По умолчанию RestoreOn = imNone.
1
Maestro
Маэстро
Вирусоборец
1242 / 366 / 40
Регистрация: 06.09.2009
Сообщений: 790
28.10.2011, 15:30  [ТС] 11
DefineTrueFalse, Отличный вариант, работает безупречно Спасибо большое.

Вопрос можно считать решённым.
0
28.10.2011, 15:30
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.10.2011, 15:30

BallonTimeout в TrayIcon
Использую C++Builder XE4. Решил использовать TrayIcon и конкретно его метод...

Работа с TrayIcon
Здраствуйте, как сделать чтобы при нажатии кнопки свернуть справа вверху на...

TrayIcon и ImageList
Здравствуйте!! Ребята, подскажите, по такому вопросу. Создаю иконку в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru