0

ビジュアル C++ アプリケーション (x64) を開発しています。実際に私がやろうとしているのは、ウィンドウエクスプローラーにhtmlファイルがあると仮定することです(ファイル拡張子「.html」のファイルを意味します)。それをシングルクリックすると、プレビューペインにプレビューが表示されます(したがって、このファイルを開く必要はありません。ファイルをシングルクリックするだけで、プレビューペインにファイルが表示されます)。

私は同様のタイプのアプリケーションを開発しましたが、私の場合、「htmlファイル」をクリックすると、そのhtmlファイルのコードがプレビューペインに表示されます(そのhtmlファイルをメモ帳で開くと表示されるコード)。これは予期されていませんが、そのhtmlファイルのコードではなく、その「htmlファイル」のプレビューが必要です。

プレビュー ペインの html コードを html ファイルの表示に変換するブラウザ コントロールをホストする必要があると思います (正しい場合は ???) その方法は??

これがそのための私のコードです-

    IHTMLDocument2  * pDoc=NULL;
    HRESULT hr2 = CoCreateInstance(CLSID_HTMLDocument, NULL, CLSCTX_INPROC_SERVER, IID_IHTMLDocument2, (LPVOID *) &pDoc);
    if (pDoc)
    {
        IPersistStreamInit *pPersist = NULL;
        pDoc->QueryInterface(IID_IPersistStreamInit,(LPVOID *) &pPersist);
        if (pPersist)
        {
            IMarkupServices *pMS = NULL;
            pPersist->InitNew();
            pPersist->Release();
            pDoc->QueryInterface(IID_IMarkupServices,(LPVOID *) &pMS);
            if (pMS)
            {
                IMarkupContainer *pMC = NULL;
                IMarkupPointer *pMkStart = NULL;
                IMarkupPointer *pMkFinish = NULL;
                pMS->CreateMarkupPointer(&pMkStart);
                pMS->CreateMarkupPointer(&pMkFinish);
                pMS->ParseString(HtmlFileContents,0,&pMC,pMkStart,pMkFinish);
    //this HtmlFileContents is actually a buffer of olechar type which  contains the code of html file (the code which you see when you open the html file in notepad)
                if (pMC)
                {
                    IHTMLDocument2 *pNewDoc = NULL;
                    pMC->QueryInterface(IID_IHTMLDocument,(LPVOID *) &pNewDoc);
                    if (pNewDoc)
                    {
                        IHTMLElement *pBody;
                        pNewDoc->get_body(&pBody);
                        if (pBody)
                        {
                            BSTR strText;
                            pBody->get_innerText(&strText);
                            hr = instance->CreatePreviewWindowForHtml(strText); // this function is responsible for displaying the html file in window. you can see its definition below after this code.
                            SysFreeString(strText);
                            pBody->Release();
                        }
                        pNewDoc->Release();
                    }
                    pMC->Release();
                }
                if (pMkStart)
                    pMkStart->Release();
                if (pMkFinish)
                    pMkFinish->Release();
                pMS->Release();
                pMS->Release();
            }
        }
        pDoc->Release();
    }
    return true;

 and the function defintion of CreatePreviewWindowForHtml() is as below-    
CreatePreviewWindowForHtml(PCWSTR pszRtfWide)
{
    assert(m_hwndPreview3 == NULL);
    HRESULT hr = E_FAIL;

    if (m_hwndPreview3 == NULL)
    {
        HRESULT hr5 = HRESULT_FROM_WIN32(GetLastError());
    }

    if (m_hinstEditLibrary == NULL)
    {
        // MSFTEDIT_CLASS used below comes from this binary
        m_hinstEditLibrary = LoadLibraryW(L"msftedit.dll");
    }

    if (m_hinstEditLibrary == NULL)
    {
        hr = HRESULT_FROM_WIN32(GetLastError());
    }
    else
    {
        // Create the preview window
        HWND pr = m_hwndPreview3 = CreateWindowExW(0, MSFTEDIT_CLASS, NULL,
            WS_CHILD | WS_VSCROLL | WS_VISIBLE | ES_MULTILINE | ES_READONLY,  // Always create read-only
            m_rcParent.left, m_rcParent.top, RECTWIDTH(m_rcParent), RECTHEIGHT(m_rcParent),
            m_hwndPreview, NULL, NULL,NULL);
        if (m_hwndPreview3 == NULL)
        {
            MessageBoxA(m_hwndPreview3,strerror(hr),"BTN WND2", MB_ICONINFORMATION);
        }
        else
        {
            int const cchRtf = 1 + wcslen(pszRtfWide);
            PSTR pszRtf = (PSTR)CoTaskMemAlloc(cchRtf);
            if (pszRtf)
            {
                WideCharToMultiByte(CP_ACP, 0, pszRtfWide, cchRtf, pszRtf, cchRtf, NULL, NULL);
                SETTEXTEX st = { ST_DEFAULT, CP_ACP };

                LRESULT hr4=SendMessage(m_hwndPreview3, EM_SETTEXTEX, (WPARAM) &st, (LPARAM) pszRtfWide);
                if (SUCCEEDED(hr4))
                {
                    hr = AdjustDialogPositionAndSize();
                    SendMessage(m_hwndPreview3, EM_SETTEXTEX, (WPARAM) &st, (LPARAM) pszRtfWide);
                }


                CoTaskMemFree(pszRtf);
                hr = S_OK;
            }
            else
            {
                hr = E_OUTOFMEMORY;
            }
        }
    }
    return hr;

}

ウィンドウにhtmlコードがある理由は何ですか?? HTMLコードではなく、ウィンドウでHTMLファイルのプレビューを取得するには、コードで何をすればよいですか?? 私を理解する上で疑問がある場合は教えてください??

4

1 に答える 1