Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
2-1130050454
beglec
2005-10-23 10:54
2005.11.13
Можно ли узнать имя процедуры.


4-1126532696
vishnia
2005-09-12 17:44
2005.11.13
Переключение языков


14-1129361812
Anton_Uz
2005-10-15 11:36
2005.11.13
Компоненты


6-1122892321
Pool
2005-08-01 14:32
2005.11.13
Socket preconfig?


1-1129622152
Frozzen
2005-10-18 11:55
2005.11.13
xml и Oject Inspector





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский