Форум: "WinAPI";
Текущий архив: 2005.11.13;
Скачать: [xml.tar.bz2];
Вниз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 вся ветка
Форум: "WinAPI";
Текущий архив: 2005.11.13;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 1.912 c