我有Delphi Chromium Embedded(http://code.google.com/p/delphichromiumembedded)中的TChromium broser。我想附上一個上下文菜單。我如何才能做到這一點?如何將上下文菜單附加到TChromium瀏覽器
5
A
回答
5
您需要處理OnBeforeMenu
事件。在那個事件處理器中,足以將輸出參數Result
設置爲True
什麼會抑制默認的上下文菜單彈出。之後,您可以在從menuInfo
結構獲得的職位上顯示自己的菜單。
這裏有一個自定義彈出菜單的代碼示例:
uses
ceflib, cefvcl;
procedure TForm1.FormCreate(Sender: TObject);
begin
Chromium1.Load('www.example.com');
end;
procedure TForm1.Chromium1BeforeMenu(Sender: TObject;
const browser: ICefBrowser; const menuInfo: PCefHandlerMenuInfo;
out Result: Boolean);
begin
Result := True;
PopupMenu1.Popup(menuInfo.x, menuInfo.y);
end;
procedure TForm1.PopupMenuItemClick(Sender: TObject);
begin
ShowMessage('You''ve clicked on a custom popup item :)');
end;
更新:
對於動態創建的實例,你必須手動分配事件處理程序。嘗試下面的代碼。
uses
ceflib, cefvcl;
type
TForm1 = class(TForm)
Panel1: TPanel;
Button1: TButton;
PopupMenu1: TPopupMenu;
procedure Button1Click(Sender: TObject);
private
procedure ChromiumOnBeforeMenu(Sender: TObject;
const browser: ICefBrowser; const menuInfo: PCefHandlerMenuInfo;
out Result: Boolean);
public
{ Public declarations }
end;
implementation
procedure Form1.ChromiumOnBeforeMenu(Sender: TObject; const browser: ICefBrowser;
const menuInfo: PCefHandlerMenuInfo; out Result: Boolean);
begin
Result := True;
PopupMenu1.Popup(menuInfo.x, menuInfo.y);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
Chromium: TChromium;
begin
// owner is responsible for destroying the component
// in this case you are telling to Panel1 to destroy
// the Chromium instance before he destroys itself,
// it doesn't affect the event handling
Chromium := TChromium.Create(Panel1);
Chromium.Parent := Panel1;
Chromium.Left := 10;
Chromium.Top := 10;
Chromium.Width := Panel1.Width - 20;
Chromium.Height := Panel1.Height - 20;
// this line is important, you are assigning the event
// handler for OnBeforeMenu event, so in fact you tell
// to the Chromium; hey if the OnBeforeMenu fires, run
// the code I'm pointing at, in this case will execute
// the ChromiumOnBeforeMenu procedure
Chromium.OnBeforeMenu := ChromiumOnBeforeMenu;
Chromium.Load('www.example.com');
end;
3
其實你不需要彈出菜單,你不必須有加vcl.menus單位到您的應用程序,如果你已經可以構建鉻的上下文菜單。鉻自己的菜單更現代和清晰的樣子和更快的繪製性能,而不是使用復古的win32 api庫的vcl。
cef3的菜單完全可以像這樣配置。
procedure Tfmmain.Chromium1BeforeContextMenu(Sender: TObject;
const browser: ICefBrowser; const frame: ICefFrame;
const params: ICefContextMenuParams; const model: ICefMenuModel);
begin
model.Clear;
model.AddItem(1, 'Your Command 1');
model.AddItem(2, 'Your Command 2');
model.AddSeparator;
model.AddItem(3, 'Your Command 3');
model.AddItem(4, 'your Command 4');
model.AddSeparator;
model.AddItem(999, 'Quit');
model.SetAccelerator(1, VK_RIGHT, false, false, false);
model.SetAccelerator(2, VK_LEFT, false, false, false);
model.SetAccelerator(3, VK_DOWN, false, false, false);
model.SetAccelerator(4, VK_UP, false, false, false);
model.SetAccelerator(999, VK_ESCAPE, false, false, false);
end;
procedure Tfmmain.Chromium1ContextMenuCommand(Sender: TObject;
const browser: ICefBrowser; const frame: ICefFrame;
const params: ICefContextMenuParams; commandId: Integer;
eventFlags: TCefEventFlags; out Result: Boolean);
begin
case commandId of
1:
begin
DoIt1;
Result := true;
end;
2:
begin
DoIt2;
Result := true;
end;
3:
begin
DoIt3;
Result := true;
end;
4:
DoIt4;
Result := true;
end;
999:
begin
Application.MainForm.Close;
Result := true;
end;
end;
end;
注:SetAccelerator快捷鍵唯一的功能,如果彈出appears.so你可能需要onPreKeyEvent
+0
此方法還允許您保留現有的Chromium彈出項目(如果您需要);但請注意[所有用戶定義的命令ID都應在MENU_ID_USER_FIRST和MENU_ID_USER_LAST之間](http://magpcss.org/ceforum/apidocs3/projects/(默認)/CefMenuModel.html) –
相關問題
- 1. 將項目添加到瀏覽器上下文菜單?
- 2. 如何在瀏覽器中添加上下文菜單?
- 3. 瀏覽器上下文菜單定製?
- 4. 添加到瀏覽器上下文菜單?
- 5. 如何在combobox上啓用瀏覽器上下文菜單
- 6. 如何啓用dojox.grid.DataGrid中的瀏覽器上下文菜單?
- 7. 如何禁用qooxdoo中的瀏覽器上下文菜單?
- 8. 向WP8瀏覽器控件添加上下文菜單
- 9. 將文本菜單添加到文件瀏覽器
- 10. 任何瀏覽器是否支持HTML5的上下文菜單?
- 11. 瀏覽器將下劃線附加到動態加載的JS
- 12. 將上下文菜單(context.js)附加到cytoscape.js中的節點中
- 13. 將上下文菜單附加到GWT MenuItem
- 14. 將上下文菜單添加到UIImageView
- 15. 如何將複製/粘貼上下文菜單添加到XULRunner中的瀏覽器元素?
- 16. WPF:如何將事件附加到枚舉生成的上下文菜單?
- 17. 如何禁用Ext.menu.Menu項目上的瀏覽器上下文菜單?
- 18. 長按圖片後在瀏覽器的上下文菜單上添加操作?
- 19. 在瀏覽器中編輯上下文菜單
- 20. Eclipse操作項目瀏覽器上下文菜單動態
- 21. TinyMCE4 CTRL + Rightclick打開瀏覽器的默認上下文菜單
- 22. 是否可以重寫瀏覽器中的上下文菜單?
- 23. 在eclipse中擴展Web瀏覽器的上下文菜單
- 24. 擴展出現在瀏覽器的上下文菜單中
- 25. 如何將文件附件拖放到瀏覽器中?
- 26. 如何將值「select」附加到Select下拉菜單中?
- 27. 將着作權項添加到瀏覽器的右鍵菜單
- 28. 將替代菜單項添加到瀏覽器
- 29. 在瀏覽器的上下文菜單中添加一個選項(瀏覽器的擴展名)
- 30. 將菜單項添加到上下文菜單
實際上安裝的彈出菜單父TPanel做得很不錯,但我會接受你的答案是準確和直接的。 –
您可能會動態創建鉻控件,但嘗試在窗體上進行設計。即使這很奇怪,我會說鉻應該保留它的彈出菜單,不管它的主人是什麼。這種方式旨在覆蓋彈出式菜單;) – TLama
當運行時創建瀏覽器時,TPanel作爲所有者,我仍然無法使其工作。事件處理程序根本不被調用。有任何想法嗎? –