Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.01.2011, 14:33   #1
hoolio_g
Пользователь
 
Регистрация: 06.03.2009
Сообщений: 12
По умолчанию Вопрос про трэй

Здравсвуйте. Нашел хороший и вроде бы понятный пример для работы с треем на WinAPI тыц
Только почему-то не сворачивает форму. И еще появляются ошибки в куске
скрин

Вот полный код

Код:
unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ShellAPI, Menus, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    PopupMenu1: TPopupMenu;
    pshow: TMenuItem;
    pexit: TMenuItem;
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure pshowClick(Sender: TObject);
    procedure pexitClick(Sender: TObject);
    procedure PopupMenu1Popup(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
   Procedure ControlWindow(Var Msg:TMessage); message WM_SYSCOMMAND;

  public
    procedure MessageFromIcon( var Mess : TMessage ); message WM_USER + 100;
  end;

var
  Form1: TForm1;
  MyIcon : TNotifyIconData;
implementation

{$R *.dfm}

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Shell_NotifyIcon( NIM_DELETE, @MyIcon );
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
  with MyIcon do
    begin
      cbSize := SizeOf(TNotifyIconData);
      Wnd := Form1.Handle;
      uID := 1;
      uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP;
      uCallbackMessage := WM_USER + 100;
      hIcon := Application.Icon.Handle;
      szTip := 'Текст подсказки';
    end;
end;

procedure TForm1.MessageFromIcon( var Mess : TMessage );
var
  Mouse: TMouse;
begin
  case Mess.lParam of
  WM_LBUTTONDBLCLK:
    begin
      PShowClick(Form1);
    end;
  WM_RBUTTONUP:
    begin
      PopupMenu.Popup(Mouse.CursorPos.x, Mouse.CursorPos.y);
    end;
  end;
end;

procedure TForm1.pexitClick(Sender: TObject);
begin
  close;
end;

procedure TForm1.PopupMenu1Popup(Sender: TObject);
begin
  SetForegroundWindow(Form1.Handle);
end;

procedure TForm1.pshowClick(Sender: TObject);
begin
  Application.Restore;
  SetForeGroundWindow(Application.MainForm.Handle);
  Shell_NotifyIcon( NIM_DELETE, @MyIcon );
end;

Procedure TForm1.ControlWindow(Var Msg:TMessage);
begin
  if Msg.WParam=SC_MINIMIZE then
    begin
      ShowWindow(Application.Handle,SW_MINIMIZE);
      ShowWindow(Application.Handle,SW_HIDE);
      Shell_NotifyIcon( NIM_ADD, @MyIcon );
    end
    else
    inherited;
end;


end.
hoolio_g вне форума Ответить с цитированием
Старый 11.01.2011, 14:39   #2
legendary
Форумчанин
 
Аватар для legendary
 
Регистрация: 21.04.2010
Сообщений: 125
По умолчанию

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ShellApi;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure OnMinimizeProc(Sender:TObject);
  private
    procedure ActionIcon(n: Integer; Icon: TIcon);
    { Private declarations }
  public
    { Public declarations }
   protected
  Procedure WindowMessage(Var Msg:TMessage); message WM_SYSCOMMAND;
  Procedure MouseClick(var Msg:TMessage); message WM_USER+1;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.ActionIcon(n:Integer;Icon:TIcon);
Var Nim:TNotifyIconData;
begin
With Nim do // Заполняем структуру Nim….
Begin
cbSize:=SizeOf(Nim); // Размер
Wnd:=Form1.Handle; // Хендл нашего приложения(окна)
uID:=1;
uFlags:=NIF_ICON or NIF_MESSAGE or NIF_TIP;
hicon:=Icon.Handle; // Хендл передаваемой в процедуру иконки
uCallbackMessage:=wm_user+1;
szTip:='Сообщение появляющееся при наведении';
End;
Case n OF // Действия выполняемые процедурой
1: Shell_NotifyIcon(Nim_Add,@Nim);
2: Shell_NotifyIcon(Nim_Delete,@Nim);
3: Shell_NotifyIcon(Nim_Modify,@Nim);
End;
end;

procedure TForm1.WindowMessage(var Msg: TMessage);
begin
IF Msg.WParam=SC_MINIMIZE then Begin
ActionIcon (1,Application.Icon); // Добавляем значок в трей
ShowWindow(Handle,SW_HIDE); // Скрываем программу
ShowWindow(Application.Handle,SW_HIDE); // Скрываем кнопку с TaskBar'а
End else inherited;
end;

Procedure TForm1.FormCreate(Sender:TObject);
Begin
Application.onMinimize:=OnMinimizeProc;
End;


Procedure TForm1.OnMinimizeProc(Sender:TObject);
Begin
PostMessage(Handle,WM_SYSCOMMAND,SC_MINIMIZE,0);
End;





procedure TForm1.MouseClick(var Msg: TMessage);
Var p:tpoint;
begin
GetCursorPos(p); // Запоминаем координаты курсора мыши(см. P/S)
Case Msg.LParam OF // Проверяем какая кнопка была нажата
WM_LBUTTONUP,WM_LBUTTONDBLCLK: {Действия, выполняемый по одинарному или двойному щелчку левой кнопки мыши на значке}
Begin 
ActionIcon (2,Application.Icon); // Удаляем значок из трея
ShowWindow(Application.Handle,SW_SHOW); // Восстанавливаем кнопку программы
ShowWindow(Handle,SW_SHOW); // Восстанавливаем окно программы
End;
End;
end;

end.
legendary вне форума Ответить с цитированием
Старый 11.01.2011, 15:25   #3
SERG1980
Участник клуба
 
Аватар для SERG1980
 
Регистрация: 28.03.2007
Сообщений: 1,814
По умолчанию

А готовым, например CoolTrayIcon, нельзя пользоваться?
SERG1980 вне форума Ответить с цитированием
Старый 11.01.2011, 15:40   #4
_SERGEYX_
Участник клуба
 
Аватар для _SERGEYX_
 
Регистрация: 07.07.2007
Сообщений: 1,518
По умолчанию

Цитата:
хороший пример для работы с треем ... Только не сворачивает
Где логика?
Установи какой-нибудь готовый компонент и не трать время на уже давно написанное.
_SERGEYX_ вне форума Ответить с цитированием
Старый 11.01.2011, 16:02   #5
hoolio_g
Пользователь
 
Регистрация: 06.03.2009
Сообщений: 12
По умолчанию

legendary, опять пишет что слишком много параметров

http://s54.radikal.ru/i146/1101/6d/609a0cb8d88c.jpg

_SERGEYX_ , много говняных повстречал, многие на последних дельфях сбоят.
hoolio_g вне форума Ответить с цитированием
Старый 11.01.2011, 16:22   #6
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Во-первых, в Delphi XE есть готовый компонент TTrayIcon.
Во-вторых, можно посмотреть в его исходники.
В-третьих, в Delphi XE строчка
Код:
cbSize := SizeOf(TNotifyIconData);
пишется так:
Код:
cbSize := TNotifyIconData.SizeOf;
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 11.01.2011, 16:23   #7
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Цитата:
Сообщение от hoolio_g Посмотреть сообщение
_SERGEYX_ , много говняных повстречал, многие на последних дельфях сбоят.
Ппц. А штатный или джедаи?
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 11.01.2011, 16:32   #8
hoolio_g
Пользователь
 
Регистрация: 06.03.2009
Сообщений: 12
По умолчанию

Цитата:
Сообщение от GunSmoker Посмотреть сообщение
Во-первых, в Delphi XE есть готовый компонент в Delphi XE строчка
Код:
cbSize := SizeOf(TNotifyIconData);
пишется так:
Код:
cbSize := TNotifyIconData.SizeOf;
Вот за это действительно спасибо
hoolio_g вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вопрос про Свойство Visible и про иконки в imagelist Kappi4 Компоненты Delphi 2 21.05.2010 13:10
как свернуть программу в трэй Izlom Помощь студентам 3 16.05.2010 08:21
Вопрос про C# BanzoO Общие вопросы C/C++ 1 02.07.2009 03:47
Вопрос наверное про функции, а так точно даже не знаю про что. (Вопрос начинющего #6) Albert2008 Общие вопросы Delphi 4 21.08.2008 15:33
У меня вопрос про базы данных,а точнее про таблицы!!! Alexij Общие вопросы Delphi 1 13.04.2008 23:24