上的表單,我有任務欄圖標和PopupMenu的組件。德爾福10,柏林,彈出菜單和隱藏秀
- PopupMenu被分配給Form和TrayIcon。
- 在任務欄圖標的
OnClick
事件,我展現形式。 - PopupMenu有2項顯示/隱藏窗體。
當我運行該項目,該表顯示正常。右鍵單擊表單,出現PopupMenu。
在任務欄圖標,左鍵單擊顯示的形式確定。
在任務欄圖標,右鍵單擊顯示彈出菜單。選擇「顯示」項目,表格顯示確定。
但是,在此之後,的彈出菜單不再被啓用。右鍵點擊不起作用!
上的表單,我有任務欄圖標和PopupMenu的組件。德爾福10,柏林,彈出菜單和隱藏秀
OnClick
事件,我展現形式。當我運行該項目,該表顯示正常。右鍵單擊表單,出現PopupMenu。
在任務欄圖標,左鍵單擊顯示的形式確定。
在任務欄圖標,右鍵單擊顯示彈出菜單。選擇「顯示」項目,表格顯示確定。
但是,在此之後,的彈出菜單不再被啓用。右鍵點擊不起作用!
從托盤圖標顯示PopupMenu有點棘手。其實有一個在Windows本身引起的問題一個衆所周知的問題,它甚至在MSDN文檔:
要顯示通知圖標上下文菜單,當前窗口必須是應用程序調用TrackPopupMenu或TrackPopupMenuEx之前的前景窗口。否則,當用戶單擊菜單外部或創建菜單的窗口(如果可見)時,菜單不會消失。如果當前窗口是子窗口,則必須將(頂層)父窗口設置爲前景窗口。
然而,在當前的窗口是前臺窗口,顯示該菜單中的第二次,它出現,然後立即消失。若要更正此問題,您必須強制任務切換到名爲
TrackPopupMenu
的應用程序。這是通過張貼良性的消息窗口或線程中完成的,如下面的代碼示例:SetForegroundWindow(hDlg); // Display the menu TrackPopupMenu( hSubMenu, TPM_RIGHTBUTTON, pt.x, pt.y, 0, hDlg, NULL); PostMessage(hDlg, WM_NULL, 0, 0);
考慮到這一點在Delphi中,可以將PopupMenu.AutoPopup
屬性設置爲false,然後調用PopupMenu.Popup()
方法需要時,例如:
procedure TForm1.FormContextPopup(Sender: TObject);
begin
ShowPopup;
end;
procedure TForm1.TrayIcon1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
if Button = mbRight then ShowPopup;
end;
procedure TForm1.ShowPopup;
begin
BringToFront;
with Mouse.CursorPos do
PopupMenu1.Popup(X, Y);
PostMessage(Handle, WM_NULL, 0, 0);
end;
我在嘗試你所做的時遇到了同樣的問題,看起來form.popupmenu的值在你隱藏表單時變爲零,我的解決方案是用相同的事件處理程序添加另一個popupmenu,將第一個分配給表單和第二個托盤圖標,它會工作。
編輯
Sertac Akyuz感謝便條隱藏表單時,不form.popupmenu變爲零
事實並非如此 –
糾正我,如果我錯了,他運行應用程序,右鍵單擊隱藏表單(因此顯示托盤圖標),右鍵單擊托盤圖標顯示錶單然後右鍵單擊表單沒有任何反應(因此沒有彈出窗口) –
什麼不是這種情況是* form.popupmenu變成零*,事實並非如此,即它不會變爲零 –
我看到的彈出菜單的「AutoPopup」屬性是假的Popupmenu.AutoPopup爲假在展會上;設置它恢復預期的行爲:
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.Menus, Vcl.ExtCtrls;
type
TForm1 = class(TForm)
PopupMenu1: TPopupMenu;
Show1: TMenuItem;
Hide1: TMenuItem;
TrayIcon1: TTrayIcon;
procedure Show1Click(Sender: TObject);
procedure Hide1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Hide1Click(Sender: TObject);
begin
Hide;
TrayIcon1.Visible := true;
end;
procedure TForm1.Show1Click(Sender: TObject);
begin
///////////////////
//
// Comment out this line and app will have OP's observed behavior
Popupmenu.AutoPopup := true;
///////////////////
Show;
end;
end.
這是WM_RBUTTONUP處理程序。在它之前有一個很好的ProcessMessages。非常好的代碼! –
我添加了「Popupmenu.AutoPopup:= true;」和form1.popupmenu:= popupmenu1,以OnShow,OnClik顯示,不工作:( –
main。我工作D7-Xe-10,它 - 易於代碼衝突,for簡單的D用戶。在這 - ??? D10.1的bug如何? –
什麼'c)nom。 a)'意思? –
sor。,bad en .: =重複a)頂部列表 –
如果任何人的高級重置爲正確的文字 - 我不介意。 在ru線程中的完整描述http://delphimaster.ru/cgi-bin/forum.pl?id=1487777210&n=18 但是,在那裏,答案是否 –