| 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; } |

|
Download BCB6 Projekt-Quellcode |
|
Download Demo-Exe |
| © '99-2002 by S. Kreutzmann |