Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.11.13;
Скачать: CL | DM;

Вниз

PopupMenu & TrayIcon   Найти похожие ветки 

 
SergProger ©   (2005-09-07 03:47) [0]

Всем привет! Люди, поделитесь со мной, как мне использовать PopupMemu при нажатии правой кнопки на иконке в Трее. Спасибо.


 
ShiFT   (2005-09-07 06:06) [1]

Вы должны обрабатывать сообщение, указанное вами при добавлении иконки на Tray. При значении (UINT)lParam, равном WM_RBUTTONDOWN (это обычно дял Pop-Up меню по правой кнопке), или любому другому необходимому вам, вы должны вызовом функции GetCursorPos() получить позицию курсора в момент события и выполнить следующий код:

procedure TForm1.WndProc(var Msg : TMessage);
var
 p : TPoint;
begin
 case Msg.Msg of
   WM_USER + 1:   // CallbackMessage
   case Msg.lParam of
     WM_RBUTTONDOWN: begin
        SetForegroundWindow(Handle);
        GetCursorPos(p);
        PopupMenu1.Popup(p.x, p.y);
        PostMessage(Handle, WM_NULL, 0, 0);
     end;
   end;
 end;
 inherited;
end;


 
Prov   (2005-09-07 12:02) [2]

const
 WM_TRAYICON = WM_USER + 1 //Наш месседж , который посылает иконка в трее оконной процедуре

procedure TrayIconAction(dwMessage: cardinal); {Tray icon messages: NIM_ADD, NIM_DELETE, NIM_MODIFY}
 var iData: NotifyIconData;
begin
 FillChar(iData, Sizeof(NotifyIconData), 0);
 idata.cbSize:= SizeOf(NotifyIconData);
 idata.Wnd:= Handle;
 idata.uID:= 12;
 idata.uFlags:= NIF_ICON or NIF_MESSAGE;
 iData.uCallbackMessage:= WM_TRAYICON; //Наш месседж
 idata.hIcon:= LoadIcon(0, idi_application);
 Shell_NotifyIcon(dwMessage, @iData);
end;

procedure ShowPopupMenu;
 var lpPoint: TPoint;
begin
 PopupMenu:= CreatePopupMenu;
 AppendMenu(PopupMenu, MF_SEPARATOR, 0, "");
 AppendMenu(PopupMenu, MF_STRING, 0, "Тестовая версия программы");
 GetCursorPos(lpPoint);
 TrackPopupMenu(PopupMenu, TPM_RETURNCMD, lpPoint.X, lpPoint.Y, 0, Handle, nil);
end;

function WindowProc(hWnd, uMsg, wParam, lParam: Integer): Integer; stdcall;
begin
 Result := DefWindowProc(hWnd, uMsg, wParam, lParam);
 if uMsg = WM_TRAYICON then
   begin
     if lParam = WM_LBUTTONDOWN then
       ShowPopupMenu; //При WM_TRAYICON обрабатываем сообщение
   end;
end;

begin
 TrayIconAction(NIM_ADD); //Собсно, добавляем иконку
end;


 
wal ©   (2005-09-07 12:16) [3]


> [2] Prov   (07.09.05 12:02)
А зачем при каждом клике заново меню создавать?


 
Prov   (2005-09-07 12:38) [4]

Если серьезно, то я, почему-то, не обратил внимания. На скорую руку писал. Ну там же не тяжело передеелать код. Загнать создание и аппенд в другуую процедурку, а при клике только TrackPopupMenu вызывать, а создается меню пусть только в начале, при создании формы, к примеру. :)


 
Prov   (2005-09-07 12:40) [5]

To ShiFT >
Такой вопрос, зачем посылать команду WM_NULL ? Что она дает ? Можно обьяснить? Заранее благодарен


 
ShiFT   (2005-09-07 12:58) [6]

Иногда, всплывающее меню в System Tray при потере фокуса не закрывается. Поэтому, при обработке сообщений для всплывающего меню необходимо поместить окно на передний план и послать ему сообщение WM_NULL.
(C) DRKB.


 
Prov   (2005-09-07 13:04) [7]

Спасибо большое. К стати, я боролся с этим. Побороть не смог. Теперь буду знать )



Страницы: 1 вся ветка

Текущий архив: 2005.11.13;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.029 c
2-1130281304
bogdan
2005-10-26 03:01
2005.11.13
создания окон нестандартной формы, delphi


1-1130150894
Nait
2005-10-24 14:48
2005.11.13
Как клонировать кнопку?


14-1129738743
ioas
2005-10-19 20:19
2005.11.13
вопрос по Apache


2-1129547718
Parth
2005-10-17 15:15
2005.11.13
Консольное приложение: иероглифы


2-1130227210
555
2005-10-25 12:00
2005.11.13
Помогите плийз!!!!