Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / свернуть программу в трей при нажатии на крестик / 9 сообщений из 9, страница 1 из 1
20.04.2014, 20:22
    #38619865
duh_si
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
свернуть программу в трей при нажатии на крестик
Доброго времени суток..
Мучаюсь уже довольно таки продолжительное время с одной трудностью

Так при запуске программы прячу её в трей:
Код: plaintext
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.
void __fastcall TMainForm::FormActivate(TObject *Sender)
{
    TrayIcon->Visible=true;
    Application->Minimize();
    ShowWindow(Application->Handle, SW_HIDE);
}
 
 
void __fastcall TMainForm::FormResize(TObject *Sender)
{
  if (WindowState == wsMinimized)
        {
    Application->ShowMainForm = false;
    ShowWindow(Handle,SW_HIDE);
    ShowWindow(Application->Handle,SW_HIDE);
    TrayIcon->Visible = true;
        }
}
 
void __fastcall TMainForm::ApplicationEventsMinimize(TObject *Sender)
{
    TrayIcon->Visible=true;
    Application->Minimize();
    ShowWindow(Application->Handle, SW_HIDE);
}



Таким образом раскрываю её из трея:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
void __fastcall TMainForm::N1Click(TObject *Sender)
{
    /*MainForm->Visible=true;
    TrayIcon->Visible=false;
    Application->Restore();
    Application->BringToFront(); */
 
    TrayIcon->Visible=false;
    Application->Restore();
    ShowWindow(Application->Handle, SW_SHOW);
    SetForegroundWindow(Application->Handle);
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::TrayIconClick(TObject *Sender)
{
    N1->Click();
}


И остается последнее, это скрыть её опять в трей при нажатии на крестик:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
void __fastcall TMainForm::FormClose(TObject *Sender, TCloseAction &Action)
{
  Action = caNone;
  Hide();
    TrayIcon->Visible = true;
   //   Application->Minimize();
    Application->ShowMainForm = false; //прячем форму
      //    ShowWindow(Handle,SW_HIDE); // Скрываем программу
        ShowWindow(Application->Handle,SW_HIDE); // Скрываем кнопку с TaskBar'а
 
 }



Собственно это у меня ни как правильно и не работает, пробовал разные варианты

Вот если запустить с кодом который сейчас , то работает все следующим образом: При запуске программы, она сворачивается в трей, единичный щелчок по значку в трее раскрывает программу, нажимаю крестик, программа опять сворачивается в трей, появляется значок, И вот если сейчас по нему щелкнуть, значок исчезает ( программа не разворачивается ), и в Диспетчере задач, остается висеть процесс программы..

Подскажите пожалуйста как решить такую проблему....
...
Рейтинг: 0 / 0
20.04.2014, 22:59
    #38619930
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
свернуть программу в трей при нажатии на крестик
duh_si,

WM_CLOSE
...
Рейтинг: 0 / 0
21.04.2014, 09:04
    #38620045
duh_si
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
свернуть программу в трей при нажатии на крестик
MasterZiv Вы мне предлагаете уничтожить форму, ну т.е полностью завершить программу?
А мне нужно: вот если использовать код который я выложил выше, допустим, нажимаем на форме кнопку свернуть, программа сворачивается в трей, нажимаем в трее на её значок, программа разворачивается ( это работает ) и так можно играться пока не надоест..тоже самое мне нужно и для крестика, т.е чтобы программа не завершалась при нажатии на крестик , а сворачивалась в трей, и при нажатии на значок опять разворачивалась ( сделать это нужно для того, что как правило все пользователи тыкаю крестик ), а если уж пользователю захочется выключить приложение, то там предусмотрено меню с выходом.
...
Рейтинг: 0 / 0
21.04.2014, 09:52
    #38620084
CEMb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
свернуть программу в трей при нажатии на крестик
duh_si

Дело в том, что FormClose таки отработает, и форма закроется, а приложение нет. Так как иконка привязана к форме, а форма на момент создания ещё жива - иконка создастся. Но после этого форма будет уничтожена, и на любое событие трей обнаружит, что обработчик отсуствует на корню и иконку из себя выкинет.

WM_CLOSE - нужно обработать самому, создать иконку и вернуть значение, что дальнейшая обработка не требуется. В случае OnClose возвращаемое значение void, входящих out параметров я тоже не вижу... стало быть, никак не сказать системе, что мы всё сами сделали и ничего больше не нужно.
...
Рейтинг: 0 / 0
21.04.2014, 10:46
    #38620145
duh_si
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
свернуть программу в трей при нажатии на крестик
Переделал маленько программный код
Вот так выглядит весь модуль
Код: plaintext
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.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
#include <vcl.h>
#pragma hdrstop
#include "UTray.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TMainForm *MainForm;
//---------------------------------------------------------------------------
__fastcall TMainForm::TMainForm(TComponent* Owner)
	: TForm(Owner)
{
  TrayIcon->Hint = "Сообщение ABS";
  TrayIcon->AnimateInterval = 200;

  TrayIcon->BalloonTitle = "Восстановить окно.";
  TrayIcon->BalloonHint =
	"Дважды щелкните значок на панели задач, чтобы восстановить окно.";
  TrayIcon->BalloonFlags = bfInfo;
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::ApplicationEventsMinimize(TObject *Sender)
{
  // Hide the window and set its state variable to wsMinimized.
  Hide();
  WindowState = wsMinimized;

  // Show the animated tray icon and also a hint balloon.
  TrayIcon->Visible = true;
  TrayIcon->Animate = true;
  TrayIcon->ShowBalloonHint();
  /*
	TrayIcon->Visible=true;
	Application->Minimize();
	ShowWindow(Application->Handle, SW_HIDE);    */
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::N1Click(TObject *Sender)
{
  TrayIcon->Visible = false;
  Show();
  WindowState = wsNormal;
  Application->BringToFront();

	/*MainForm->Visible=true;
	TrayIcon->Visible=false;
	Application->Restore();
	Application->BringToFront(); */

 /*	TrayIcon->Visible=false;
	Application->Restore();
	ShowWindow(Application->Handle, SW_SHOW);
	SetForegroundWindow(Application->Handle);   */
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::TrayIconClick(TObject *Sender)
{
 //	N1->Click();
}
//---------------------------------------------------------------------------

void __fastcall TMainForm::FormResize(TObject *Sender)
{
 /* if (WindowState == wsMinimized)
		{
	Application->ShowMainForm = false;
	ShowWindow(Handle,SW_HIDE);
	ShowWindow(Application->Handle,SW_HIDE);
	TrayIcon->Visible = true;
		}     */
}
//---------------------------------------------------------------------------

void __fastcall TMainForm::N2Click(TObject *Sender)
{
Application->Terminate();
}
//---------------------------------------------------------------------------

void __fastcall TMainForm::FormActivate(TObject *Sender)
{
  //Hide();
  WindowState = wsMinimized;

  // Show the animated tray icon and also a hint balloon.
  TrayIcon->Visible = true;
  TrayIcon->Animate = true;
  TrayIcon->ShowBalloonHint();
 /*	TrayIcon->Visible=true;
	Application->Minimize();
	ShowWindow(Application->Handle, SW_HIDE);        */
}
//---------------------------------------------------------------------------

void __fastcall TMainForm::FormClose(TObject *Sender, TCloseAction &Action)
{    /*

  //	TrayIcon->Visible = true;
   //	ShowWindow(MainForm->Handle, SW_HIDE);

	  Hide();
  WindowState = wsMinimized;

  // Show the animated tray icon and also a hint balloon.
  TrayIcon->Visible = true;
  TrayIcon->Animate = true;
  ShowWindow(Application->Handle, SW_HIDE);   */

 /* Action = caNone;

 Hide();
	TrayIcon->Visible = true;
   //	Application->Minimize();
	Application->ShowMainForm = false; //прячем форму
		TrayIcon->Visible = true;
		//ShowWindow(Handle,SW_HIDE); // Скрываем программу
		ShowWindow(Application->Handle,SW_HIDE); // Скрываем кнопку с TaskBar'а
	*/
 }
//---------------------------------------------------------------------------

void __fastcall TMainForm::TrayIconDblClick(TObject *Sender)
{
  TrayIcon->Visible = false;
  Show();
  WindowState = wsNormal;
  Application->BringToFront();
}
//---------------------------------------------------------------------------

void __fastcall TMainForm::FormCloseQuery(TObject *Sender, bool &CanClose)
{
CanClose = false;
  //	TrayIcon->Visible = true;
   //	ShowWindow(MainForm->Handle, SW_HIDE);

	  //Hide();
  WindowState = wsMinimized;

  TrayIcon->Visible = true;
  TrayIcon->Animate = true;
  ShowWindow(Application->Handle, SW_HIDE);
  TrayIcon->ShowBalloonHint();
}


в событии FormCloseQuery сделал все следующим образом, теперь почти работает как надо, теперь программа при нажатии на крестик, сворачивается в трей и разворачивается, в общем как и нужно, Но есть проблема, при запуске программы на панели задач остается висеть ярлык программы ( остается он так же висеть и при нажатии на крестик )

Подскажите пожалуйста как с этим можно справиться
...
Рейтинг: 0 / 0
21.04.2014, 12:12
    #38620253
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
свернуть программу в трей при нажатии на крестик
duh_si,

Надо обработать wm_close, и переопределить, а не вызывать стандартное поведение этого сообщения.

Сделать все, что захочешь.

Также можно обработать wm_syscommand
, и переопределить действие на эту кнопку. Это наверное самое правильное.

Ещё можно просто убрать системную кнопку окна close, оставить только minimize.
...
Рейтинг: 0 / 0
21.04.2014, 13:22
    #38620347
CEMb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
свернуть программу в трей при нажатии на крестик
duh_siПодскажите пожалуйста как с этим можно справиться

Можно попробовать вместо ShowWindow(Application->Handle,SW_HIDE);
Использовать SetWindowPos(Application->Handle, 0, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE|SWP_HIDEWINDOW|SWP_FRAMECHANGED);

Хотя я у себя для тех же целей использую тоже ShowWindow, у меня вроде всё ок.
...
Рейтинг: 0 / 0
21.04.2014, 13:26
    #38620355
CEMb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
свернуть программу в трей при нажатии на крестик
А, не, гоню, я делаю по-другому немного, я по крестику минимизирую окно, ShowWindow(MaingDlg.m_hWnd, SW_MINIMIZE);
а уже в обработчике окна на WM_WINDOWPOSCHANGED в зависимости от флага делаю ShowWindow(m_hWnd, SW_HIDE);
Это полезно когда окно хоть откуда сворачивают(по кнопке или из таскбара), оно у меня в трей уходит.
Кстати, проверь, что у тебя окно сворачивается в трей при закрытии из системного меню и из тасбара (если только специально не нужно обратное)
...
Рейтинг: 0 / 0
21.04.2014, 16:29
    #38620648
duh_si
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
свернуть программу в трей при нажатии на крестик
Всем спасибо за помощь..
Получилось все таким способом..
Код: plaintext
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.
#include <vcl.h>
#pragma hdrstop
#include "UTray.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TMainForm *MainForm;
//---------------------------------------------------------------------------
__fastcall TMainForm::TMainForm(TComponent* Owner)
    : TForm(Owner)
{
  TrayIcon->Hint = "Сообщение ABS";
  TrayIcon->AnimateInterval = 200;
 
  TrayIcon->BalloonTitle = "Восстановить окно.";
  TrayIcon->BalloonHint =
    "Дважды щелкните значок на панели задач, чтобы восстановить окно.";
  TrayIcon->BalloonFlags = bfInfo;
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::ApplicationEventsMinimize(TObject *Sender)
{
    TrayIcon->Visible=true;
    Application->Minimize();
    ShowWindow(Application->Handle, SW_HIDE);
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::N1Click(TObject *Sender)
{
  TrayIcon->Visible = false;
  Show();
  WindowState = wsNormal;
  Application->BringToFront();
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::FormResize(TObject *Sender)
{
  if (WindowState == wsMinimized)
        {
    Application->ShowMainForm = false;
    ShowWindow(Handle,SW_HIDE);
    ShowWindow(Application->Handle,SW_HIDE);
    TrayIcon->Visible = true;
        }
}
//---------------------------------------------------------------------------
 
void __fastcall TMainForm::N2Click(TObject *Sender)
{
Application->Terminate();
}
//---------------------------------------------------------------------------
 
void __fastcall TMainForm::FormActivate(TObject *Sender)
{
  WindowState = wsMinimized;
 
  TrayIcon->Visible = true;
  TrayIcon->Animate = true;
  ShowWindow(Application->Handle, SW_HIDE);
 
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::TrayIconDblClick(TObject *Sender)
{
  TrayIcon->Visible = false;
  Show();
  WindowState = wsNormal;
  Application->BringToFront();
}
//---------------------------------------------------------------------------
 
void __fastcall TMainForm::FormCloseQuery(TObject *Sender, bool &CanClose)
{
  CanClose = false;
  ShowWindow(Application->Handle, SW_HIDE);
  WindowState = wsMinimized;
 
  TrayIcon->Visible = true; 
  TrayIcon->Animate = true;
  TrayIcon->ShowBalloonHint();
}

...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / свернуть программу в трей при нажатии на крестик / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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