Pregunta

Tengo un broser TChromium de Delphi Chromium Embedded (http://code.google.com/p/delphichromiumembedded).Me gustaría adjuntarle un menú contextual.¿Cómo puedo lograrlo?

¿Fue útil?

Solución

Debe manejar el OnBeforeMenu .En ese controlador de eventos, es suficiente establecer el parámetro de salida Result en True, lo que suprimirá los menús contextuales predeterminados para que aparezcan.Después de eso, puede mostrar su propio menú en las posiciones obtenidas del menuInfo estructura.

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;

<×Update:

Para las instancias creadas dinámicamente, debe 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;

Otros consejos

en realidad, no necesita el menú emergente y no tiene que agregar la unidad vcl.menus a su aplicación si ya puede crear el menú contextual de chromium.Además, el propio menú de chromium es más moderno y tiene un aspecto más claro y un rendimiento de dibujo más rápido en lugar de un vcl que utiliza una biblioteca api vintage win32.

cef3 tiene su menú totalmente configurable así.

 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: los accesos directos de SetAccelerator solo funcionan si aparece una ventana emergente, por lo que es posible que necesite onPreKeyEvent

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top