Показать сообщение отдельно
  #5  
Старый 27.02.2008, 12:59
AlexSku AlexSku вне форума
Специалист
 
Регистрация: 07.05.2007
Адрес: Москва
Сообщения: 884
Репутация: 21699
По умолчанию

Код:
const
  { Сообщения от пиктограммы на панели задач }
  IconMessage = WM_User + 300;
type
  TfmMain = class(TForm)
    pmIcon: TPopupMenu;  // Меню для пиктограммы
    pmIconSetup: TMenuItem;
    pmIconabout: TMenuItem;
    pmIconClose: TMenuItem;
...
  private
    { Private declarations }
    FIcon: TIcon;                   // Новая пиктограмма
    FiOldIcon: Integer;             // Старая пиктограмма
...
    procedure OnWinIconMes(var AMessage: TMessage); message IconMessage;
    function TrayMessage(const iList: Integer; const dwMessage, Flags: LongWord): Boolean;
...
procedure TfmMain.FormCreate(Sender: TObject);
...
    FIcon:= TIcon.Create;
    FiOldIcon:= 0;
    TrayMessage(FiOldIcon, NIM_Add, NIF_ICON or NIF_MESSAGE or NIF_TIP);
...
end;

procedure TfmMain.FormCloseQuery(Sender: TObject;
  var CanClose: Boolean);
...
    { Icon }
    FiOldIcon:= 0;
    TrayMessage(FiOldIcon, NIM_Delete, 0);
end;

procedure TfmMain.FormDestroy(Sender: TObject);
begin
  FIcon.Free;
end;            // FormDestroy


function TfmMain.TrayMessage(const iList: Integer;
  const dwMessage, Flags: LongWord): Boolean;
var
  tnd: TNotifyIconData;
begin
  with tnd do
  begin
    cbSize:= SizeOf(TNotifyIconData);
    Wnd:= Handle;
    uID:= 1;
    uFlags:= Flags;
    uCallbackMessage:= IconMessage;
    ImageList1.GetIcon(iList, FIcon); { В ImageList1 поместить разные пиктограммки, iList - это номер }
    hIcon:= FIcon.Handle;
    szTip:= 'Всплывающее название'#0;
  end;
  Result:= Shell_NotifyIcon(dwMessage, @tnd);
end;            // TrayMessage

{ Я решаю менять пиктограмму или нет в таймере }
procedure TfmMain.TimerUpdateTimer(Sender: TObject);
var
  iNewIcon: Integer;
begin
    iNewIcon:= по какому-то правилу;
    if iNewIcon <> FiOldIcon then
    begin
      FiOldIcon:= iNewIcon;       // Запоминаем новое состояние пиктограммы
      TrayMessage(FiOldIcon, NIM_Modify, NIF_ICON);
    end;
end;            // TimerUpdateTimer

procedure TfmMain.OnWinIconMes(var AMessage: TMessage);
var P: TPoint;
begin
    case AMessage.LParam of
      WM_LButtonDown:
      begin
{        SetForegroundWindow(Handle);
        GetCursorPos(P);
        pmIcon.Popup(P.X, P.Y);}
      end;
      WM_LButtonDblClk:
      begin
        SetForegroundWindow(Handle);
        pmIcon.Items[0].Click; // Пункт меню по умолчанию
      end;
      WM_RButtonDown:
      begin
        SetForegroundWindow(Handle);
        GetCursorPos(P);
        pmIcon.Popup(P.X, P.Y);
      end;
    end;        // case AMessage.LParam
end;            // OnWinIconMes
Это вырезка. Извините, если что-то забыл указать