Как напечатать определенное содержимое во всем документе, используя DHTML - PullRequest
0 голосов
/ 06 октября 2011

В этом примере я хочу напечатать содержимое в идентификаторе tab_form_1 . При попытке этого образца напечатать содержимое tab_form_1 , lpOleCommandTarget становится пустым, а интерфейс запроса с использованием CComptr.

Как решить эту проблему?

SAMMPLE

    IHTMLDocument2 *pDoc;
GetDHtmlDocument(&pDoc);


CComPtr<IHTMLElement2> spControl;       
if(GetElementInterface(_T("tab_form_1") ,&spControl) != S_OK)
    return; 

//ole command target
LPOLECOMMANDTARGET lpOleCommandTarget = NULL;
spControl->QueryInterface(IID_IOleCommandTarget,(void**)&lpOleCommandTarget);ASSERT(lpOleCommandTarget);
//lpDispatch->Release();

if(lpOleCommandTarget == NULL) return;

//prepare header
CString header   = _T("Project Path: &w");

VARIANT     header_variant;
VariantInit(&header_variant);
V_VT(&header_variant)   = VT_BSTR;
V_BSTR(&header_variant) = CString(header).AllocSysString();

//prepare footer
CString footer   = _T("&d &t&b Page&p of &P");

VARIANT     footer_variant;
VariantInit(&footer_variant);
V_VT(&footer_variant)   = VT_BSTR;
V_BSTR(&footer_variant) = CString(footer).AllocSysString();

//prepare header footer safe arrray
SAFEARRAYBOUND  parameter_array_bound[1];
SAFEARRAY       *parameter_array = NULL;

parameter_array_bound[0].cElements = 2;
parameter_array_bound[0].lLbound   = 0;

parameter_array = SafeArrayCreate(VT_VARIANT,1,parameter_array_bound);

//HRESULT hr;
long index;

index = 0;
HRESULT hr    = SafeArrayPutElement(parameter_array,&index,&header_variant);

index = 1;
hr    = SafeArrayPutElement(parameter_array,&index,&footer_variant);

VARIANT parameter;
VariantInit(&parameter);
V_VT(&parameter)    = VT_ARRAY | VT_BYREF;
V_ARRAY(&parameter) = parameter_array;

// print contents of web browser control
lpOleCommandTarget->Exec(NULL, OLECMDID_PRINT, OLECMDEXECOPT_DODEFAULT, &parameter,NULL);

//clear all variants
VariantClear(&header_variant);
VariantClear(&footer_variant);
if (parameter_array != NULL) {
    SafeArrayDestroy(parameter_array);
}

lpOleCommandTarget->Release();

1 Ответ

0 голосов
/ 20 октября 2011

Попробуйте этот пример. Это устранит вашу проблему. Этот код напечатает определенное содержимое во вновь созданном документе.

    // create DHtmlDocument for Newly Created Dialog
HRESULT hDispatch = printdlg->m_pBrowserApp->get_Document((IDispatch**)&pDisp);
if(hDispatch != S_OK) return;
HRESULT hResult = pDisp->QueryInterface(IID_IHTMLDocument2, (void**)&pNewDoc);
if(hResult != S_OK) return;

//GetDHtmlDocument for new document
GetDHtmlDocument(&pDoc);

BSTR strSummaryText = GetElementHtml(L"tab_form_1");

// Creates a new one-dimensional array
SAFEARRAY *psaStrings = SafeArrayCreateVector(VT_VARIANT, 0, 1);
if (psaStrings == NULL) {

    return;
}

VARIANT *param;
HRESULT hresult = SafeArrayAccessData(psaStrings, (LPVOID*)&param);
param->vt = VT_BSTR;
param->bstrVal = strSummaryText;

hresult = SafeArrayUnaccessData(psaStrings);
//it will write the div part of tab_form_1 into new document to pass the summary contents alone to the printer
hresult = pNewDoc->write(psaStrings);


// SafeArrayDestroy calls SysFreeString for each strtemp
if (psaStrings != NULL) {
    SafeArrayDestroy(psaStrings);
}
...