Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Подскажите!!  (Прочитано 8561 раз)
0 Пользователей и 1 Гость смотрят эту тему.
MS
Помогающий

ru
Offline Offline
Пол: Мужской

« : 22-03-2006 14:19 » 

Подскажите пожалуйста!
Как написать процедуру, чтобы на нажатие кнопки окно программы сварачивалось в панель рядом с часами, и ее небыло на панели задач.
Спасибо
Записан

Ничто так не ограничивает полёт мысли программиста, как компилятор
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #1 : 22-03-2006 16:06 » 

Преамбула


общением с панелью задач занимается процедурина из Windows API, именуемая
Код:
WINSHELLAPI BOOL WINAPI Shell_NotifyIcon(

    DWORD dwMessage, // идентификатор сообщения
    PNOTIFYICONDATA pnid // указатель на структуру данных
   );


Параметры

dwMessage - идентификатор сообщения, принимает следующие значения:

NIM_ADD   добавляет иконку
NIM_DELETE   убирает иконку
NIM_MODIFY   чтобы вы думали?! - модифицирует иконку

pnid указатель на структуру NOTIFYICONDATA, содержание которой зависит от значения dwMessage.

смотрим на саму структуру:
Код:
typedef struct _NOTIFYICONDATA { // nid 
    DWORD cbSize;
    HWND hWnd;
    UINT uID;
    UINT uFlags;
    UINT uCallbackMessage;
    HICON hIcon;
    char szTip[64];
} NOTIFYICONDATA, *PNOTIFYICONDATA;


Поля записи:

cbSize - размер структуры NOTIFYICONDATA

hWnd - Handle окна, которое будет получать сообщения от иконки в таскбаре

uID - идентификатор иконки, определяется программой и в рамках одной программы должен быть уникальным (если иконок много)

uFlags - набор флагов, показывающий, какие поля были заданы. является комбинацией (читай - суммой) следующих значений:

NIF_ICON   передан дескриптор иконки
NIF_MESSAGE   назначена callback-функция
NIF_TIP   назначена подсказка
 
uCallbackMessage - это код сообщения, которое будет отсылаться форме, (той самой, Handle которой мы указали в hWnd), каждый раз, когда кто-то что-то делает на нашей иконке.

hIcon - дескриптор иконки

szTip - текстовая подсказка. появляется, если задержать мышу над иконкой.



Амбула

может, я дурак, но задача оказалось нетривиальной. заставить кэпшн пропадать с таскбара при появлении иконки и наоборот прятать иконку при выводе кэпшена - без извращений не вышло.

Код:
unit Unit1;

interface

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

const
  IconId: integer = 100;
  WM_ICON = WM_APP + 100;

type
  TForm1 = class(TForm)
    ApplicationEvents1: TApplicationEvents;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure ApplicationEvents1Minimize(Sender: TObject);
  private
    { Private declarations }
  protected
    procedure IconMessage (var Msg: TMessage); message WM_ICON;
  public
    NIC: TNotifyIconData;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  NIC.cbSize := SizeOf (TNotifyIconData);
  NIC.Wnd := Handle;
  NIC.uID := IconId;
  NIC.uFlags := NIF_ICON + NIF_MESSAGE + NIF_TIP;
  NIC.hIcon := Application.Icon.Handle;
  NIC.uCallbackMessage := WM_ICON;
  Shell_NotifyIcon (NIM_ADD, @NIC);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  Shell_NotifyIcon (NIM_DELETE, @NIC);
end;

procedure TForm1.IconMessage(var Msg: TMessage);
begin
  if Msg.LParam = 514 then begin
    Shell_NotifyIcon (NIM_DELETE, @NIC);
    Form1.Show;
    Application.Restore;
    Application.BringToFront;
  end;
  Msg.Result := 0;
end;

procedure TForm1.ApplicationEvents1Minimize(Sender: TObject);
begin
  Shell_NotifyIcon (NIM_ADD, @NIC);
  Form1.Hide;
end;

end.
« Последнее редактирование: 22-03-2006 16:11 от x77 » Записан

x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #2 : 22-03-2006 18:07 » 

да, забыл. в *.dpr должна быть строчка

Application.ShowMainForm := FALSE;
Записан

RomCom
Опытный

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 23-03-2006 02:18 » 

Есть два способа: писать все самому от и до, или воспользоватся готовым решением (благо компонентов решающих эту задачу море).
Лично я использую второй путь, т.к. изобретать велосипед есть смысл только когда поставленая задаче нестандартна.
MS, рекомендую попробывать компонент RxTrayIcon из RX Library. Там реализованы стандартные задачи (показать/скрыть иконку, анимация иконки).
Записан

R.O.M.C.O.M.: Robotic Operational Mathematics and Ceaseless Observation Machine
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #4 : 23-03-2006 08:48 » 

RomCom, вопрос не в том, чтобы засунуть в трей иконку. а в том, чтобы засунуть её туда когда окно сворачивается, убрав в это время окно с таскбара. и наоборот по щелчке на иконку спрятать иконку и вывести окно на таскбар. ты знаешь "кучу компонентов", которые это делают?
Записан

RomCom
Опытный

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #5 : 23-03-2006 09:01 » 

Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
 Hide;
end;

procedure TForm1.FormShow(Sender: TObject);
begin
 RxTrayIcon1.Hide;
end;

procedure TForm1.FormHide(Sender: TObject);
begin
 RxTrayIcon1.Show;
end;

procedure TForm1.RxTrayIcon1Click(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
 if Button=mbLeft then Show;
end;
Не пойму в чем сложность?
Записан

R.O.M.C.O.M.: Robotic Operational Mathematics and Ceaseless Observation Machine
RomCom
Опытный

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #6 : 23-03-2006 09:16 » 

Ах-да и еще скрытие при минимизации окна.
Код:
private
    { Private declarations }
    procedure WMSysCommand(var Message: TWMSysCommand); message WM_SYSCOMMAND;

.....

procedure TForm1.WMSysCommand(var Message: TWMSysCommand);
begin inherited;
 if Message.CmdType=SC_MINIMIZE then Hide;
end;
Записан

R.O.M.C.O.M.: Robotic Operational Mathematics and Ceaseless Observation Machine
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #7 : 23-03-2006 12:03 » 

Код:
procedure TForm1.ApplicationEvents1Minimize(Sender: TObject);
begin
  Shell_NotifyIcon (NIM_ADD, @NIC);
  Form1.Hide;
end;

в чём разница? Улыбаюсь
Записан

MS
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #8 : 23-03-2006 13:03 » 

x77, RomCom, спасибо за ответы очень помогли Улыбаюсь
Записан

Ничто так не ограничивает полёт мысли программиста, как компилятор
RomCom
Опытный

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #9 : 24-03-2006 00:11 » 

Код:
procedure TForm1.ApplicationEvents1Minimize(Sender: TObject);
begin
  Shell_NotifyIcon (NIM_ADD, @NIC);
  Form1.Hide;
end;
в чём разница? Улыбаюсь
Никакой. А если нет разницы зачем платить больше Улыбаюсь
Записан

R.O.M.C.O.M.: Robotic Operational Mathematics and Ceaseless Observation Machine
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #10 : 24-03-2006 09:52 » 

RomCom, ну, у нас с тобой уже философский спор пошёл Улыбаюсь я лично сторонник того, что юзать левые компоненты можно только для экономии времени, когда знаешь как и можешь написать сам, но нафига, спрашивается, если всё равно никто за это не платит. поэтому в таких вот форумах я стараюсь рассказать имено как это всё реализуется руками и как оно вообще живёт. для этого форум и предназначен - мы все здесь учимся. а посты типа "иди, возьми компонент" - они человека не в состоянии научить ничему, имхо. посему я стараюсь таких постов избегать Ага
Записан

RomCom
Опытный

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #11 : 24-03-2006 15:06 » 

x77, наверное ты прав. Быстрое решение проблемы не есть гут для понимания вопроса.
Записан

R.O.M.C.O.M.: Robotic Operational Mathematics and Ceaseless Observation Machine
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines