2011-12-06 21 views

Odpowiedz

5

Musisz obsługiwać zdarzenie OnBeforeMenu. W takim przypadku program obsługi wystarczy do ustawienia parametru wyjściowego Result na True, co spowoduje usunięcie domyślnych menu kontekstowych do wyskakujących okienek. Następnie możesz wyświetlić własne menu na pozycjach uzyskanych ze struktury menuInfo.

Oto przykładowy kod z menu kontekstowego zwyczaj:

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; 

Aktualizacja:

dynamicznie utworzonej instancji trzeba ręcznie przypisać obsługi zdarzeń. Spróbuj następującego kodu.

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; 
+0

Właściwie mocowania menu podręczne do rodzica TPanel pracował całkiem OK, ale będę zaakceptować odpowiedź jako dokładna i prosta. –

+0

Prawdopodobnie tworzysz dynamicznie sterowanie chromem, ale spróbuj zaprojektować go na formularzu. I nawet to jest dziwne, powiedziałbym, że chrom powinien zachować swoje menu kontekstowe, niezależnie od tego, kto jest jego właścicielem. Ten sposób jest przeznaczony do przesłonięcia menu podręcznego;) – TLama

+0

Nadal nie mogę sprawić, aby działał, gdy przeglądarka zostanie utworzona w czasie wykonywania z TPanel jako właścicielem. Obsługa zdarzeń po prostu nie jest wywoływana. Jakieś pomysły? –

3

faktycznie nie trzeba PopupMenu i nie trzeba mieć dodać jednostkę vcl.menus do aplikacji, jeśli masz już można budować menu kontekstowego chrom jest. również własne menu chromu jest bardziej nowoczesne i bardziej przejrzyste i szybsze, niż vcl, które używa biblioteki win32 api.

cef3 ma menu konfigurowalne w ten sposób.

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; 


uwaga: skróty SetAccelerator tylko funkcjonalne okienko appears.so was mogą potrzebować onPreKeyEvent

+0

Podejście to pozwala także zachować istniejące wyskakujące okienka Chromium, jeśli ich potrzebujesz; ale zanotuj [Wszystkie identyfikatory poleceń zdefiniowane przez użytkownika powinny znajdować się między MENU_ID_USER_FIRST i MENU_ID_USER_LAST] (http://magpcss.org/ceforum/apidocs3/projects/ (domyślnie) /CefMenuModel.html) –