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).
CHtmlView
den größten Teil der Funktionalität des Internet Explorer
in einer vorgefertigten Klasse verkapselt,
CHtmlView
und dem Internet
Explorer erstellt.
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.
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.
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.
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.
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.
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.
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.
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
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.
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
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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?
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.