Zurueck zum Inhaltsverzeichnis

Kapitel 8 -

Webbrowser-Komponente des MS Internet Explorers in eigenen Anwendungen

In diesem Kapitel zeigen wir die Einbindung des Internet Explorer Webbrowsers in eigene VC++-Anwendungen.
Die MFC bietet hierzu die Klasse CHtmlView.

Zur Übung beginnen wir einfach ein neues Projekt:

Voraussetzung ist, dass der MS Internet Explorer auf dem entsprechenden PC installiert ist.

Wir erstellen mit dem Assistenten (MFC-Anwendungs-Assistent (exe)) ein Projekt mit Namen "MyBrowser".


Wenn Sie diese Anwendung "MyBrowser" nun kompilieren und starten,
erhalten Sie untenstehendes Fenster und evtl. eine Aufforderung zur DFÜ-Verbindung:

Abb. 8.1: MyBrowser will ins Internet

Gewähren Sie unserem Programm keinen Internetzugang, dann beschwert es sich wie folgt:

Abb. 8.2: MyBrowser funktioniert ohne Internetzugang noch nicht

Sollten Sie so großzügig sein, und eine Internet-Verbindung zulassen, so verbindet Sie unser Programm mit der MS-VisualC++-Seite.

Die Verbindung zum weltweiten Netz ist also ein Kinderspiel. Das Programm "MyBrowser" erfüllt jedoch nicht unsere gehobenen Anforderungen. Wir können z.B. nicht direkt die gewünschte URL eingeben, sondern uns nur per Mausklicks über eingebaute Links weiterbewegen. Also benötigen wir zumindest ein entsprechendes Eingabefeld.

Wir wechseln zu den Ressourcen.
Im Ressourcen-Editor steigen wir ein über die Auswahl
MyBrowser Ressourcen -> Dialog -> IDR MAINFRAME
und können nun das Layout der Dialogleiste direkt im Ressourcen-Editor entwerfen.
Diese Dialogleiste ist sozusagen die zweite "Symbolleiste" unseres Browsers.
Dort befindet sich als Vorgabe folgendes statische Textfeld:

Abb. 8.4: Die Dialogressource IDR MAINFRAME enthält standardisiert obiges Textfeld

Ändern Sie den Titel dieses IDC_STATIC bitte um auf "Webseitenadresse"
und verkürzen Sie bitte die Länge des Feldes,
damit wir rechts daneben das angestrebte Eingabefeld positionieren können.
Als ID dieses Edit-Feldes wählen Sie bitte IDC_URL.

Nach dem Kompilieren / Starten sieht unsere Anwendung nun folgendermaßen aus:

Abb. 8.5: Die Dialogressource IDR MAINFRAME hat ein zusätzliches Eingabefeld erhalten

Jetzt fehlt noch die Verbindung zwischen der Eingabe der Webseitenadresse
und dem in unserem Browser abgebildeten Inhalt.
Hierzu verwenden wir direkt unsere MFC-Klasse CMainFrame.

Damit der folgende Code akzeptiert wird, müssen wir zunächst
die entsprechenden Header in MainFrm.cpp einbinden:



// MainFrm.cpp : Implementierung der Klasse CMainFrame

#include "stdafx.h"
#include "MyBrowser.h"
#include "MainFrm.h"
#include "MyBrowserDoc.h"
#include "MyBrowserView.h"


Wir fügen jetzt eine neue Member-Funktion hinzu, die unsere Eingabe in die neu anzusteuernde Webseite verwandelt.
Nennen Sie diese Funktion z.B. void CMainFrame::OnNewURL(). Den Zugriff setzen wir auf public:

Abb. 8.6: Wir fügen eine neue Member-Funktion in die Klasse CMainFrame ein

Bitte fügen Sie in diese neue Member-Funktion folgenden Programmcode ein:



void CMainFrame::OnNewURL()
{
    CString strURL;
    m_wndDlgBar.GetDlgItem(IDC_URL) -> GetWindowText(strURL);

    CView* pView = GetActiveView();

    CMyBrowserView* pMyView = (CMyBrowserView*) pView;
    pMyView -> Navigate(strURL);
}



Das sieht kompliziert aus. Was haben wir hier getan?

Mittels m_wndDlgBar.GetDlgItem(IDC_URL) greifen wir auf die Edit-Box IDC_URL zu.
Wir transferieren nun mit der Funktion GetWindowText(...) unsere Eingabe aus der Edit-Box in den CString strURL.

GetActiveView() ist eine Member-Funktion von CFrameWnd und liefert einen Zeiger vom Typ CView* zurück.
Diesen müssen wir im vorstehenden Code in einen Zeiger auf unsere von CHtmlView-Klasse abgeleitete Klasse
CMyBrowserView umwandeln. Damit können wir dann Navigate() sinnvoll nutzen.
Wir übergeben den String für die URL dieser Funktion CHtmlView::Navigate(...).
Die vollständige Funktionsbeschreibung lautet übrigens:

void CHtmlView::Navigate
(
     LPCTSTR   URL,
    DWORD   dwFlags             = 0,
    LPCTSTR lpszTargetFrameName = NULL,
    LPCTSTR lpszHeaders         = NULL,
    LPVOID  lpvPostData         = NULL,
    DWORD   dwPostDataLen       = 0
);

Wie Sie sehen, sind die meisten Parameter bereits konfiguriert, so dass man hier nur die URL als LPCTSTR übergeben muß.
Interessant ist z.B. der zweite Parameter dwFlags. Wenn wir diesen z.B. auf "NavOpenInNewWindow" setzen, wird ein neues Fenster geöffnet.

Eine "Kleinigkeit" müssen wir unbedingt noch manuell erledigen:

In MainFrm.cpp tragen wir noch folgendes in der Message-Map hinter dem Bereich des Assistenten ein:



BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)

//{{AFX_MSG_MAP(CMainFrame)
...
ON_WM_CREATE()
//}}AFX_MSG_MAP

ON_COMMAND(IDOK, OnNewURL)  // manuell hinzugefügt

END_MESSAGE_MAP()


Damit schaffen wir die wichtige Verbindung zwischen der Entertaste (führt zu IDOK) nach der Eingabe
der URL in die Edit-Box und unserer Funktion OnNewURL(). Ansonsten würde diese nie gestartet werden.

Viel Spaß! Testen Sie nun Ihre Lieblings-Websites mit Ihrem eigenen Browser (Mit InternetExplorer im Hintergrund).

...

Was Sie möchten noch mehr? Ok, ok ...

Also schauen wir weiter:

Zunächst zur Start-Website beim Hochfahren. Wo steht diese Seite eigentlich?
Suchen Sie in der View. Dort findet man:

void CMyBrowserView::OnInitialUpdate()
{
  CHtmlView::OnInitialUpdate();

  //  ZU ERLEDIGEN: Dieser Code führt Sie zu einem beliebten Anlaufpunkt im Web.
  //  Ändern Sie den Code, um an einen gewünschten Punkt zu gelangen.

  Navigate2(_T("http://www.microsoft.com/visualc/"),NULL,NULL);
}

Beliebter Anlaufpunkt im Web? Ob MS da nicht etwas übertreibt?
Auf jeden Fall wissen wir jetzt, wieso wir beim Start auf    http://www.microsoft.com/visualc/  geführt werden.
An dieser Stelle können Sie nun Ihre Lieblings-Startseite eintragen.

Der aufmerksame Betrachter fragt sich hier sicher, was der Unterschied zwischen Navigate() und Navigate2() ist.
Navigate() dient zum Ansteuern von URL's. Bei Navigate2() findet man darüber hinaus:

Call this member function to navigate to the resource identified by a URL,
or to the file identified by a full path. This member function extends the Navigate member function by supporting browsing on special folders, such as Desktop and My Computer,
that are represented by the parameter pIDL.
 
 
Zurueck zum Inhaltsverzeichnis