Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Распечатка из CHtmlView, html страничку в bitmap  
:(
    Опции темы
SAVe
Дата 25.3.2008, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 84
Регистрация: 15.10.2007

Репутация: нет
Всего: нет



Здравствуйте.
Проблема вот в чём:
У меня есть в программе CHtmlView на которое я подгружаю html страничку. Отображается некоторая табличка с данными у которой задан фон ячеек (всё отображается в цвете). Но при печати этого Veiw цвет фона не отображается. Т.е. получается чёрно- белая печать таблиц , хотя картинки выведенные на эту html страничку печатаются в цвете ( Когда то уже поднимал эту тему , но она осталась без ответа). 

Вопрос в том можно ли каким то образом преобразовтаь отображенную в CHtmlView html страничку в bitmap (взять попиксельно готовое отображение в цвете ) и уже его распечатать ? Как такое сделать ?

Спасибо.
PM MAIL   Вверх
korian
Дата 25.3.2008, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 651
Регистрация: 8.3.2008
Где: Украина, Харьков

Репутация: 2
Всего: 17



что-то не верится, что там настроек нету... а как вы его вообще печатаете?
PM   Вверх
SAVe
Дата 25.3.2008, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 84
Регистрация: 15.10.2007

Репутация: нет
Всего: нет



Это CHtmlView в SDI приложении находится. В приложении поддерживается печать. По комманде меню Print... делаю следующее:

Код

// MyView наследник от CHtmlView
void MyView::PrintPage()
{
    
    CString url;
    // Подготовка активной страницы к печати - создаются временные файлы tmp.xml и tmp.xsl.
// URL временного файла tmp.xml (в нём прописана xsl трансформация - путь к  tmp.xsl)возвращается в переменную url
    url = this->m_TabCtrl.PrepareActivePage();
    if(url != "")
    {
// Переход по заданному url - страница загружается на CHtmlView и отображается в нём
        Navigate2(url,NULL,NULL);    
    }
    
}

.....

void MyView::OnDocumentComplete(LPCTSTR lpszURL)
{
    // TODO: Add your specialized code here and/or call the base class
                   // Перегружаю метод OnDocumentComplete
                   // По завершении загрузки страницы - печатаю её (просто вызываю методы базового класса)
    CHtmlView::OnDocumentComplete(lpszURL);
    CHtmlView::OnFilePrint();
}


Дело в том что даже если распечатать любую html страницу (содержащую таблицы с ячейками , для которых задан цвет фона) из Internet Explorer , то произойдёт то же самое - фон ячеек не отобразится. Т.е. это не проблема CHtmlView ( я думаю что CHtmlView просто использует Explorer через COM). Никаких дополнительных настроек печати я не нашел ни в CHtmlView ни в Internet Explorer ни в свойствах принтеров (пробовал разные принтеры).
PM MAIL   Вверх
korian
Дата 25.3.2008, 18:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 651
Регистрация: 8.3.2008
Где: Украина, Харьков

Репутация: 2
Всего: 17



нда... что-то с печатью у CHtmlView не густо... одна функция CHtmlView::OnFilePrint() и та не документирована.
короче ничего нормального не нашел. можно конечно копировать тупа экран, потом скролить и опять копировать... но как эти куски потом склеивать... короче имху никак нормально его не распечатаешь.

PM   Вверх
SAVe
Дата 26.3.2008, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 84
Регистрация: 15.10.2007

Репутация: нет
Всего: нет



Спасибо и на том... Постараюсь всё таки как то получить отображение. А вдруг получится...
PM MAIL   Вверх
SeregaLBN
Дата 1.4.2008, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 178
Регистрация: 3.10.2003
Где: Киев

Репутация: нет
Всего: нет



Достань из CHtmlView обьект IHTMLDocument2 и вызови :
Код

// печать фреймового документа
void PrintHTMLDocument(IHTMLDocument2 *pDoc2)
{
   USES_CONVERSION;
   //m_Browser.ExecWB(OLECMDID_PRINT, OLECMDEXECOPT_DONTPROMPTUSER, NULL, NULL ); // печать всего документа
   if (pDoc2 != NULL)
   {
      pDoc2->AddRef();
      IOleCommandTarget *pTarget = NULL;
      // the control will handle all printing UI
      HRESULT hRes = pDoc2->QueryInterface(IID_IOleCommandTarget, (void**)&pTarget);
      if (FAILED(hRes) || !pTarget) {
         //...
      } else {
         //hRes = pTarget->Exec(NULL, OLECMDID_PAGESETUP,  OLECMDEXECOPT_DODEFAULT, NULL, NULL);

         USES_CONVERSION;

         BOOL bPreview   = true;
         BOOL bPromtUser = false;

         ////////////////////////////////////////////////////////////
         CString strTemplate; // = _T("Template4Print.html"); // файл тэмплейта печати, если нужно...

         VARIANT varValue; ::VariantInit(&varValue);
         if (!strTemplate.IsEmpty()) {
            V_VT(&varValue) = VT_BSTR;
            V_BSTR(&varValue) = ::SysAllocString(T2COLE(strTemplate));
         }
         VARIANT varBRes; ::VariantInit(&varBRes); V_VT(&varBRes) = VT_BOOL; V_BOOL(&varBRes) = FALSE;

         hRes = pTarget->Exec(
            NULL,
            bPreview ? OLECMDID_PRINTPREVIEW :
                       OLECMDID_PRINT,
            bPreview ? 0 : (bPromtUser ? OLECMDEXECOPT_DODEFAULT :
                                         OLECMDEXECOPT_DONTPROMPTUSER),
            strTemplate.IsEmpty() ? NULL : &varValue,
            NULL//&varBRes//
         );
         if (FAILED(hRes)) {
            //...
         } else {
            // Документ отправлен на печать.
         }
         ::VariantClear(&varBRes);
         ::VariantClear(&varValue);
      }
      pDoc2->Release();
   }
}

PM MAIL   Вверх
SAVe
Дата 4.4.2008, 10:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 84
Регистрация: 15.10.2007

Репутация: нет
Всего: нет



А как его достать (обьект IHTMLDocument2 )?
Пробовал вот так (в классе унаследованном от CHtmlView):
Код

IHTMLDocument2 *pDoc2 = NULL;
    LPUNKNOWN pUnk = NULL;
    
    pUnk = this->m_wndBrowser.GetControlUnknown();

// Вот так не работает: pUnk всегда  NULL
//pUnk = this->GetControlUnknown();
//pUnk = this->GetControllingUnknown();
//pUnk = this->m_wndBrowser.GetControllingUnknown();
//pUnk = this->m_wndBrowser.m_pOuterUnknown;
//pUnk = this->m_wndBrowser.m_xInnerUnknown;
//pUnk = this->m_pOuterUnknown;
//pUnk = this->m_xInnerUnknown;


    
    if(!pUnk)
    {
        return;
    }

    pUnk->AddRef();
    HRESULT hRes = pUnk->QueryInterface(IID_IHTMLDocument2,(LPVOID*)&pDoc2);    
    if(FAILED(hRes))
    {    
        pUnk->Release();
        return;
    }
    PrintHTMLDocument(pDoc2);
    pUnk->Release();


Но при  вызове  
Код

HRESULT hRes = pUnk->QueryInterface(IID_IHTMLDocument2,(LPVOID*)&pDoc2);


в hRes возвращается значение E_NOINTERFACE. Пробовал вернуть все интерфейсы от IHTMLDocument до IHTMLDocument5 - то же самое.


PM MAIL   Вверх
SeregaLBN
Дата 4.4.2008, 16:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 178
Регистрация: 3.10.2003
Где: Киев

Репутация: нет
Всего: нет



Цитата(SAVe @  4.4.2008,  10:23 Найти цитируемый пост)
А как его достать (обьект IHTMLDocument2 )?

Код

void CtestHtmlView2View::OnDocumentComplete(LPCTSTR lpszURL)
{
   IDispatch *pDisp = NULL;
   this->m_pBrowserApp->get_Document(&pDisp);
   if (pDisp) {
      IHTMLDocument2 *pDoc2 = NULL;
      HRESULT hRes = pDisp->QueryInterface(IID_IHTMLDocument2, (void**)&pDoc2);
      if (FAILED(hRes)) {
         // ...
      } else {
         PrintHTMLDocument(pDoc2);
         pDoc2->Release(); pDoc2 = NULL;
      }
      pDisp->Release(); pDisp = NULL;
   }

   CHtmlView::OnDocumentComplete(lpszURL);
}


PM MAIL   Вверх
SAVe
Дата 7.4.2008, 09:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 84
Регистрация: 15.10.2007

Репутация: нет
Всего: нет



Спасибо SeregaLBN. Твой код заработал , но печать и в этом случае делается без цвета (цвет бэкграунда ячеек таблицы не выводится).
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0466 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.