C++ Builder Snippets  

TCppWebBrowser: Eigenes Kontextmenü implementieren:
 
Dieses Beispiel basiert auf dem Beitrag Abfangen des default Popupmenus des MSIE von Pit Vetterick im Forum der RAD-Pages.


Die TCppWebBrowser-Komponente besitzt ein eigenes Kontextmenü, das genau dem Menü des MS Internet Explorer entspricht. Um ein eigenes Kontextmenü zu verwenden, müssen die an TCppWebBrowser-Control gesendeten WM_RBUTTONUP-Nachrichten von ihrer Anwendung abgefangen und behandelt werden.

Zunachst muss so eine Behandlungsroutine für die WM_RBUTTONUP-Botschaft in der CPP-Datei erstellt und in der Header-Datei deklariert werden (MyPopupMenu ist hier der Name der anzuzeigenden TPopupMenü-Komponente):
//---------------------------------------------------------------------------
// in der Header-Datei:
//---------------------------------------------------------------------------
class TfrmMain : public TForm
{
  ...

  public: // Anwender-Deklarationen

    // Eventhandler für Application->OnMessage deklarieren:
    void __fastcall AppMessage(tagMSG &Msg, bool &Handled);

   ...
};
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
// Behandlungsroutine für die WM_RBUTTONUP-Botschaft (AppMessage() wird
// ausgelöst, wenn die Anwendung eine Windows-Botschaft empfängt)
//---------------------------------------------------------------------------
void __fastcall TfrmMain::AppMessage(tagMSG &Msg, bool &Handled)
{
  // Falls rechte Maustaste gedrückt (oder genauer - losgelassen) wurde
  // und die Checkbox "Eigenes Kontextmenü verwenden" aktiviert ist:
  if(Msg.message == WM_RBUTTONUP && chkShowUserPopupMenu->Checked)
  {
    // Mouse-Koordinaten bestimmen
    TPoint MousePoint = CppWebBrowser->ScreenToClient(Mouse->CursorPos);

    // Browser Rect bestimmen
    TRect ThisRect = CppWebBrowser->ClientRect;

    //überprüfen ob sich der Cursor über dem Browser befindet und ob
    // dieser ueberhaupt sichtbar ist...
    if(PtInRect(&ThisRect, MousePoint) && CppWebBrowser->Visible)
    {
      // Wenn der Cursor ueber dem sichtbaren Browser ist und kein
      // Popup angezeigt werden soll, die Nachricht einfach als behandelt
      // kennzeichnen und die Methode verlassen...ihr koennt aber vor
      // dem 'Handled = true' auch den Code für ein eigenes Popup
      // implementieren:

      // wird diese Zeile auskommentiert, wird gar Kontextmenü angezeigt:
      MyPopupMenu->Popup(Mouse->CursorPos.x, Mouse->CursorPos.y);

      Handled = true;
      return;
    }
    else
    {
      // Dieser Abschnitt wird nicht zwingend benoetigt, ist aber sauberer...
      Handled = IsDialogMessage(CppWebBrowser->Handle, &Msg);
    }
  }
  //-----------------------------------------------------------------------//
  // !!! ACHTUNG !!! ...Application->OnMessage versorgt die komplette      //
  // Anwendung mit Nachrichten...baut hier also keinen kritischen Code     //
  // ein und achtet darauf wann und wo ihr hier Handled = true verwendet...//
  //-----------------------------------------------------------------------//
}
Anschließend muss die soeben erstellte Routine der Application als Messagehandler zugewiesen werden. Dies kann z.B. im OnCreate oder OnShow-Ereignis des Hauptformulars geschehen:
//-------------------------------------------------------------
// OnShow-Eventhandler des Formulars:
//-------------------------------------------------------------
void __fastcall TfrmMain::FormShow(TObject *Sender)
{
  // eigene Botschaftsbehandlungsroutine der Anwendung zuweisen,
  // um die Klicks mit der rechten Mouse-Taste abzufangen bevor
  // sie an TCppWebBrowser weitergeleitet werden:
  Application->OnMessage = AppMessage;
}



Screenshot des Beispielprogramms
Screenshot des Beispielprogramms


  Download BCB6
Projekt-Quellcode
Download
Demo-Exe

© '99-2002 by S. Kreutzmann