vorheriges KapitelInhaltsverzeichnisStichwortverzeichnisFeedbacknächstes Kapitel


Woche 3

Tag 21

Funktionen für Webbrowser

Als Microsoft vor wenigen Jahren die Entscheidung getroffen hat, alle seine Anwendungen Internet-fähig zu machen, ging es nicht nur darum, daß man Word das Lesen und Schreiben von HTML-Seiten beibrachte. Das Internet sollte integraler Teil jeder Anwendung werden, auf die eine oder andere Art. Aus dem Blickwinkel der Entwicklungswerkzeuge betrachtet, handelt es sich natürlich nicht um eine wirklich praktische Integration, wenn man einem Editor die Doppelfunktion eines E-Mail-Clients einhaucht. Erleichtert man es allerdings den Benutzern von Entwicklungswerkzeugen, Internet-fähige Anwendungen zu erstellen, ist das schon eher ein praktisches Feature. Und das ist genau das, was Microsoft umgesetzt hat.

Eine der Fähigkeiten, die Microsoft in seinen Werkzeugen zur Anwendungsentwicklung verfügbar gemacht hat, ist der Einsatz des Internet Explorer als integraler Teil einer beliebigen Anwendung. Das bedeutet, daß man den Internet Explorer und alle damit verbundenen Komponenten in eigene Anwendungen einbinden kann. Die Möglichkeiten gehen weit über die Bereitstellung der Webbrowser-Fähigkeiten hinaus. Ihre Anwendungen können auch Java-Applets aufnehmen und damit zusammenarbeiten. Man kann den Benutzern nicht nur eine, sondern zwei Makrosprachen bieten - VBScript und JScript (Microsofts Version von JavaScript).

Heute lernen Sie, wie ...

Das ActiveX-Modell des Internet Explorer

Als sich bei Microsoft der Gedanke durchsetzte, ActiveX mit dem Webbrowser Internet Explorer zu integrieren, wurde klar, daß man den Internet Explorer technisch überholen mußte, um den Einsatz von ActiveX-Steuerelementen zu unterstützen. Die Entwickler sahen sich an, was man tun mußte und was im Rahmen des Möglichen lag, und entschieden sich dafür, den Internet Explorer zu mehr als zu einem Webbrowser zu machen.

Als erstes hat Microsoft den eigentlichen Webbrowser von den ActiveX-Objekten, die die gesamte Arbeit verrichten, getrennt. Herausgekommen ist die Anwendung Internet Explorer, die etwas mehr als einen Dokument-Container für ActiveX darstellt, und das Internet-Explorer-HTML-Viewer-Steuerelement, das als ActiveX-Dokument-Server innerhalb der Anwendung läuft. Das bedeutet, daß die Anwendung Internet Explorer nicht nur Webseiten aufnehmen kann, sondern auch Word-Dokumente, Excel- Tabellenblätter, PowerPoint-Präsentationen und jedes beliebige ActiveX-Dokument, für das ein ActiveX-Dokument-Server auf demselben Computer installiert ist, wie es Abbildung 21.1 verdeutlicht.

Abbildung 21.1:
Das ActiveX-Dokumentmodell des Internet Explorer

Innerhalb der HTML-Viewer-Komponente hat Microsoft die Fähigkeit eingebaut, andere Steuerelemente aufzunehmen, einschließlich Skripting-Engines und ActiveX- Steuerelemente, wie in Abbildung 21.2 dargestellt. Damit hat Microsoft eine Flexibilität erreicht, um dem Internet Explorer weitere Skriptsprachen hinzuzufügen, wenn diese gefordert und erstellt werden. Darüber hinaus kann der Internet Explorer beliebige ActiveX-Steuerelemente aufnehmen, die noch in den Schubläden der Entwickler liegen.

Abbildung 21.2:
Das ActiveX-Objektmodell HTML Viewer des Internet Explorer

Durch dieses Konzept des Internet Explorer hat sich Microsoft nicht nur selbst eine Menge Flexibilität für zukünftige Erweiterungen der vom Internet Explorer unterstützten Funktionalität verschafft, sondern auch die gesamten Tätigkeiten des Internet Explorer jedem Entwickler verfügbar gemacht, der diese nutzen und in seine Anwendungen integrieren möchte.

Die Klasse CHtmlView

Um den Internet Explorer HTML-Viewer leicht in Visual-C++-Anwendungen einbinden zu können, hat ihn Microsoft in die Klasse CHtmlView verpackt. Diese Klasse läßt sich als Basisklasse für die Ansichtsklassen in SDI- oder MDI-Anwendungen einsetzen. Man kann in einfacher Weise Anwendungen erstellen, die die Fähigkeiten eines Webbrowsers mitbringen.

Im Web navigieren

In der Klasse CHtmlView sind verschiedene Funktionen verfügbar, die sich auf die Navigation im Web beziehen. Dazu gehören Funktionen, die dem Browser die Startseite des Benutzers zurückgeben oder den Benutzer auf eine Suchseite des Internet bringen. Weiterhin gibt es Funktionen, über die der Benutzer zur vorhergehenden oder nächsten Seite gelangt oder sogar zu einer entfernten Webseite wechseln kann. Alle diese Funktionen sind Elemente der Klasse CHtmlView und demzufolge Member-Funktionen der Ansichtsklasse Ihrer Anwendung (wenn Sie die Klasse CHtmlView als Basisklasse für Ihre Ansichtsklasse verwenden).

Die Navigationsfunktionen der Klasse CHtmlView faßt Tabelle 21.1 zusammen.

Tabelle 21.1: Navigationsfunktionen der Klasse CHtmlView

Funktionsdefinition

Beschreibung

GoBack()

Bringt den Benutzer auf die vorhergehende Webseite.

GoForward()

Bringt den Benutzer zur nächsten Webseite. (Setzt voraus, daß der Benutzer vorher mindestens eine Webseite zurückgegangen ist.)

GoHome()

Bringt den Benutzer zur Startseite für Internet Explorer.

GoSearch()

Bringt den Benutzer zu einer Suchseite im Internet.

Navigate(LPCTSTR URL)

Bringt den Benutzer auf die Webseite, die in der URL-Variablen angegeben ist.

Die ersten vier Funktionen übernehmen keine Argumente und führen genau die gleiche Funktion aus wie ihre Äquivalente auf der Symbolleiste des Internet Explorer. Von den Argumenten an die letzte Funktion ist nur der URL der anzuzeigenden Webseite erforderlich.

Den Browser steuern

Zusammen mit den Funktionen zur Navigation im Web verwenden Sie auch bestimmte Funktionen, mit denen Sie den Browser steuern. Zwei davon sind Refresh(), die das HTML-Viewer-Steuerelement veranlaßt, die aktuelle Webseite neu zu laden, und Stop(), die einen laufenden Download anhält. Wie bei den meisten Navigationsfunktionen übernehmen diese Funktionen keine Argumente und arbeiten genau wie ihre äquivalenten Schaltflächen auf der Symbolleiste des Internet Explorer.

Den Browser-Status ermitteln

Eine weitere Kategorie von Funktionen, die in der Klasse CHtmlView verfügbar sind, haben informellen Charakter. Man kann diese Funktionen verwenden, um Informationen über den aktuellen Status des Browsers zu ermitteln. Wenn Sie zum Beispiel die aktuelle Webseite im Browser wissen möchten, rufen Sie die Funktion GetLocationURL() auf, die einen CString mit dem URL zurückgibt. Wollen Sie bestimmen, ob der Browser gerade mit einem Download beschäftigt ist, rufen Sie die Funktion GetBusy() auf. Diese Funktion gibt einen booleschen Wert zurück und zeigt damit an, ob der Browser beschäftigt ist.

In der Klasse CHtmlView sind viele weitere Funktionen verfügbar. Einige davon arbeiten nur im Internet Explorer selbst und nicht im Browser-Steuerelement.

Eine Webbrowser-Anwendung erstellen

Als Beispiel, wie man die Webbrowser-Komponente des Internet Explorer in eigene Anwendungen einbindet, erstellen Sie heute eine einfache Webbrowser-Anwendung. Das Ganze baut auf einer SDI-Anwendung auf, die die Klasse CHtmlView als Basisklasse der Ansichtsklasse verwendet. Für die Navigation fügen Sie ein Menü mit den Befehlen Zurück und Vorwärts hinzu. Weiterhin erhält die Anwendung ein Dialogfeld, um dem Benutzer die Eingabe eines URL zu ermöglichen. Damit navigieren Sie den Browser zur angegebenen Webseite.

Das Anwendungsgerüst erstellen

Für eine Webbrowser-Anwendung können Sie auf ein normales SDI- oder MDI-Anwendungsgerüst zurückgreifen. Als einzige Voraussetzung muß der Internet Explorer auf dem Computer installiert sein, auf dem Ihre Anwendung läuft. Bei Ihrem Entwicklungscomputer ist das kein Problem, weil die Installation von Visual C++ ohnehin darauf dringt, daß Sie die neueste Version des Internet Explorer installieren. Bei jedem anderen Computer, auf dem Ihre Anwendung laufen soll, müssen Sie sich allerdings zuerst davon überzeugen, ob der Internet Explorer installiert ist. Andernfalls müssen Sie die Installation selbst vornehmen.

Um das Gerüst der heutigen Beispielanwendung zu erstellen, legen Sie mit dem Anwendungs-Assistenten ein neues Projekt an. Nennen Sie das Projekt zum Beispiel WebBrowse, und klicken Sie auf OK, um den Assistenten zu starten.

Mit dem Anwendungs-Assistenten können Sie genauso leicht eine MDI-Anwendung als Webbrowser erstellen wie eine SDI-Anwendung. Für die heutige Beispielanwendung wählen Sie die Option Einzelnes Dokument (SDI). In den übrigen Dialogfeldern des Assistenten übernehmen Sie die Standardeinstellungen. Für das Beispiel wählen Sie allerdings im vierten Dialogfeld des Assistenten die Option Internet Explorer-Infoleisten als Erscheinung der Menüs.

Schließlich legen Sie im sechsten Dialogfeld des Anwendungs-Assistenten die Klasse CHtmlView als Basisklasse für Ihre Ansichtsklasse fest. Damit erstellt der Assistent Ihre Anwendung mit dem Webbrowser-Steuerelement des Internet Explorer als Hauptansicht der Anwendung.

Wenn Sie dieses Gerüst der Anwendung kompilieren und starten sowie eine Verbindung zum Internet herstellen, haben Sie bereits einen funktionsfähigen Webbrowser vor sich, wie es Abbildung 21.3 zeigt. Allerdings läßt sich noch nicht festlegen, wohin Sie der Browser bringen soll, es sei denn, Sie klicken auf die Links in den angezeigten Webseiten.

Abbildung 21.3:
Die anfängliche Webbrowser-Anwendung

Funktionen zum Navigieren hinzufügen

Mit einem funktionsfähigen Browser allein ist es noch nicht getan. Man muß auch steuern können, wohin der Browser navigieren soll. Es ist ein Eingabefeld erforderlich, in das der Benutzer einen URL eingeben kann. Wenn Sie sich die Symbolleiste der laufenden Anwendung ansehen, finden Sie einen Platz, wo sich dieses Steuerelement unterbringen läßt.

Einen URL spezifizieren

Wenn Sie die Anwendung ausführen, haben Sie wahrscheinlich schon den Text in der zweiten Symbolleiste bemerkt, daß an dieser Stelle das Layout der Dialogleiste unterzubringen ist. Die Dialogleiste unterscheidet sich von dem, was Sie bisher kennengelernt haben. Es handelt sich um eine Symbolleiste, auf der normale Steuerelemente wie bei einem Dialogfeld enthalten sind. Die Leiste entwerfen Sie sogar mit dem Dialog-Editor. Wenn Sie auf der Registerkarte Ressourcen nach der Dialogleiste suchen, finden Sie sie nicht im Ordner Toolbar, sondern im Ordner Dialog.

Öffnen Sie den Ordner Dialog, und doppelklicken Sie auf das Dialogfeld IDR_MAINFRAME, um es im Dialog-Editor zu öffnen. Es zeigt sich, daß dieses Dialogfeld die zweite Symbolleiste in Ihrer Anwendung verkörpert. Auf dieser Symbolleiste lassen sich Eingabefelder, Schaltflächen, Kombinationsfelder und Kontrollkästchen plazieren - praktisch jedes beliebige Steuerelement, das Sie auch in einem normalen Dialogfeld verwenden können.

Modifizieren Sie das bereits auf der Dialogleiste vorhandene Textfeld, und fügen Sie ein Eingabefeld hinzu, wie es Abbildung 21.4 zeigt. Legen Sie für dieses Beispiel die ID des Eingabefelds mit IDC_EADDRESS fest.

Abbildung 21.4:
Das Layout der Dialogleiste

Bevor Sie den Klassen-Assistenten öffnen, um Variablen und Behandlungsroutinen für die Dialogleiste hinzuzufügen, sollten Sie wissen, daß die Dialogleiste ihre Ereignisse automatisch an die Hauptrahmenklasse Ihrer Anwendung schickt. Sobald Sie den Klassen-Assistenten öffnen, nimmt dieser an, daß Sie die Dialogleiste mit einer Klasse verbinden möchten, und fordert Sie auf, eine neue Klasse zu erstellen. Diese Verbindung ist jedoch nicht erforderlich, da Sie alle Ereignisse über den Rahmen abbilden und von dort aus an die Ansichts- oder Dokumentklassen weiterleiten können.

Für die heutige Beispielanwendung brauchen Sie nicht einmal den Klassen-Assistenten zu bemühen, um irgendwelche Behandlungsroutinen für die Dialogleiste aufzunehmen. Sie müssen eine Aktion auslösen, wenn der Benutzer den URL vollständig in das Eingabefeld eingegeben hat. Von den im Klassen-Assistenten verfügbaren Ereignissen kommt am ehesten EN_CHANGED in Frage, das jeden vom Benutzer eingegebenen Buchstaben meldet. Wir brauchen aber ein Ereignis, das ausgelöst wird, wenn der Benutzer die (¢)-Taste drückt. Zum Glück wird die Befehls-ID IDOK an die Rahmenklasse gesendet, wenn der Benutzer das Eingabefeld in der Dialogleiste ausfüllt und die (¢)-Taste drückt. Man kann in diesem Fall eine Behandlungsroutine in die Nachrichtenzuordnungstabelle einfügen, um eine Funktion für den Befehl IDOK aufzurufen.

In der Behandlungsroutine des Befehls müssen Sie den Fenstertext aus dem Eingabefeld in der Dialogleiste ermitteln. Diesen String können Sie an die Funktion Navigate in der Ansichtsklasse übergeben und damit den Browser veranlassen, zu der vom Benutzer angegebenen Seite zu gehen.

Fügen Sie zu diesem Zweck eine neue Member-Funktion in die Klasse CMainFrame ein. Legen Sie den Funktionstyp als void, die Funktionsdeklaration als OnNewAddress und den Zugriff als Public fest. In die Funktion schreiben Sie den Code aus Listing 21.1.

Listing 21.1: Die Funktion OnNewAddress der Klasse CMainFrame

1: void CMainFrame::OnNewAddress()
2: {
3: CString sAddress;
4:
5: // Den neuen URL holen
6: m_wndDlgBar.GetDlgItem(IDC_EADDRESS)->GetWindowText(sAddress);
7: // Zum neuen URL navigieren
8: ((CWebBrowseView*)GetActiveView())->Navigate(sAddress);
9: }

Die Funktion holt in Zeile 6 mit der Funktion GetWindowText den Text im Eingabefeld und schreibt ihn in die Variable m_sAddress. Die Dialogleiste ist in der Klasse CMainFrame als Variable m_wndDlgBar deklariert, so daß sich die Funktion GetDlgItem auf der Variablen der Dialogleiste verwenden läßt, um einen Zeiger auf das Eingabefeld zu ermitteln.

In Zeile 8 findet die Typumwandlung des aus der Funktion GetActiveView zurückgegebenen Zeigers in einen Zeiger auf die Klasse CWebBrowseView statt. Damit kann man die Funktion Navigate auf der Ansichtsklasse aufrufen und den URL übergeben, den der Benutzer im Eingabefeld spezifiziert hat.

Nachdem Sie nun den vom Benutzer eingegebenen URL übernehmen und die Browser-Komponente anweisen können, zu dieser Webseite zu gehen, wie lösen Sie dann diese Funktion aus? Dazu müssen Sie manuell einen Eintrag in die Nachrichtenzuordnungstabelle einfügen, da der Klassen-Assistent dazu nicht in der Lage ist. Fügen Sie in der Nachrichtenzuordnungstabelle nach der schließenden Markierung von AFX_MSG_MAP (dem vom Klassen-Assistenten verwalteten Bereich) das Makro ON_COMMAND ein, um damit den Befehl IDOK und Ihre neue Funktion als aufzurufenden Handler zu spezifizieren, wie es Listing 21.2 zeigt. Sie können diesen Eintrag auch vor dem vom Klassen-Assistenten verwalteten Abschnitt einfügen, solange der Eintrag nicht innerhalb dieses Bereichs steht.

Listing 21.2: Die Nachrichtenzuordnungstabelle von CMainFrame

1: BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
2: //{{AFX_MSG_MAP(CMainFrame)
3: // HINWEIS - Hier werden Mapping-Makros vom Klassen-Assistenten Âeingefügt und entfernt.
4: // Innerhalb dieser generierten Quelltextabschnitte NICHTS ÂVERÄNDERN!
5: ON_WM_CREATE()
6: //}}AFX_MSG_MAP
7: ON_COMMAND(IDOK, OnNewAddress)
8: END_MESSAGE_MAP()

Wenn Sie die Anwendung kompilieren und ausführen, können Sie einen URL in das Eingabefeld auf der Symbolleiste eintragen und die (¢)-Taste drücken, und Ihre Anwendung sollte zur angegebenen Webseite gehen, wie es Abbildung 21.5 zeigt.

Abbildung 21.5:
Zu einem bestimmten URL gehen

Den aktuellen URL anzeigen

Wenn Sie durch das Web surfen, folgen Sie oftmals Verweisen auf Webseiten, die zu anderen Websites führen. In diesem Fall wissen Sie nicht, auf welche Website Sie zugreifen, wenn Ihr Browser nicht den URL in das Adreßfeld stellt und damit Ihren aktuellen Standort angibt sowie die Möglichkeit bietet, den URL zu kopieren oder zu modifizieren, um eine andere Seite auf derselben Site zu suchen.

Das Abfragen des aktuellen URL vom Browser ist einfach: Man ruft die Funktion GetLocationURL auf und übergibt das Ergebnis an die Dialogleiste. Das Problem besteht darin, wann man den URL holt. Es stellt sich heraus, daß sich manche Ereignisfunktionen in der Klasse CHtmlView nicht in Ihrer Klasse überschreiben lassen. Diese Funktionen werden bei verschiedenen Ereignissen ausgelöst, die das Browser-Steuerelement initiiert. Es gibt Ereignisfunktionen für das Starten der Navigation, den Beginn eines Download, die Überwachung des Download-Fortschritts und - am wichtigsten für unsere Erfordernisse - die Anzeige, daß der Download abgeschlossen ist. Keine dieser Behandlungsfunktionen können Sie in Ihre Ansichtsklasse über den Klassen-Assistenten aufnehmen. Das müssen Sie in eigener Regie bewerkstelligen.

Um die Behandlungsroutine für einen abgeschlossenen Download in Ihre Anwendung einzubauen, fügen Sie eine neue Member-Funktion in die Ansichtsklasse der Anwendung ein. Legen Sie den Funktionstyp als void, die Funktionsdeklaration mit OnDocumentComplete(LPCSTSTR lpszUrl) und den Zugriff als Public fest. In die Funktion schreiben Sie den Code aus Listing 21.3.

Listing 21.3: Die Funktion OnDocumentComplete der Klasse CWebBrowseView

1: void CWebBrowseView::OnDocumentComplete(LPCTSTR lpszUrl)
2: {
3: // Den neuen URL an die Adreßleiste übergeben
4: ((CMainFrame*)GetParentFrame())->SetAddress(lpszUrl);
5: }

In dieser Funktion fällt auf, daß man die Funktion GetLocationURL überhaupt nicht aufrufen muß. Der heruntergeladene URL wird als Argument an die Funktion übergeben. Damit können Sie den URL an den Rahmen weiterreichen, wo Sie eine andere Funktion hinzufügen, um das Eingabefeld auf der Dialogleiste mit dem URL zu füllen.

Nehmen Sie zu diesem Zweck eine neue Member-Funktion in die Hauptrahmenklasse CMainFrame auf. Legen Sie den Funktionstyp als void, die Funktionsdeklaration als SetAddress(LPCSTR lpszURL) und den Zugriff als Public fest. In die Funktion übernehmen Sie den Code aus Listing 21.4.

Listing 21.4: Die Funktion SetAddress der Klasse CMainFrame

1: void CMainFrame::SetAddress(LPCTSTR lpszURL)
2: {
3: // Den neuen URL ins Eingabefeld der Adresse setzen
4: m_wndDlgBar.GetDlgItem(IDC_EADDRESS)->SetWindowText(lpszURL);
5: }

Hier haben Sie den entgegengesetzten Weg eingeschlagen, mit dem Sie den Text aus dem Eingabefeld geholt haben. Die Funktion SetAddress ändert den Text im Eingabefeld mit der Funktion SetWindowText auf den übergebenen URL. Wenn Sie die Anwendung ausführen, sollte die URL-Adresse in der Dialogleiste die momentan angezeigte Webseite widerspiegeln.

Zurück und Vorwärts

Nachdem Sie einen URL in ddie Dialogleiste eingeben und Ihre Anwendung veranlassen können, zu dieser Website zu gehen, und auch die Adresse aller betrachteten Websites zu sehen sind, wäre es schön, wenn man wieder an die Stelle zurückkehren könnte, woher man gekommen ist. Dazu ruft man einfach die Funktionen GoBack und GoForward in der Ansichtsklasse der Anwendung auf. Die Funktionen lassen sich über Menübefehle aktivieren, was Ihnen außerdem ermöglicht, dieselben Aufrufe über Schaltflächen der Symbolleiste zu realisieren.

Um diese Funktionalität zu implementieren, öffnen Sie das Hauptmenü im Menü-Editor. Aus der Menüleiste können Sie das Menü Bearbeiten mit allen zugehörigen Menübefehlen löschen, da sie für die heutige Beispielanwendung keine Rolle spielen. Ziehen Sie den leeren Menübefehl auf der Menüleiste links neben das Menü Hilfe. Öffnen Sie das Eigenschaftsdialogfeld für diesen Menübefehl, und tragen Sie als Titel &Wechseln zu ein. In diesem Menü sind alle Navigationsfunktionen zusammengefaßt.

Für die Navigation in Vorwärts- und Rückwärtsrichtung fügen Sie zwei Menübefehle hinzu, einen für die Funktion GoForward und einen für die Funktion GoBack. Legen Sie die Eigenschaften für die beiden Menübefehle gemäß Tabelle 21.2 fest.

Tabelle 21.2: Eigenschaftseinstellungen des Menüs Wechseln zu

Objekt

Eigenschaft

Einstellung

Menübefehl

ID

Titel

Statuszeilentext

IDM_GO_BACK

&Zurück\tAlt+Nach-Links

Wechselt zum vorherigen Objekt\nZurück

Menübefehl

ID

Titel

Statuszeilentext

IDM_GO_NEXT

&Vorwärts\tAlt+Nach-Rechts

Wechselt zum nächsten Objekt\nVorwärts

Nachdem Sie die Menübefehle hinzugefügt haben, können Sie mit dem Klassen-Assistenten die Funktionen in die Ansichtsklasse für beide Menüereignisse hinzufügen. Für die Menü-ID IDM_GO_BACK fügen Sie eine Behandlungsfunktion für die Nachricht COMMAND hinzu und schreiben den Code aus Listing 21.5 in die Funktion.

Listing 21.5: Die Funktion OnGoBack der Klasse CWebBrowseView

1: void CWebBrowseView::OnGoBack()
2: {
3: // TODO: Code für Befehlsbehandlungsroutine hier einfügen
4:
5: // Zur vorherigen Seite gehen
6: GoBack();
7: }

Öffnen Sie den Klassen-Assistenten erneut, und fügen Sie eine Behandlungsfunktion für die Objekt-ID IDM_GO_NEXT für die Nachricht COMMAND hinzu. In diese Funktion nehmen Sie den Code aus Listing 21.6 auf.

Listing 21.6: Die Funktion OnGoNext der Klasse CWebBrowseView

1: void CWebBrowseView::OnGoNext()
2: {
3: // TODO: Code für Befehlsbehandlungsroutine hier einfügen
4:
5: // Zur nächsten Seite gehen
6: GoForward();
7: }

Nun können Sie Ihre Anwendung ausführen und - egal, wohin Sie gerade gesurft sind - über die Menüs zu den vorherigen Webseiten zurückgehen und dann die gleiche Route wieder vorwärts einschlagen. Allerdings ist es schwerer, mit Menüs zu arbeiten, so daß man für die beiden Menübefehle Zugriffstasten vorsehen sollte.

Wenn Sie die Accelerator-Tabelle im Ressourcenbaum öffnen, finden Sie bereits ein ganzes Bündel von Zugriffstasten, die mit Menü-IDs verbunden sind. Jede dieser Zugriffstasten besteht aus einer ID und einer Tastenkombination. Wenn Sie an einer beliebigen Stelle in der Accelerator-Tabelle mit der rechten Maustaste klicken, finden Sie im Kontextmenü den Befehl Neue Zugriffstaste. Wenn Sie diesen Befehl wählen, erscheint ein Dialogfeld, in das Sie die Angaben für die Zugriffstaste eintragen können. Als erstes ist die Menü-ID anzugeben, mit der die Zugriffstaste verbunden wird. (Wie bei Symbolleistenschaltflächen sind Zugriffstasten mit Menübefehlen gekoppelt.) Darunter geben Sie die Taste an, die als Zugriffstaste wirksam ist, oder Sie wählen eine Taste aus der Dropdown-Liste aus.

Im rechten Teil des Dialogfelds können Sie die Zusatztaste festlegen. Dabei handelt es sich um Tasten, die in Verbindung mit der bereits festgelegten Zugriffstaste zu drücken sind, um die Funktion auszulösen. Nachdem Sie alle erforderlichen Informationen für die Zugriffstaste eingegeben haben, schließen Sie das Dialogfeld, um die spezifizierten Informationen in die Tabelle aufzunehmen.

Es empfiehlt sich, die Tasten (Strg) oder (Alt) als eine der Zusatztasten für alle Zugriffstasten zu verwenden, die mit Standardtasten arbeiten. Wenn Sie nicht eine dieser beiden Tasten als Teil der Zugriffstaste spezifizieren, kann die Anwendung nicht unterscheiden, ob der Benutzer Informationen eingeben oder die mit einer Zugriffstaste verbundene Funktion auslösen möchte.

Um Zugriffstasten für die Menüs Zurück und Vorwärts in Ihre Anwendung aufzunehmen, wählen Sie den Befehl Neue Zugriffstaste aus dem Kontextmenü und legen die ID mit IDM_GO_BACK, die Taste mit VK_LEFT und die Zusatztaste mit Alt fest. Für die zweite Zugriffstaste geben Sie IDM_GO_NEXT als ID, VK_RIGHT als Taste und Alt als Zusatztaste an. Wenn Sie die Anwendung ausführen, können Sie mit der Tastenkombination (Alt)+(æ) zur vorherigen Seite und mit der Tastenkombination (Alt)+(Æ) zur nächsten Seite gehen.

Das Feld Taste akzeptiert ein einzelnes Zeichen, einen ASCII-Wert oder einen virtuellen Tastenbezeichner. Da sich die Pfeiltasten nicht mit einem einzelnen Zeichen eingeben lassen, bleiben noch die beiden anderen Möglichkeiten. Wenn Sie nicht gerade alle ASCII-Werte für die Tasten im Kopf haben, sollten Sie die Taste aus der Dropdown-Liste auswählen. Der virtuelle Tastenbezeichner für die Pfeiltaste nach links lautet VK_LEFT, für die Pfeiltaste nach rechts VK_RIGHT.

Damit sich die Anwendung wie die meisten verfügbaren Webbrowser verhält, fügen Sie für die beiden Menübefehle noch Symbolleistenschaltflächen hinzu, die mit einem Pfeil nach links bzw. rechts versehen sind.

Den Browser steuern

Beim Browsen gelangt man oft auf eine Webseite, bei der man das Herunterladen gar nicht abwarten will. Die Übertragung läßt sich auch mittendrin anhalten. Es kann sein, daß Sie den falschen URL eingegeben haben oder Ihnen der Download zu lange dauert. Es spielt keine Rolle, warum Sie den Download anhalten wollen. Es genügt, daß Sie es wollen. Aus diesem Grund verfügt die Klasse CHtmlView über die Funktion Stop. Diese Funktion bricht den momentan laufenden Download ab. Um diese Funktionalität in die Beispielanwendung aufzunehmen, fügen Sie dem Menü Ansicht mit dem Menü-Editor einen neuen Menübefehl hinzu. Legen Sie die Eigenschaften des Menübefehls gemäß Tabelle 21.3 fest.

Tabelle 21.3: Eigenschaften des Menübefehls Abbrechen

Objekt

Eigenschaft

Einstellung

Menübefehl

ID

Titel

Statuszeilentext

IDM_VIEW_STOP

A&bbrechen

Bricht die aktuelle Übertragung ab\nAbbrechen

Mit dem Klassen-Assistenten nehmen Sie eine Behandlungsroutine in die Ansichtsklasse für diese Menü-ID für die Nachricht COMMAND auf. In die Funktion schreiben Sie den Code aus Listing 21.7.

Listing 21.7: Die Funktion OnViewStop der Klasse CWebBrowseView

1: void CWebBrowseView::OnViewStop()
2: {
3: // TODO: Code für Befehlsbehandlungsroutine hier einfügen
4:
5: // Bricht die aktuelle Übertragung ab
6: Stop();
7: }

Wenn Sie die Anwendung ausführen, können Sie mit diesem Menübefehl jegliches Herunterladen einer Webseite stoppen, auf die Sie nicht warten wollen. Es ist allerdings bequemer, wenn man das über eine Schaltfläche auf der Symbolleiste vornehmen könnte.

Die meisten Browser verfügen außerdem über die Möglichkeit, die aktuelle Seite neu zu laden. Diese Funktion ist vor allem für Webseiten praktisch, die dynamische Elemente enthalten, die sich bei jedem Herunterladen der Seite ändern. Sie ist auch hilfreich für Webseiten, die Ihr Browser im Cache abgelegt hat, so daß er die neueste Version der Seite vielleicht gar nicht abruft. Man muß den Browser dazu zwingen können, die Seite erneut zu laden und nicht einfach die Cache-Version anzuzeigen (insbesondere bei einer Webseite, die Sie gerade entwerfen). Diese Fähigkeit realisiert die Browser-Funktion Refresh. Ein Aufruf dieser Funktion bedeutet, daß die aktuelle Seite erneut geladen wird.

In die Beispielanwendung können Sie diese Funktionalität mit einem weiteren Menübefehl im Menü Ansicht realisieren. Legen Sie die Eigenschaften für den neuen Menübefehl gemäß Tabelle 21.4 fest. Zwischen den ursprünglich vorhandenen und den neuen Menübefehlen können Sie auch eine Trennlinie einfügen, so daß Ihr Menü wie in Abbildung 21.6 aussieht.

Tabelle 21.4: Eigenschaften des Menübefehls Aktualisieren

Objekt

Eigenschaft

Einstellung

Menübefehl

ID

Titel

Statuszeilentext

IDM_VIEW_REFRESH

&Aktualisieren

Aktualisiert den Inhalt der aktuellen Seite\nAktualisieren

Abbildung 21.6:
Das modifizierte Menü Ansicht

Nachdem Sie den Menübefehl hinzugefügt haben, nehmen Sie mit dem Klassen-Assistenten eine Behandlungsroutine in die Ansichtsklasse für die Nachricht COMMAND für diesen Menübefehl auf. In die Funktion schreiben Sie den Code aus Listing 21.8.

Listing 21.8: Die Funktion OnViewRefresh der Klasse CWebBrowseView

1: void CWebBrowseView::OnViewRefresh()
2: {
3: // TODO: Code für Befehlsbehandlungsroutine hier einfügen
4:
5: // Lädt die aktuelle Seite erneut
6: Refresh();
7: }

Diese Funktionalität können Sie nun testen, indem Sie eine Website suchen, die jedesmal eine andere Seite zurückliefert, wenn Sie den Browser aktualisieren, wie zum Beispiel Random Monty Python Skit Server (siehe Abbildung 21.7). Wie bei den übrigen Menüfunktionen, die Sie in die Beispielanwendung aufgenommen haben, sollten Sie auch für diese eine Schaltfläche auf der Symbolleiste vorsehen.

Abbildung 21.7:
Die Funktion Refresh leitet einen neuen Download ein.

Zusammenfassung

Heute haben Sie gelernt, wie Microsoft den Webbrowser Internet Explorer als eine Reihe von ActiveX-Komponenten konzipiert hat, die sich auch in anderen Anwendungen nutzen lassen. Es wurde gezeigt, wie Microsoft den Browser in der Klasse CHtmlView abgekapselt hat. Diese Klasse kann man in SDI- und MDI-Anwendungen nutzen, um die Funktionalität eines Browsers in nahezu jeder Anwendung umsetzen zu können. Sie haben gesehen, wie man die Dialogleiste verwendet, um Steuerelemente auf einer Symbolleiste unterzubringen, und wie sich die Ereignisse für diese Steuerelemente in der Rahmenklasse der Anwendung behandeln lassen. Schließlich haben Sie gelernt, wie man Menüs in die Anwendung aufnimmt, um die verschiedenen Funktionen des Webbrowsers aufzurufen, damit das Surferlebnis komplett wird.

Fragen und Antworten

Frage:
Warum gehört die Seitenansicht nicht zu den Standardmenüs, wenn ich die Klasse CHtmlView als Basisklasse für meine Ansichtsklasse wähle?

Antwort:
Die Druckfunktionen für die Klasse CHtmlView übernimmt der Browser und nicht die Ansichtsklasse. Die Seitenansicht ist nicht vorhanden, da sie der Browser nicht unterstützt.

Frage:
Wie kann die den HTML-Quellcode vom Browser beziehen, damit ich ihn ansehen oder bearbeiten kann?

Antwort:
Die Klasse CHtmlView verfügt über die Member-Funktion GetHtmlDocument, die einen Zeiger auf die Schnittstelle IDispatch des Dokumentobjekts im Browser zurückliefert. Verwenden Sie die Methode Invoke der Schnittstelle IDispatch, um die Funktionen im Dokumentobjekt aufzurufen und den HTML-Quellcode zu erhalten. Weitere Hinweise dazu finden Sie auf der Microsoft Developer Network CD, die zum Lieferumfang von Visual C++ gehört.

Workshop

Kontrollfragen

1. Was verkapselt die Klasse CHtmlView für den Einsatz in Visual-C++-Anwendungen?

2. Wie kann man den URL für die aktuelle Webseite aus der Klasse CHtmlView erhalten?

3. Welcher Befehl wird für die Rahmenklasse ausgelöst, wenn der Benutzer die (¢)- Taste im Eingabefeld der Dialogleiste drückt?

4. Welche Funktionen können Sie aufrufen, um den Browser zur vorherigen und zur nächsten Webseite zu navigieren?

5. Wie kann man einen laufenden Download anhalten?

Übungen

1. Fügen Sie die Funktion GoSearch in das Menü und die Symbolleiste ein.

2. Nehmen Sie die Funktion GoHome in das Menü und die Symbolleiste auf.

3. Deaktivieren Sie die Schaltfläche Abbrechen und den zugehörigen Menübefehl, wenn die Anwendung keine Webseite herunterlädt.



vorheriges KapitelInhaltsverzeichnisStichwortverzeichnisFeedbackKapitelanfangnächstes Kapitel


Ein Imprint des Markt&Technik Buch- und Software-Verlag GmbH.
Elektronische Fassung des Titels: Visual C++ 6 in 21 Tagen, ISBN: 3-8272-2035-1