Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > ОС и железо
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 21.04.2009, 02:10
Аватар для rasamaha
rasamaha rasamaha вне форума
Прохожий
 
Регистрация: 28.03.2009
Сообщения: 19
Репутация: 10
По умолчанию Иконка в трее. Показать окно

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

Код:
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
private
    { Private declarations }
  public
    { Public declarations }
    //
     MouseDownPoint : TPoint;
     Moving : bool;
   end;
 
var
  Form1: TForm1;
  iconData: TNotifyIconData;
implementation
...
...
procedure TForm1.ButtonTrayClick(Sender: TObject);
begin
iconData.cbSize := sizeOf(iconData);
iconData.Wnd := Handle;
iconData.uID := 0;
iconData.uFlags := NIF_ICON or NIF_TIP or NIF_MESSAGE;
iconData.hIcon := Application.Icon.Handle;
iconData.szTip := 'ПИЛОТ-2009';
iconData.uCallbackMessage := WM_MOUSEMOVE;
Shell_NotifyIcon(NIM_ADD, @iconData);
Form1.Hide;
end;

вот это у меня работает)) а дальше...
Ответить с цитированием
  #2  
Старый 21.04.2009, 09:15
Nyctos Kasignete Nyctos Kasignete вне форума
Активный
 
Регистрация: 29.03.2009
Сообщения: 300
Репутация: 94
По умолчанию

Вот примерно как-то так:
Код:
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
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Menus, ShellAPI;
 
const
  WM_MYICONNOTIFY = WM_USER + 123;
 
type
  TForm1 = class(TForm)
    PopupMenu1: TPopupMenu;
    Hide1: TMenuItem;
    Restore1: TMenuItem;
    Exit1: TMenuItem;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure Hide1Click(Sender: TObject);
    procedure Restore1Click(Sender: TObject);
    procedure Exit1Click(Sender: TObject);
  private
    { Private declarations }
    procedure WMMYICONNOTIFY(var msg: TMessage); message WM_MYICONNOTIFY;
    procedure WMSYSCOMMAND(var msg: TMessage); message WM_SYSCOMMAND;
    procedure RestoreMainForm;
    procedure HideMainForm;
    procedure CreateTrayIcon;
    procedure DeleteTrayIcon;
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
{ TForm1 }
 
procedure TForm1.CreateTrayIcon;
var
  nidata: TNotifyIconData;
begin
  with nidata do
  begin
    cbSize := SizeOf(TNotifyIconData);
    Wnd := Self.Handle;
    uID := 1;
    uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP;
    uCallBackMessage := WM_MYICONNOTIFY;
    hIcon := Application.Icon.Handle;
    StrPCopy(szTip, 'ПИЛОТ-2009');
  end;
  Shell_NotifyIcon(NIM_ADD, @nidata);
end;
 
procedure TForm1.DeleteTrayIcon;
var
  nidata: TNotifyIconData;
begin
  with nidata do
  begin
    cbSize := SizeOf(TNotifyIconData);
    Wnd := Self.Handle;
    uID := 1;
  end;
  Shell_NotifyIcon(NIM_DELETE, @nidata);
end;
 
procedure TForm1.HideMainForm;
begin
  Application.ShowMainForm := False;
  ShowWindow(Application.Handle, SW_HIDE);
  ShowWindow(Application.MainForm.Handle, SW_HIDE);
end;
 
procedure TForm1.RestoreMainForm;
begin
  Application.ShowMainForm := True;
  ShowWindow(Application.Handle, SW_RESTORE);
  ShowWindow(Application.MainForm.Handle, SW_RESTORE);
end;
 
procedure TForm1.WMMYICONNOTIFY(var msg: TMessage);
var
  P: TPoint;
begin
  if (msg.LParam = WM_LBUTTONUP) or (msg.LParam = WM_RBUTTONUP) then
  begin
    GetCursorPos(p);
    SetForegroundWindow(Application.MainForm.Handle);
    PopupMenu1.Popup(P.X, P.Y);
  end;
end;
 
procedure TForm1.WMSYSCOMMAND(var msg: TMessage);
begin
  inherited;
  if (Msg.WParam = SC_MINIMIZE) then Hide1Click(Self);
  if (Msg.WParam = SC_RESTORE) then Restore1Click(Self);
end;
 
<font color="#4169e1"><i>{ события формы }</i></font>
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  CreateTrayIcon();
  Application.OnMinimize := Hide1Click;
end;
 
procedure TForm1.FormDestroy(Sender: TObject);
begin
  DeleteTrayIcon();
end;
 
<font color="RoyalBlue"><i>{ Обработчики команд контекстного меню }</i></font>
 
procedure TForm1.Hide1Click(Sender: TObject);
begin
  HideMainForm();
  CreateTrayIcon();
end;
 
procedure TForm1.Restore1Click(Sender: TObject);
begin
  RestoreMainForm();
end;
 
procedure TForm1.Exit1Click(Sender: TObject);
begin
  Application.Terminate;
end;
 
end.
А это форма (файл dfm), которую я использовала:
Код:
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
object Form1: TForm1
  Left = 192
  Top = 114
  Width = 696
  Height = 480
  Caption = 'Form1'
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'MS Sans Serif'
  Font.Style = []
  OldCreateOrder = False
  OnCreate = FormCreate
  OnDestroy = FormDestroy
  PixelsPerInch = 96
  TextHeight = 13
  object PopupMenu1: TPopupMenu
    Left = 16
    Top = 64
    object Hide1: TMenuItem
      Caption = 'Hide'
      OnClick = Hide1Click
    end
    object Restore1: TMenuItem
      Caption = 'Restore'
      OnClick = Restore1Click
    end
    object Exit1: TMenuItem
      Caption = 'Exit'
      OnClick = Exit1Click
    end
  end
end

P.S. Добавила еще строчку (Application.OnMinimize := Hide1Click), чтобы окно сворачивалось в трей при щелчке на кнопке в панели задач.

Последний раз редактировалось Nyctos Kasignete, 21.04.2009 в 10:26.
Ответить с цитированием
  #3  
Старый 21.04.2009, 13:24
Аватар для rasamaha
rasamaha rasamaha вне форума
Прохожий
 
Регистрация: 28.03.2009
Сообщения: 19
Репутация: 10
По умолчанию

Ну, спасибо))
у меня есть пара вопросов... но чтобы здесь не флудить, можно в личку?
Ответить с цитированием
  #4  
Старый 21.04.2009, 13:32
Nyctos Kasignete Nyctos Kasignete вне форума
Активный
 
Регистрация: 29.03.2009
Сообщения: 300
Репутация: 94
По умолчанию

rasamaha, если по делу вопрос, то пишите здесь. Если не по делу, то и в личку тоже не стоит. =)
Ответить с цитированием
  #5  
Старый 21.04.2009, 13:37
Аватар для rasamaha
rasamaha rasamaha вне форума
Прохожий
 
Регистрация: 28.03.2009
Сообщения: 19
Репутация: 10
По умолчанию

ну, конечно же не о погоде хочу спросить)))
Ответить с цитированием
  #6  
Старый 21.04.2009, 14:51
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,111
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Скачай себе TCoolTrayIcon (кажется так) и будет тебе счастье. Там все нужные обертки для иконки в трее есть. И не надо будет делать все руками.
Ответить с цитированием
  #7  
Старый 21.04.2009, 14:57
Аватар для rasamaha
rasamaha rasamaha вне форума
Прохожий
 
Регистрация: 28.03.2009
Сообщения: 19
Репутация: 10
По умолчанию

я его скачал отсюда

http://decoding.narod.ru/download/co...tray/tray.html

а как его установить? не знаю, какие файлы куда.
я еще ни разу компоненты не устанавливал...

Последний раз редактировалось rasamaha, 21.04.2009 в 14:59.
Ответить с цитированием
  #8  
Старый 21.04.2009, 15:25
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,111
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Если есть файл .dpk, то ставить просто его (открываешь в Дельфе, компилируешь и кнопочку Install жмешь). Если нету - то надо смотреть какая у тебя Дельфя. Если до 7 включительно, то можно просто через component -> Install component. Если старше, то надо будет все-равно делать проект (.dpk). Сделай новый пустой проект и добавь туда файлы кмпонента, а далее по первому варианту.
Ответить с цитированием
Ответ


Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 18:35.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025