Печать колонтитулов из CHtmlView
От: BEARNY Россия www.snip.ru
Дата: 22.08.02 13:14
Оценка:
Всем привет!
Как пишут в MSDN, чтобы напечатать колонтитулы из CHtmlView нужно вызвать
IOleCommandTarget -> Exec(...) или IWebBrowser2 -> ExecWB(...) с параметром IDM_PRINT, и параметром pvaIn — массивом VT_ARRAY|VT_VARIANT, в котором первые 2 параметра и есть BSTR-значения колонтитулов

Делаю так:
class cSCTextView : public CHtmlView...
.
.
.
В cSCTextView::OnInitialUpdate() вызываю:

void cSCTextView::InitPrintParam( )
{
///////////////////////////////////////////////////////////////////////////
//Создаем безопасный массив для передачи
//в качестве аргумента функции Exec
SAFEARRAY * pSA = NULL;
SAFEARRAYBOUND bounds;
bounds.lLbound = 0;
bounds.cElements = 5;
//создаем массив
pSA = ::SafeArrayCreate(VT_VARIANT, 1, &bounds );

if( !pSA )
{
VariantInit( &( this -> m_vaPrintIn ) );
this -> m_vaPrintIn.vt = VT_EMPTY;
}
else
{
VARIANT vHead, vFoot, vStream, vMSHTML, vFlags;
//заполняем массив
//Page Header
VariantInit( &vHead );
vHead.vt = VT_BSTR;
vHead.bstrVal = ::SysAllocString(L"&b&bСтраница &p");
long i = 0;
HRESULT hr = ::SafeArrayPutElement( pSA, &i, &vHead );
ASSERT( hr == S_OK );
//Page Footer
VariantInit( &vFoot );
CString strFooter;
strFooter.LoadString( IDS_TEXT_FOOTER );
vFoot.vt = VT_BSTR;
vFoot.bstrVal = strFooter.AllocSysString( );
i = 1;
hr = ::SafeArrayPutElement( pSA, &i, &vFoot );
ASSERT( hr == S_OK );
//address of an IStream pointer for a
//Microsoft Outlook Express header document
VariantInit( &vStream );
vStream.vt = VT_BSTR;
vStream.bstrVal = NULL;
i = 2;
hr = ::SafeArrayPutElement( pSA, &i, &vStream );
ASSERT( hr == S_OK );
//alternate URL, used for MS's HTML parsing and
//rendering engine in Outlook Express
VariantInit( &vMSHTML );
vMSHTML.vt = VT_BSTR;
vMSHTML.bstrVal = NULL;
i = 3;
hr = ::SafeArrayPutElement( pSA, &i, &vMSHTML );
ASSERT( hr == S_OK );
//flags
VariantInit( &vFlags );
vFlags.vt = VT_I2;
vFlags.uiVal = 0;
i = 4;
hr = ::SafeArrayPutElement( pSA, &i, &vFlags );
ASSERT( hr == S_OK );
//упаковываем массив в VARIANT
VariantInit( &( this -> m_vaPrintIn ) );
this -> m_vaPrintIn.vt = VT_ARRAY | VT_VARIANT;
this -> m_vaPrintIn.parray = pSA;
}
}

void cSCTextView::OnFilePrint()
{
IOleCommandTarget * piTarget;

LPDISPATCH lpDisp = this -> GetHtmlDocument( );
HRESULT hr = lpDisp -> QueryInterface( IID_IOleCommandTarget, (void**)( &piTarget ) );

if( hr == S_OK )
{
hr = piTarget -> Exec( &CGID_MSHTML, IDM_PRINT, OLECMDEXECOPT_PROMPTUSER, &( this -> m_vaPrintIn ),
NULL );

if( hr != S_OK )
{
MessageBox( _T( "Произошла ошибка печати" ), _T( "Ошибка" ),
MB_OK | MB_ICONSTOP );
}

piTarget -> Release( );
lpDisp -> Release( );
}
}

В результате моих колонтитулов — нет!!! Установлен Internet Explorer 6.0.
Подозреваю, что может где-то массив неправильно заполняю, какие у кого соображения будут?

Help, please!!!
Михаил Иванченко
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.