2012-05-31 17 views

回答

12

没有直接设置或事件允许隐藏Chromium弹出式菜单项。但是你至少有几个选项如何继续,例如你可以:

的查看源代码的选项是被禁止的,并拒绝采取行动

你可以决定什么样的行动1.告诉用户你会允许或拒绝OnMenuAction事件处理程序,其中如果将True分配给Result参数,则操作将被拒绝。已经执行查看源代码的动作,如果是这样,拒绝动作和显示信息消息下面的代码检查:自定义通过更改菜单项的标题与

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.假菜单项的东西了动作

您可以通过更改菜单项的标题并执行一些自定义操作来利用其他菜单项。下面的示例代码演示了如何更改视图源菜单项到约箱菜单项:

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.创建你自己的自定义页面(帧)弹出菜单

您可以创建你自己的弹出式菜单,但是你需要考虑到这个菜单是相当硬编码的,所以如果你需要使用每个新版本的Delphi Chromium包装,那么你需要维护它。下面是代码如何在不查看源代码菜单项中创建的页面菜单:

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. 

脚注

类型定义的所有代码样本中使用的那里,因为我注意到,一些版本Delphi Chromium的错误事件处理程序定义。

+0

好的。非常感谢你 ! – henry60

+1

很高兴帮助;-) – TLama

+1

谢谢你的帮助;) – Beny

1

也许事情改变了多年,今天的直接方法存在:

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; 

您可以使用model.Clear,如果你想彻底摆脱弹出菜单。

相关问题