2012-05-31 15 views

Trả lời

12

Không có cài đặt trực tiếp hoặc sự kiện nào cho phép ẩn các mục menu bật lên Chromium. Tuy nhiên bạn có ít nhất vài lựa chọn cách tiếp tục, bạn có thể ví dụ:

sử dụng 1. Cho rằng tùy chọn Xem nguồn bị cấm và từ chối hành động

Bạn có thể quyết định những gì hành động sẽ bạn cho phép hoặc từ chối trong trình xử lý sự kiện OnMenuAction, nếu bạn gán True cho thông số Result thì hành động sẽ bị từ chối. Kiểm tra mã sau đây mà bạn đã thực hiện những hành động xem mã nguồn và nếu như vậy, từ chối các hành động và hiển thị thông báo thông tin:

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. Fake mục trình đơn để một cái gì đó tùy chỉnh bằng cách thay đổi chú thích mục trình đơn với nó hành động

Bạn có thể tận dụng mục menu cho mục khác bằng cách thay đổi chú thích của mục menu và thực hiện một số hành động tùy chỉnh. Mẫu mã sau đây cho thấy làm thế nào để thay đổi các mục menu xem nguồn vào mục về hộp menu:

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. Tạo bạn sở hữu tùy chỉnh trang (frame) Menu popup

Bạn có thể tạo menu popup của riêng bạn, nhưng bạn cần phải xem xét rằng trình đơn này là khá hardcoded, vì vậy bạn sẽ cần phải duy trì nó nếu bạn sẽ cần phải có nó giống nhau với mỗi phiên bản mới của Delphi Chromium wrapper. Đây là mã làm thế nào để tạo menu trang mà không mục menu view source:

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. 

Footnote

Các định nghĩa kiểu sử dụng trong tất cả các mẫu mã được ở đó vì tôi đã nhận thấy rằng một số phiên bản của Delphi Chromium có định nghĩa trình xử lý sự kiện sai.

+0

OK. Cảm ơn nhiều ! – henry60

+1

Rất vui được giúp ;-) – TLama

+1

Cảm ơn bạn đã giúp đỡ rất nhiều;) – Beny

1

Có lẽ mọi thứ đã thay đổi trong những năm, hôm nay một phương pháp trực tiếp tồn tại:

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; 

Bạn có thể sử dụng model.Clear nếu bạn muốn hoàn toàn thoát khỏi trình đơn popup.