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

Delphi Sources



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

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

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

Код:
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
По умолчанию

Вот примерно как-то так:
Код:
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;

{ события формы }

procedure TForm1.FormCreate(Sender: TObject);
begin
  CreateTrayIcon();
  Application.OnMinimize := Hide1Click;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  DeleteTrayIcon();
end;

{ Обработчики команд контекстного меню }

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), которую я использовала:
Код:
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,015
Версия 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,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

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


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter