#c #internet-explorer #mfc #com #webbrowser-control
#c #internet-explorer #mfc #com #webbrowser-control
Вопрос:
Я использую элемент управления WebBrowser в моем окне MFC на основе CDialog. Окно разрешает печать, используя код, подобный этому:
CComPtr<IWebBrowser2> pWebBrowser = this->GetIWebBrowser2();
if(pWebBrowser)
{
HRESULT hr;
COleVariant varNull;
if(SUCCEEDED(hr = pWebBrowser->ExecWB(
bDoPreview ? OLECMDID_PRINTPREVIEW : OLECMDID_PRINT,
OLECMDEXECOPT_PROMPTUSER, varNull, varNull)))
{
//All good
bRes = TRUE;
}
}
IWebBrowser2* GetIWebBrowser2()
{
IWebBrowser2* pBrowser = NULL;
LPUNKNOWN unknown = m_browser.GetControlUnknown();
if(unknown)
{
unknown->QueryInterface(IID_IWebBrowser2,(void **)amp;pBrowser);
if(unknown)
{
unknown->Release();
}
}
return pBrowser;
}
Это работает, за исключением того, что, если документ достаточно большой, pWebBrowser->ExecWB()
кажется, что он сразу возвращается, и вся печать выполняется асинхронно. Итак, в этом случае, если пользователь закрывает мое окно (в котором находится этот элемент управления WebBrowser), печать прерывается на полпути.
Таким образом, мой вопрос, как мне дождаться завершения печати, прежде чем я смогу разрешить закрытие окна хоста?
Комментарии:
1. Хорошо, кому интересно, я нашел решение. Вот старый проект , который покажет это в действии. По сути, вам нужно перехватить
DISPID_PRINTTEMPLATETEARDOWN
событие (состоящее из 226 знаков после запятой) в вашемBEGIN_EVENTSINK_MAP
, которое будет переданоWebBrowser
элементом управления, когда задание печати будет завершено или отменено.2. Почему бы вам не конкретизировать ответ?