2012-05-31 7 views

risposta

12

Non ci sono impostazioni dirette o eventi che consentono di nascondere le voci di menu popup di Chromium. Tuttavia si dispone di almeno alcune opzioni come continuare, è possibile per esempio:

utente 1. dicono che l'opzione Visualizza sorgente è vietato e il declino l'azione

Si può decidere quale azione si vuole consentire o rifiutare il gestore di eventi OnMenuAction, dove se si assegna True al parametro Result l'azione viene rifiutata. Il seguente codice controlla di aver eseguito l'azione vista di origine e in tal caso, il declino l'azione e mostrare il messaggio di informazioni:

type 
    TCefMenuId = TCefHandlerMenuId; 

procedure TForm1.Chromium1MenuAction(Sender: TObject; 
    const browser: ICefBrowser; menuId: TCefMenuId; out Result: Boolean); 
begin 
    if menuId = MENU_ID_VIEWSOURCE then 
    begin 
    Result := True; 
    ShowMessage('View page source is not allowed!'); 
    end; 
end; 

2. falso la voce di menu a qualcosa di personalizzato cambiando il titolo di voce di menu con il suo azione

È possibile sfruttare la voce di menu per qualcos'altro modificando la didascalia della voce di menu ed eseguendo alcune azioni personalizzate. Il codice di esempio seguente mostra come modificare la voce di menu visualizza sorgente nella voce di menu di dialogo Informazioni su:

type 
    TCefMenuId = TCefHandlerMenuId; 

procedure TForm1.Chromium1GetMenuLabel(Sender: TObject; 
    const browser: ICefBrowser; menuId: TCefMenuId; var caption: ustring; 
    out Result: Boolean); 
begin 
    if menuId = MENU_ID_VIEWSOURCE then 
    caption := 'About my application...'; 
end; 

procedure TForm1.Chromium1MenuAction(Sender: TObject; 
    const browser: ICefBrowser; menuId: TCefMenuId; out Result: Boolean); 
begin 
    if menuId = MENU_ID_VIEWSOURCE then 
    begin 
    Result := True; 
    ShowMessage('About box...!'); 
    end; 
end; 

3. Creare i vostri menu della pagina (frame) pop-up personalizzati

È possibile creare il tuo menu popup, ma devi considerare che questo menu è abbastanza hardcoded, quindi dovrai mantenerlo se avrai bisogno di farlo ugualmente con ogni nuova versione del wrapper Delphi Chromium. Ecco il codice come creare il menu di pagina senza la voce di menu Visualizza sorgente:

unit Unit1; 

interface 

uses 
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
    Dialogs, StdCtrls, Menus, cefvcl, ceflib; 

type 
    PCefMenuInfo = PCefHandlerMenuInfo; 

type 
    TForm1 = class(TForm) 
    Chromium1: TChromium; 
    procedure FormCreate(Sender: TObject); 
    procedure Chromium1BeforeMenu(Sender: TObject; const browser: ICefBrowser; 
     const menuInfo: PCefMenuInfo; out Result: Boolean); 
    private 
    PageMenu: TPopupMenu; 
    procedure OnNavigateBackMenuItemClick(Sender: TObject); 
    procedure OnNavigateForwardMenuItemClick(Sender: TObject); 
    procedure OnPrintMenuItemClick(Sender: TObject); 
    public 
    { Public declarations } 
    end; 

var 
    Form1: TForm1; 

implementation 

{$R *.dfm} 

procedure TForm1.OnNavigateBackMenuItemClick(Sender: TObject); 
begin 
    Chromium1.Browser.GoBack; 
end; 

procedure TForm1.OnNavigateForwardMenuItemClick(Sender: TObject); 
begin 
    Chromium1.Browser.GoForward; 
end; 

procedure TForm1.OnPrintMenuItemClick(Sender: TObject); 
begin 
    Chromium1.Browser.GetFocusedFrame.Print; 
end; 

procedure TForm1.Chromium1BeforeMenu(Sender: TObject; 
    const browser: ICefBrowser; const menuInfo: PCefMenuInfo; 
    out Result: Boolean); 
begin 
    if menuInfo.typeFlags = MENUTYPE_PAGE then 
    begin 
    Result := True; 
    PageMenu.Items[0].Enabled := browser.CanGoBack; 
    PageMenu.Items[1].Enabled := browser.CanGoForward; 
    PageMenu.Popup(menuInfo^.x, menuInfo^.y); 
    end; 
end; 

procedure TForm1.FormCreate(Sender: TObject); 
var 
    MenuItem: TMenuItem; 
begin 
    PageMenu := TPopupMenu.Create(Self); 
    MenuItem := TMenuItem.Create(PageMenu); 
    MenuItem.Caption := 'Back'; 
    MenuItem.OnClick := OnNavigateBackMenuItemClick; 
    PageMenu.Items.Add(MenuItem); 
    MenuItem := TMenuItem.Create(PageMenu); 
    MenuItem.Caption := 'Forward'; 
    MenuItem.OnClick := OnNavigateForwardMenuItemClick; 
    PageMenu.Items.Add(MenuItem); 
    MenuItem := TMenuItem.Create(PageMenu); 
    MenuItem.Caption := '-'; 
    PageMenu.Items.Add(MenuItem); 
    MenuItem := TMenuItem.Create(PageMenu); 
    MenuItem.Caption := 'Print'; 
    MenuItem.OnClick := OnPrintMenuItemClick; 
    PageMenu.Items.Add(MenuItem); 
    Chromium1.Load('www.stackoverflow.com'); 
end; 

end. 

nota

Le definizioni del tipo utilizzato in tutti gli esempi di codice sono lì perché ho notato che qualche versione di Delphi Chromium ha definizioni di gestore eventi errate.

+0

OK. Grazie mille ! – henry60

+1

Felice di aiutare ;-) – TLama

+1

Grazie per questo grande aiuto;) – Beny

1

Probabilmente le cose sono cambiate nel corso degli anni, oggi un metodo diretto esiste:

uses 
    ceflib; 

[..] 

implementation 

procedure TForm1.Chromium1BeforeContextMenu(Sender: TObject; 
    const browser: ICefBrowser; const frame: ICefFrame; 
    const params: ICefContextMenuParams; const model: ICefMenuModel); 
begin 
    //model.Clear; 
    model.Remove(Integer(MENU_ID_VIEW_SOURCE)); 
end; 

È possibile utilizzare model.Clear se si desidera eliminare completamente menu a comparsa.