Tengo un TChromium broser de Delphi Chromium Embedded (http://code.google.com/p/delphichromiumembedded). Me gustaría adjuntarle un menú contextual. ¿Cómo puedo lograr eso?Cómo adjuntar el menú contextual al navegador TChromium
Respuesta
Debe controlar el evento OnBeforeMenu
. En ese caso, el controlador es suficiente para establecer el parámetro de salida Result
en True
lo que suprimirá los menús contextuales predeterminados para emergente. Después de eso, puede mostrar su propio menú en las posiciones obtenidas de la estructura menuInfo
.
Aquí está el ejemplo de código con un menú emergente personalizado:
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;
Actualización:
Por ejemplo creado de forma dinámica tiene que asignar el controlador de eventos manualmente. Pruebe el siguiente código.
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;
realidad usted no necesita popupmenu y usted no tiene que tener unidad de añadir vcl.menus en su aplicación si ya tiene puede construir el menú contextual de cromo. también el menú propio del cromo es más moderno y claro y tiene una perfomance más rápida que un vcl que utiliza la biblioteca vintage api win32.
cef3 tiene su menú totalmente configurable como este.
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;
nota: atajos SetAccelerator sólo funcional si emergente appears.so es posible que necesite onPreKeyEvent
Este enfoque también le permite mantener los elementos emergentes Chromium existentes si los quiere; pero tenga en cuenta [Todos los identificadores de comando definidos por el usuario deben estar entre MENU_ID_USER_FIRST y MENU_ID_USER_LAST] (http://magpcss.org/ceforum/apidocs3/projects/ (predeterminado) /CefMenuModel.html) –
- 1. ¿Agregar al menú contextual del navegador?
- 2. Cómo agregar menú contextual al menú contextual de NSOutlineView (
- 3. Editar menú contextual en el navegador
- 4. No se puede adjuntar controlador de eventos al elemento de menú contextual en el estilo
- 5. cómo llamar menú contextual
- 6. Agregar icono al menú contextual hijo
- 7. Tortoise SVN: cómo cambiar el menú contextual?
- 8. PyQt y menú contextual
- 9. agregar elemento de menú al menú contextual predeterminado
- 10. ¿Cómo modificar el menú contextual en CKEditor?
- 11. Extensión de Chrome: añada funciones al menú contextual
- 12. Menú contextual de TabControl
- 13. Encuadernación desde el elemento de menú contextual al control principal
- 14. Añadir menú contextual personalizado al explorador para el directorio \ fondo
- 15. menú contextual principal?
- 16. C# ¿Cómo agregar mi programa al menú contextual?
- 17. Eliminar el menú contextual en TinyMCE
- 18. menú contextual jquery desactivar elementos de menú
- 19. Listener androide despedir menú contextual
- 20. Menú contextual en Android WebView
- 21. Desactivar el menú contextual en cromo
- 22. ¿Puedo personalizar el menú contextual de AvalonDock?
- 23. ListView personalizado y menú contextual. ¿Cómo conseguirlo?
- 24. addon de firefox: agregar icono al menú contextual
- 25. ¿Cómo agregar menú contextual a wpf datagrid?
- 26. Menú contextual por clic corto
- 27. ¿Cómo cerrar la aplicación WPF desde el menú contextual?
- 28. Agregar elemento de menú al menú contextual de Windows solo para el tipo de archivo específico
- 29. Cómo agregar un elemento de menú al menú contextual predeterminado del botón derecho
- 30. Acceso directo al menú contextual de Visual Studio
En realidad adjuntando el menú emergente para un padre TPanel funcionó bastante bien, pero voy a aceptar su respuesta como precisa y recta. –
Probablemente esté creando dinámicamente el control de cromo, pero intente diseñarlo en un formulario. E incluso esto es extraño, diría que el cromo debería mantener su menú emergente sea lo que sea su propietario. De esta manera se pretende anular el menú emergente;) – TLama
Todavía no puedo hacer que funcione cuando el navegador se crea en tiempo de ejecución con TPanel como propietario. El controlador de eventos simplemente no se llama. ¿Algunas ideas? –