![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
PopupMenu & TrayIcon [D7, WinME]
SergProger © (2005-09-07 03:47:00)Всем привет! Люди, поделитесь со мной, как мне использовать PopupMemu при нажатии правой кнопки на иконке в Трее. Спасибо.
Prov (2005-09-07 13:04:00) [1]Спасибо большое. К стати, я боролся с этим. Побороть не смог. Теперь буду знать )
ShiFT (2005-09-07 12:58:00) [2]Иногда, всплывающее меню в System Tray при потере фокуса не закрывается. Поэтому, при обработке сообщений для всплывающего меню необходимо поместить окно на передний план и послать ему сообщение WM_NULL.
(C) DRKB.
Prov (2005-09-07 12:40:00) [3]To ShiFT >
Такой вопрос, зачем посылать команду WM_NULL ? Что она дает ? Можно обьяснить? Заранее благодарен
Prov (2005-09-07 12:38:00) [4]Если серьезно, то я, почему-то, не обратил внимания. На скорую руку писал. Ну там же не тяжело передеелать код. Загнать создание и аппенд в другуую процедурку, а при клике только TrackPopupMenu вызывать, а создается меню пусть только в начале, при создании формы, к примеру. :)
wal (2005-09-07 12:16:00) [5]
> [2] Prov (07.09.05 12:02)
А зачем при каждом клике заново меню создавать?
Prov (2005-09-07 12:02:00) [6]
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;
ShiFT (2005-09-07 06:06:00) [7]Вы должны обрабатывать сообщение, указанное вами при добавлении иконки на 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;