Cara mencetak kustom header dan footer untuk kontrol browser web di Internet Explorer

Terjemahan Artikel Terjemahan Artikel
ID Artikel: 267240
Perbesar semua | Perkecil semua

PENDAHULUAN

Ketika Anda meng-host Browser web kontrol, Anda dapat sering perlu untuk menimpa default header dan footer untuk dokumen HTML yang dicetak. Meskipun Microsoft Internet Explorer 5.5 mendukung konfigurasi template printer, yang memungkinkan Anda untuk menyesuaikan header dan footer, versi Internet Explorer 4.0 dan versi yang lebih baru mendukung penggunaan IWebBrowser2::ExecWB metode untuk menyesuaikan header dan footer.

INFORMASI LEBIH LANJUT

IWebBrowser2::ExecWB bungkus untuk Exec metode IOleCommandTarget antarmuka. The ExecWB metode memiliki tanda berikut:
HRESULT ExecWB(
    OLECMDID cmdID,
    OLECMDEXECOPT cmdexecopt,
    VARIANT *pvaIn,
    VARIANT *pvaOut
);
				
Ketika Anda menggunakan pencacahan OLECMDID unsur OLECMDID_PRINT bersama-sama dengan ExecWB metode, Anda dapat menentukan informasi diperpanjang oleh lewat di SAFEARRAY struktur melalui VARIAN argumen pvaIn. Data SAFEARRAY ini jenis membutuhkan waktu maksimum lima item:
  1. String (BSTR) yang berisi custom header.
  2. String (BSTR) yang berisi custom footer.
  3. An IStream objek yang berisi file HTML yang berfungsi sebagai sebuah "opsional header." Ini adalah header e-mail yang Anda lihat di Microsoft Outlook dan Microsoft Outlook Express pesan e-mail ketika Anda mencetaknya. Ini IStream objek harus menunjuk ke dokumen HTML penuh, sah, tidak untuk HTML fragmen, atau akan mencetak salah.
  4. URL alternatif untuk menggunakan dokumen. Ini adalah hanya relevan untuk Outlook dan Outlook Express.
  5. Set pencetakan bendera (dwFlags) untuk mengkonfigurasi printer. Ini hanya relevan untuk Outlook dan Outlook Express.
Microsoft Visual c ++ kode berikut menunjukkan sebuah event handler untuk Mencetak perintah pada menu di Visual C++ browser web host. Kode berfokus pada sangat sederhana header, footer, dan nilai-nilai header opsional.
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;
}

REFERENSI

Untuk informasi lebih lanjut tentang mengembangkan solusi berbasis Web untuk Microsoft Internet Explorer, kunjungi Website Microsoft berikut:
http://MSDN.Microsoft.com/IE/

http://support.microsoft.com/iep

Properti

ID Artikel: 267240 - Kajian Terakhir: 22 September 2011 - Revisi: 2.0
Kata kunci: 
kbfaq kbhowto kbprint kbwebbrowser kbmt KB267240 KbMtid
Penerjemahan Mesin
PENTING: Artikel ini diterjemahkan menggunakan perangkat lunak mesin penerjemah Microsoft dan bukan oleh seorang penerjemah. Microsoft menawarkan artikel yang diterjemahkan oleh seorang penerjemah maupun artikel yang diterjemahkan menggunakan mesin sehingga Anda akan memiliki akses ke seluruh artikel baru yang diterbitkan di Pangkalan Pengetahuan (Knowledge Base) dalam bahasa yang Anda gunakan. Namun, artikel yang diterjemahkan menggunakan mesin tidak selalu sempurna. Artikel tersebut mungkin memiliki kesalahan kosa kata, sintaksis, atau tata bahasa, hampir sama seperti orang asing yang berbicara dalam bahasa Anda. Microsoft tidak bertanggung jawab terhadap akurasi, kesalahan atau kerusakan yang disebabkan karena kesalahan penerjemahan konten atau penggunaannya oleh para pelanggan. Microsoft juga sering memperbarui perangkat lunak mesin penerjemah.
Klik disini untuk melihat versi Inggris dari artikel ini:267240
Sanggahan Konten KB yang Tidak Lagi Diperbarui
Artikel ini berisi tentang produk yang tidak lagi didukung oleh Microsoft. Oleh karena itu, artikel ini disajikan ?sebagaimana adanya? dan tidak akan diperbarui.

Berikan Masukan

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com