Artigo: 267240 - Última revisão: quinta-feira, 11 de Maio de 2006 - Revisão: 4.0

Como imprimir cabeçalhos e rodapés para um controlo WebBrowser no Internet Explorer personalizados

Dica do SistemaEste artigo aplica-se a um sistema operativo diferente do que está a utilizar. Foi desactivado o conteúdo do artigo, que pode não ser relevante para si.
Expandir tudo | Reduzir tudo

INTRODUÇÃO

Quando hospedar o controlo WebBrowser , muitas vezes, poderá ser necessário substituir a predefinição cabeçalhos e rodapés de um documento HTML impresso. Apesar do Microsoft Internet Explorer 5.5 suportar a configuração de modelos de impressora, que lhe permitem personalizar cabeçalhos e rodapés, Internet Explorer versão 4.0 e versões posteriores suportam a utilização do método IWebBrowser2::ExecWB para personalizar cabeçalhos e rodapés.

Mais Informação

IWebBrowser2::ExecWB é um wrapper para o método "Exec" da interface IOleCommandTarget . O método ExecWB tem a seguinte assinatura:
HRESULT ExecWB(
    OLECMDID cmdID,
    OLECMDEXECOPT cmdexecopt,
    VARIANT *pvaIn,
    VARIANT *pvaOut
);
				
quando utiliza uma enumeração OLECMDID do elemento OLECMDID_PRINT juntamente com o método ExecWB , pode especificar informações expandidas de impressão, transmissão na estrutura SEGURA através de pvaIn de argumento VARIANT. Este tipo de dados SEGURA tem um máximo de cinco itens:
  1. Cadeia (BSTR) que contém um cabeçalho personalizado.
  2. Cadeia (BSTR) que contém um rodapé personalizado.
  3. Um objecto IStream que contém um ficheiro HTML que funciona como um "cabeçalho opcional". Trata-se o cabeçalho de correio electrónico que vê no Microsoft Outlook e mensagens de correio electrónico Microsoft Outlook Express quando imprimi-los. Este objecto IStream deve apontar para um documento HTML completo e válido, não para HTML fragmentos ou serão impressos incorrectamente.
  4. Um URL alternativo a utilizar para o documento. Só é relevante para o Outlook e Outlook Express.
  5. Um conjunto de sinalizadores de impressão (dwFlags) para configurar a impressora. Só é relevante para o Outlook e Outlook Express.
O código Microsoft Visual C++ seguinte mostra um processador de eventos para um comando de menu Imprimir num anfitrião Visual C++ WebBrowser. O código foca muito simples cabeçalho, rodapé e valores de cabeçalho opcional.
LRESULT CWebOCWindow::OnPrint(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled) {
	SAFEARRAYBOUND psabBounds[1];
	SAFEARRAY *psaHeadFoot;
	HRESULT hr = S_OK;

	// Variables needed to send IStream header to print operation.
	HGLOBAL hG = 0;
	IStream *pStream= NULL;
	IUnknown *pUnk = NULL;
	ULONG lWrote = 0;
	LPSTR sMem = NULL;
	
	if (!webOC) {
		ATLTRACE(_T("DoPrint: Cannot print - WebBrowser control not ready\n"));
		goto cleanup;
	}
	
	// Initialize header and footer parameters to send to ExecWB().
	psabBounds[0].lLbound = 0;
	psabBounds[0].cElements = 3;
	psaHeadFoot = SafeArrayCreate(VT_VARIANT, 1, psabBounds);
	if (NULL == psaHeadFoot) {
		// Error handling goes here.
		goto cleanup;
	}
	VARIANT vHeadStr, vFootStr, vHeadTxtStream;
	long rgIndices;
	VariantInit(&vHeadStr);
	VariantInit(&vFootStr);
	VariantInit(&vHeadTxtStream);

	// Argument 1: Header
	vHeadStr.vt = VT_BSTR;
	vHeadStr.bstrVal = SysAllocString(L"This is my header string.");
	if (vHeadStr.bstrVal == NULL) {
		goto cleanup;
	}
	
	// Argument 2: Footer
	vFootStr.vt = VT_BSTR;
	vFootStr.bstrVal = SysAllocString(L"This is my footer string.");
	if (vFootStr.bstrVal == NULL) {
		ATLTRACE(_T("DoPrint: Could not allocate memory in %s: Line %d\n"), __FILE__, __LINE__);
		goto cleanup;
	}

	// Argument 3: IStream containing header text. Outlook and Outlook 
         // Express use this to print out the mail header. 	
	if ((sMem = (LPSTR)CoTaskMemAlloc(512)) == NULL) {
		ATLTRACE(_T("DoPrint: Could not allocate memory in %s: Line %d\n"), __FILE__, __LINE__);
		goto cleanup;
	}
	// We must pass in a full HTML file here, otherwise this 
         // becomes corrupted when we print.
	sprintf(sMem, "<html><body><strong>Printed By:</strong> Custom WebBrowser Host 1.0<p></body></html>\0");

	// Allocate an IStream for the LPSTR that we just created.
	hG = GlobalAlloc(GMEM_FIXED | GMEM_ZEROINIT, strlen(sMem));
	if (hG == NULL) {
		ATLTRACE(_T("DoPrint: Could not allocate memory in %s: Line %d\n"), __FILE__, __LINE__);
		goto cleanup;
	}
	hr = CreateStreamOnHGlobal(hG, TRUE, &pStream);
	if (FAILED(hr)) {
		ATLTRACE(_T("OnPrint::Failed to create stream from HGlobal: %lX\n"), hr);
		goto cleanup;
	}
	hr = pStream->Write(sMem, strlen(sMem), &lWrote);
	if (SUCCEEDED(hr)) {
	    // Set the stream back to its starting position.
		LARGE_INTEGER pos;
		pos.QuadPart = 0;
		pStream->Seek((LARGE_INTEGER)pos, STREAM_SEEK_SET, NULL);
		hr = pStream->QueryInterface(IID_IUnknown, reinterpret_cast<void **>(&pUnk));
		vHeadTxtStream.vt = VT_UNKNOWN;
		vHeadTxtStream.punkVal = pUnk;
	}

	rgIndices = 0;
	SafeArrayPutElement(psaHeadFoot, &rgIndices, static_cast<void *>(&vHeadStr));
	rgIndices = 1;
	SafeArrayPutElement(psaHeadFoot, &rgIndices, static_cast<void *>(&vFootStr));
	rgIndices = 2;
	SafeArrayPutElement(psaHeadFoot, &rgIndices, static_cast<void *>(&vHeadTxtStream));
		
	//NOTE: Currently, the SAFEARRAY variant must be passed by using
	        // the VT_BYREF vartype when you call the ExecWeb method.
	VARIANT vArg;
	VariantInit(&vArg);
	vArg.vt = VT_ARRAY | VT_BYREF;
	vArg.parray = psaHeadFoot;
	hr = webOC->ExecWB(OLECMDID_PRINT, OLECMDEXECOPT_DONTPROMPTUSER, &vArg, NULL);
	if (FAILED(hr)) {
		ATLTRACE(_T("DoPrint: Call to WebBrowser's ExecWB failed: %lX\n"), hr);
	goto cleanup;
	}
	return 1; 
	//WebBrowser control will clean up the SAFEARRAY after printing.
	cleanup:
	VariantClear(&vHeadStr);
	VariantClear(&vFootStr);
	VariantClear(&vHeadTxtStream);
	if (psaHeadFoot) {
		SafeArrayDestroy(psaHeadFoot);
	}
	if (sMem) {
		CoTaskMemFree(sMem);	
	}
	if (hG != NULL) {
		GlobalFree(hG);
	}
	if (pStream != NULL) {
		pStream->Release();
		pStream = NULL;
	}
	bHandled = TRUE;
	return 0;
}

Referências

Para obter mais informações sobre como desenvolver soluções baseadas na Web para o Microsoft Internet Explorer, visite os seguintes Web sites da Microsoft:
http://msdn.microsoft.com/ie/ (http://msdn.microsoft.com/ie/)

http://support.microsoft.com/iep (http://support.microsoft.com/iep)

A informação contida neste artigo aplica-se a:
  • Microsoft Internet Explorer 4.0 128-Bit Edition
  • Microsoft Internet Explorer 4.01 Service Pack 2
  • Microsoft Internet Explorer 5.0
  • Microsoft Internet Explorer 5.01
  • Microsoft Internet Explorer 5.5
  • Microsoft Internet Explorer (Programming) 6.0
Palavras-chave: 
kbmt kbfaq kbhowto kbprint kbwebbrowser KB267240 KbMtpt
Tradução automáticaTradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine translation ou MT), não tendo sido portanto revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 267240  (http://support.microsoft.com/kb/267240/en-us/ )
Retired KB ArticleExclusão de Responsabilidade para Conteúdo sem Suporte na KB
Este artigo foi escrito sobre produtos para os quais a Microsoft já não fornece suporte. Por conseguinte, este artigo é oferecido "tal como está" e deixará de ser actualizado.