Как загрузить html-содержимое из потока, а затем как создать таблицу стилей для отображения html-файла на панели предварительного просмотра (например, обработчик предварительного просмотра HTML)

Я занимаюсь разработкой приложения Visual C++, и мне нужно разработать обработчик предварительного просмотра для предварительного просмотра HTML на панели предварительного просмотра. У меня есть идея сделать то же самое для документов XML (для файлов XML они создают таблицу стилей для выполнения этой задачи), но я не знаю, как это сделать для файла.html.

Если я прав, я должен сделать что-то вроде этого

IHTMLDocument * pDomDoc;
HRESULT hr = CoCreateInstance(CLSID_HTMLDocument, NULL, CLSCTX_INPROC_SERVER, 
                                  IID_IHTMLDocument2, (void**)&pDomDoc);
 I don't know what after that ?? 

Есть идеи??

Я имею в виду, я знаю, как сделать это для файлов XML, для них это выглядит следующим образом:

        IXMLDOMDocument *pDomDoc;
    IStream *m_FinalXMLStream;
             HRESULT hr = CoCreateInstance(__uuidof(DOMDocument60), NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pDomDoc));



                 if (SUCCEEDED(hr))
                    {
                        VARIANT_BOOL vfSuccess = VARIANT_FALSE;
                        VARIANT vtXmlSource = {0};
                        V_VT(&vtXmlSource) = VT_UNKNOWN;
                        V_UNKNOWN(&vtXmlSource) = static_cast<IUnknown *>(m_FinalXMLStream);
    //here m_FinalXMLStream is the stream cpntaining the contents of XML file
                        hr = pDomDoc->load(vtXmlSource, &vfSuccess);
                        if (vfSuccess != VARIANT_TRUE)
                        {
                            hr = FAILED(hr) ? hr : E_FAIL; // keep failed hr
                        }

                        if (SUCCEEDED(hr))
                        {
                            if ((m_pStyleSheetNode) == NULL)
                            {
                                hr = CreateStyleSheetNode();
//This function creates the stylesheet and defined somewhere in my code.
                            }

                            if (SUCCEEDED(hr))
                            {
                                BSTR bstrRtf;
                                hr  = pDomDoc->transformNode((m_pStyleSheetNode), &bstrRtf);
                                if (SUCCEEDED(hr))
                                {
                                    hr = CreatePreviewWindowForXml(bstrRtf);
//This function call creates the  window dimension where to preview the Xml contents
                                    SysFreeString(bstrRtf);
                                }
                            }
                        }
                        pDomDoc->Release();
                    }

Любая идея, как сделать то же самое для HTML-файлов? "Я хочу сделать то же самое для HTML-файла. Понял??? если нет, пожалуйста, спросите меня снова??

посмотрите это, чтобы понять, что на самом деле я хочу сделать - я хочу, чтобы у меня был поток, содержащий содержимое любого файла html (IStream *m_FinalHTMLStream;). то, как я получил поток, пока не имеет значения. Теперь важно то, что он содержит содержимое html-файла (если вы откроете любой html-файл в notepad-_FinalHTMLStream содержит то же содержимое внутри него).now, как вы можете видеть что когда у нас есть html-файл в окне просмотра и если мы щелкаем по нему один раз, мы можем увидеть предварительный просмотр html-файла в previewpane. Я хочу сделать то же самое. Для этого нам нужно, чтобы содержимое html-файла хранилось где-то (в моем случае я в _FinalHTMLStream) . для того же самого с файлами XML код такой же, как и выше, но я не знаю, как это сделать с файлами HTML. Так вот что я хочу. Понял сейчас?? если нет то пожалуйста дайте мне знать??

я создаю свой собственный обработчик предварительного просмотра hor.html файл, это то, что я делаю (вкратце и точно)..

2 ответа

Решение

Наконец, я смог отобразить содержимое HTML самостоятельно (не мог получить никакой помощи от Интернета и stackru, но я хотел дать код на stackru, чтобы это было полезно для тех, кто делает то же самое в будущем), я сделал это с помощью Интерфейс IHTMLDocument2 и IPersistStreamInit, а также IMarkupContainer и IMarkupPointer .

Код выглядит следующим образом:

            IHTMLDocument2  * pDoc=NULL;
            HRESULT hr = 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("you can see the syntax on msdn i don't want to give a spoon feed");
                                  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 creating the preview at preview pane i have created it
// myself and passed the html contents which are converted to strText and is of the type BSTR .
                                               SysFreeString(strText);
                                               pBody->Release();

                                           }
                                           pNewDoc->Release();
                                      }
                                      pMC->Release();
                                  }
                                  if (pMkStart)
                                      pMkStart->Release();
                                  if (pMkFinish)
                                      pMkFinish->Release();
                                  pMS->Release();
                                         pMS->Release();
                              }
                         }
                         pDoc->Release();
                    }


                    return true;


    }

Я надеюсь, что это может быть очень полезно для кого-то. Это даст идею сделать, но я не хочу давать ложку корма, поэтому прокомментировал некоторую часть, но его 80% решения.

Вы имеете в виду, что вы хотите сделать HTML-браузер внутри окна?

пожалуйста, посмотрите на эту ссылку.

http://www.codeproject.com/Articles/3365/Embed-an-HTML-control-in-your-own-window-using-pla

если это не то, что вы хотите, объясните, что вы подразумеваете под "обработчиком предварительного просмотра для HTML".

Другие вопросы по тегам