Dialog - Einbetten einer CHtmlView in einen Dialog



  • Hallo. Dies hab ich für die FAQ geschrieben. Würde mich freuen, wenn ihr ihn aufnehmt.

    Einbetten einer CHtmlView in einen Dialog

    Machmal möchte man ein Dialog erzeugen, in welchem eine HTML Datei dargestellt werden soll. Dabei soll der Darstellungsbereich frei wählbar sein, damit man in dem Dialog noch andere Controls platzieren kann.
    Die Problematik ist aber, daß es zu der CHtmlView kein CHtmlCtrl gibt, sprich es gibt kein HTML-Control, welches ich einfach auf den Dialog "ziehen" und benutzen kann. Und eine View wird ja normalerweise nur in einer Doc/View Architektur eingesetzt.

    Die folgende Anleitung beschreibt, wie man sich selbst in ein par Schritten ein CHtmlCtrl basteln kann.

    Schritt 1:
    Erstelle ein Dialog und ordne diesem eine Klasse zu (z.B. CHtmlDlg).

    Schritt 2:
    In diesen Dialog platziere in Ressourceneditor ein "Bild"- Control. Dies ist die Abgrenzung, in welcher später die HTML Datei angezeigt wird.
    (Typ: Rahmen, ID: IDC_FRAME, Sichtbar: Ja)

    Schritt 3:
    Ordne eine Nachrichtenbehandlungsroutine der Nachricht WM_INITDIALOG zu (OnInitDialog)
    Die Implementierung erfolgt später

    Schritt 4:
    Erzeuge eine neue Klasse, welche die CHtmlView als Basisklasse hat (Klassenname z.B. CHtmlCtrl)
    Die weiteren Schritte beziehen sich auf diese Klasse.

    Schritt 5:
    Mache den Konstruktor und Dekonstruktor public (Standartmäßig sind sie protected. Weil wie sie aber nicht als View sondern
    als Control nutzen möchten, brauchen wir den Konstruktor und Dekonstruktor als public)

    Schritt 6:
    Füge Nachrichtenbehandlungsroutinen für die folgenden Nachrichten ein:
    WM_MOUSEACTIVATE [OnMouseActivate(CWnd* pDesktopWnd, UINT nHitTest, UINT message)]
    Anmerkung: Um die Nachricht im Assistenten zu sehen, mußt du den Filter auf "Fenster" umsetzen

    WM_DESTROY [DestroyWindow() ]

    Schritt 7:
    Ersetze in OnMouseActivate das "return CHtmlView::OnMouseActivate(pDesktopWnd, nHitTest, message);" durch
    "return CWnd::OnMouseActivate(pDesktopWnd, nHitTest, message);"
    Dadurch wird der "Doc/View- Anteil" übergangen wird.

    Schritt 8:
    Ersetze in DestroyWindow das "return CHtmlView::DestroyWindow();" durch
    "return CWnd::DestroyWindow();"
    Gleiche Wirkung wie in Schritt 6.

    Schritt 9:
    Implementiere folgende virtuelle Funktion: PostNcDestroy()
    Kommentiere die Zeile "CHtmlView::PostNcDestroy();" aus oder lösche sie.
    Der Hintergrund ist, daß die "View" ja nicht gelöscht werden muß, daß Sie ja als Control in den Dialog eingebettet ist.

    Schritt 10:
    Füge folgende Methode in CHtmlCtrl ein:

    BOOL CHtmlCtrl::CreateFromStatic(UINT nID, CWnd* pParent)
     {
        CStatic wndStatic;
        if (!wndStatic.SubclassDlgItem(nID, pParent))
           return FALSE;
    
        // Get static control rect, convert to parent's client coords.
        CRect rc;
        wndStatic.GetWindowRect(&rc);
        pParent->ScreenToClient(&rc);
        wndStatic.DestroyWindow();
    
        // create HTML control (CHtmlView)
        return Create(NULL,                  // class name
           NULL,                             // title
           (WS_CHILD | WS_VISIBLE ),         // style
           rc,                               // rectangle
           pParent,                          // parent
           nID,                              // control ID
           NULL);                            // frame/doc context not used
     }
    

    Schritt 11:
    Zurück zur Klasse CHtmlDlg.
    Jetzt implementieren wir CHtmlDlg::OnInitDialog wie folgt:

    BOOL CHtmlDlg::OnInitDialog() 
    {
       CDialog::OnInitDialog();
    
       VERIFY(m_ctlHtml.CreateFromStatic(IDC_FRAME, this));
       m_ctlHtml.Navigate2(_T("C:\\index.html"));
    
       return TRUE;
    }
    

    Wobei m_ctlHtml eine Membervariable vom Typ CHtmlCtrl ist.
    (Also "CHtmlCtrl m_ctlHtml;" in Headerdatei einfügen und mit "#include "HtmlCtrl.h" die HtmlCtrl.h includieren)
    Mit Navigate2 könnt Ihr zu einer HTML- Seite navigieren.

    Fertig
    Hier noch nützliche Befehle zum Drucken etc.

    m_ctlHtml.ExecWB(OLECMDID_PRINT, OLECMDEXECOPT_DONTPROMPTUSER, NULL, NULL); // Drucken
    m_ctlHtml.ExecWB(OLECMDID_PAGESETUP, OLECMDEXECOPT_DONTPROMPTUSER, NULL, NULL); // Seite einrichten
    m_ctlHtml.ExecWB(OLECMDID_PRINTPREVIEW, OLECMDEXECOPT_DONTPROMPTUSER, NULL, NULL); // Seitenvorschau
    

    article by Uli Rompel



  • Habs nur die ersten paar Säte gelesen, aber die gefallen mir 😉
    -> FAQ


Anmelden zum Antworten