• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            牽著老婆滿街逛

            嚴(yán)以律己,寬以待人. 三思而后行.
            GMail/GTalk: yanglinbo#google.com;
            MSN/Email: tx7do#yahoo.com.cn;
            QQ: 3 0 3 3 9 6 9 2 0 .

            如何對webbrowser和IE編程(十一)

            僅僅用于Internet Explorer的事件

            有些是僅僅可用于自動化 Internet Explorer,:

            ·???????? OnQuit

            • OnVisible
            • OnToolBar
            • OnMenuBar
            • OnStatusBar
            • OnFullScreen
            • OnTheaterMode

            大多數(shù)這些事件屬于瀏覽器用戶接口. 另外一些必須要先是或者關(guān)閉Internet Explorer才發(fā)生. 一些情形中,這些事件將在你宿主webbrowser空間的時候發(fā)生. 舉例來講,當(dāng)你在你的應(yīng)用程序設(shè)置MenuBar 屬性,盡管你的WebBrowser control 并沒有菜單條, OnMenuBar 事件將被激發(fā), 但是如果你顯示或者隱藏你的應(yīng)用程序菜單條,OnMenuBar 事件不會激發(fā).為什么?因為你的菜單條由你控制,webbrowser對這些用戶接口項一無所知. 很長時間以來,這些相互矛盾的功能是一些混亂的根源。

            其中一個事件OnQuit—將永遠(yuǎn)不會在你的應(yīng)用程序中激發(fā).舉個例子, 察看表 Table 7-6. 注意到OnQuit 事件當(dāng)用戶關(guān)閉 Internet Explorer 或者當(dāng)Quit 方法被調(diào)用時激發(fā).如果你宿主改控件且用戶關(guān)閉你的應(yīng)用程序,? OnQuit 事件不會激發(fā).它僅僅在你自動化Internet Explorer 且用戶手動關(guān)閉瀏覽器時候發(fā)生.另外,如果你在宿主一個webbrowser控件時試圖調(diào)用Quit 方法,一個自動化錯誤將會發(fā)生.

            ActiveX控件中控制Internet Explorer 事件

            通過 IWebBrowser2 接口你可以在利用vc++在ActiveX 控件中接受事件.

            你可能疑惑為什么要在ActiveX控件中接受 Internet Explorer事件.之前介紹"DocumentComplete," 事件時候,我提到過你不可以在DocumentComplete event 事件被觸發(fā)前安全存取文檔.在Activex控件中獲知DocumentComplete 事件被觸發(fā)的途徑是ActiveX 控件接收 Internet Explorer并處理 DocumentComplete 事件.

            除了你必須接收Internet Explorer 事件外, 你可以開發(fā)一個可導(dǎo)航的類瀏覽器的應(yīng)用于公司intranet或者學(xué)校網(wǎng)絡(luò).你可以在ActiveX control中自動化Internet Explorer并接受其事件。.

            當(dāng)你刷新一個頁面 , 也許 DocumentComplete 事件并不激發(fā) . 當(dāng) DocumentComplete 事件并未觸發(fā) ,? ProgressChange 事件被用來控制以檢測某頁是否完成加載 . 載一個簡單的 web 頁或者沒有嵌入幀時 ProgressChange 工作的很好 .

            記住 ProgressChange 右兩個參數(shù)告訴你下載操作的進度.第一個參數(shù)當(dāng)下在完成時候設(shè)定為-1, 者可以幫助你檢測是否可做類打印等操作

            讓我們學(xué)習(xí)一個打印控active控件,為從Internet Explorer接收事件,你必須設(shè)置事件接收,意味著你必須通過IWebBrowser2 ?接口以獲得實現(xiàn),如下實現(xiàn):

            												
            														protected:
            												
            										
            												
            														
            																
            																		?? CComPtr<IWebBrowser2> m_spWebBrowser;
            														
            												
            										

            .

            接下來覆蓋IOleObjectImpl 的SetClientSite方法的實現(xiàn). SetClientSite 放方法是在Internet Explorer通知氣客戶區(qū)的控件的時候被調(diào)用.你可用客戶區(qū)的site指針 (m_spClientSite) 存取容器并且得到IWebBrowser2 接口指針. 在SetClientSite 實現(xiàn)中, 你必須首先調(diào)用其基類版本,就想如下:

            												
            														IOleObjectImpl<CPrintCtl>::SetClientSite(pClientSite);
            												
            										

            這些帶嗎看起來可能有些生疏, 但記住 IOleObjectImpl 是一個模版類. 為了調(diào)用它的方法, 你必須制定要求的模版參數(shù)以指示編譯器哪一個類實例在調(diào)用SetClientSite 方法時被使用. 現(xiàn)在講殘存的訪問容器和IWebBrowser2接口指針的代碼從Print方法遷移到SetClientSite 方法Now move the remaining code Print 方法將看起來如下:

            												
            														STDMETHODIMP CPrintCtl::Print()
            												
            										
            												
            														{
            												
            										
            												
            														
            																
            																		?? ATLASSERT(m_spWebBrowser);
            														
            												
            										
            												
            														
            																?

            												
            														
            																
            																		?? HRESULT hr = E_FAIL;
            														
            												
            										
            												
            														
            																?

            												
            														
            																
            																		?? if (m_spWebBrowser)
            														
            												
            										
            												
            														
            																
            																		?? {
            														
            												
            										
            												
            														
            																
            																		????? hr = m_spWebBrowser->ExecWB(OLECMDID_PRINT, 
            														
            												
            										
            												
            														
            																
            																		?????????????????????????
            																		?????????OLECMDEXECOPT_PROMPTUSER, NULL, NULL);
            														
            												
            										
            												
            														
            																
            																		?? }
            														
            												
            										
            												
            														
            																?

            												
            														
            																
            																		?? return hr;
            														
            												
            										
            												
            														}
            												
            										

            SetClientSite 方法將接收事件,SetClientSite 講看起來如下:

            注意


            你不能夠再 FinalConstruct m 方法中接收事件因為此時客戶站點還未設(shè)定。

            												
            														STDMETHODIMP CPrintCtl::SetClientSite(IOleClientSite* pClientSite)
            												
            										
            												
            														{
            												
            										
            												
            														
            																
            																		?? HRESULT hr = IOleObjectImpl<CPrintCtl>::SetClientSite(pClientSite);
            														
            												
            										
            												
            														
            																?

            												
            														
            																
            																		?? if (!pClientSite)
            														
            												
            										
            												
            														
            																
            																		?? {
            														
            												
            										
            												
            														
            																
            																		????? return hr;
            														
            												
            										
            												
            														
            																
            																		?? }
            														
            												
            										
            												
            														
            																?

            												
            														
            																
            																		?? CComPtr<IOleContainer> spContainer;
            														
            												
            										
            												
            														
            																
            																		?? m_spClientSite->GetContainer(&spContainer);
            														
            												
            										
            												
            														
            																?

            												
            														
            																
            																		?? ATLASSERT(spContainer);
            														
            												
            										
            												
            														
            																?

            												
            														
            																
            																		?? if (SUCCEEDED(hr))
            														
            												
            										
            												
            														
            																
            																		?? {
            														
            												
            										
            												
            														
            																
            																		????? // Set up the event sink.
            														
            												
            										
            												
            														
            																
            																		????? //
            														
            												
            										
            												
            														
            																
            																		????? CComQIPtr<IServiceProvider, &IID_IServiceProvider>
            														
            												
            										
            												
            														
            																
            																		???????? spServiceProvider(spContainer);
            														
            												
            										
            												
            														
            																?

            												
            														
            																
            																		????? ATLASSERT(spServiceProvider);
            														
            												
            										
            												
            														
            																?

            												
            														
            																
            																		????? if (spServiceProvider)
            														
            												
            										
            												
            														
            																
            																		????? {
            														
            												
            										
            												
            														
            																
            																		???????? spServiceProvider->QueryService(SID_SInternetExplorer,
            														
            												
            										
            												
            														
            																
            																		???????????????????????????????????????? IID_IWebBrowser2,
            														
            												
            										
            												
            														
            																
            																		???????????????????????????????????????? (void**)&m_spWebBrowser);
            														
            												
            										
            												
            														
            																
            																		???????? ATLASSERT(m_spWebBrowser);
            														
            												
            										
            												
            														
            																?

            												
            														
            																
            																		???????? if (m_spWebBrowser)
            														
            												
            										
            												
            														
            																
            																		???????? {
            														
            												
            										
            												
            														
            																
            																		??????????? AtlAdvise(m_spWebBrowser, GetUnknown(),
            														
            												
            										
            												
            														
            																
            																		????????????????????? DIID_DWebBrowserEvents2, &m_dwCookie);
            														
            												
            										
            												
            														
            																
            																		???????? }
            														
            												
            										
            												
            														
            																
            																		????? }
            														
            												
            										
            												
            														
            																
            																		?? }
            														
            												
            										
            												
            														
            																?

            												
            														
            																
            																		?? return hr;
            														
            												
            										
            												
            														}
            												
            										

            注意到在AtlAdvise 調(diào)用時你必須建立protected 或者private DWORD的數(shù)據(jù)成員以掌握返回自AtlAdvise 方法的cookie. CprintCtl 類的構(gòu)造函數(shù)初始化改成員為0.盡管我們注意到CPrintCtl::SetClientSite 方法使用IOleObjectImpl::SetClientSite 方法的返回值. 此方法并不檢查已被調(diào)用的返回值因為CPrintCtl::SetClientSi將 反射客戶站點的設(shè)定狀態(tài).

            最好, 我們檢查pClientSite 的返回值,輸入?yún)?shù)是NULL. 如果這樣,我們當(dāng)Internet Explorer 卸載這些控時, 他調(diào)用SetClientSite w設(shè)置為NULL. 或者告訴你已經(jīng)從站點解除, 所以包含一個接口, IWebBrowser2 容器不需要一定執(zhí)行。.

            因為當(dāng)你完成任務(wù)時應(yīng)當(dāng)關(guān)閉任務(wù)的站點, 也包含某個控件被卸載時。檢查pClientSite 是否為NULL,以便放置AtlUnadvise 方法. 記住pClientSite在控件被卸載時為 NULL. 看起來如下:

            												
            														if (!pClientSite)
            												
            										
            												
            														{
            												
            										
            												
            														
            																
            																		?? ATLASSERT(m_spWebBrowser);
            														
            												
            										
            												
            														
            																?

            												
            														
            																
            																		?? if (m_spWebBrowser)
            														
            												
            										
            												
            														
            																
            																		????? AtlUnadvise(m_spWebBrowser, DIID_DWebBrowserEvents2, m_dwCookie);
            														
            												
            										
            												
            														
            																?

            												
            														
            																
            																		?? return hr;
            														
            												
            										
            												
            														}
            												
            										

            現(xiàn)在你可以使用AtlAdvise接收事件,讓我們控制事件.為此你必須覆蓋重寫IDispatchImpl 的Invoke 方法. 典型的,你將為你的時間建立一個單獨的類因為 Internet Explorer 事件的DISPIDs 必須同你的控件的DISPIDs 不同.但在此你可以簡單在 CPrintCtl ?類中來實現(xiàn).實現(xiàn)Invoke (入代碼所示)以控制ProgressChange 事件.在事件句柄, 如果progres的總數(shù)設(shè)定為 -1,設(shè)定一個標(biāo)志變量指示已被打印.

            ?

            												
            														STDMETHODIMP CPrintCtl::Invoke(DISPID dispidMember, 
            												
            										
            												
            														
            																
            																		???????????????????????????????REFIID riid, 
            														
            												
            										
            												
            														
            																
            																		???????????????????????????????LCID lcid,
            														
            												
            										
            												
            														
            																
            																		?????????????????????????????? WORD wFlags, 
            														
            												
            										
            												
            														
            																
            																		???????????????????????????????DISPPARAMS* pDispParams, 
            														
            												
            										
            												
            														
            																
            																		???????????????????????????????VARIANT* pvarResult, 
            														
            												
            										
            												
            														
            																
            																		???????????????????????????????EXCEPINFO* pExcepInfo,
            														
            												
            										
            												
            														
            																
            																		?????????????????????????????? UINT* puArgErr)
            														
            												
            										
            												
            														{
            												
            										
            												
            														
            																
            																		?? if (riid != IID_NULL)
            														
            												
            										
            												
            														
            																
            																		????? return DISP_E_UNKNOWNINTERFACE;
            														
            												
            										
            												
            														
            																?

            												
            														
            																
            																		?? if (!pDispParams)
            														
            												
            										
            												
            														
            																
            																		????? return DISP_E_PARAMNOTOPTIONAL;
            														
            												
            										
            												
            														
            																?

            												
            														
            																
            																		?? switch (dispidMember)
            														
            												
            										
            												
            														
            																
            																		?? {
            														
            												
            										
            												
            														
            																
            																		????? //
            														
            												
            										
            												
            														
            																
            																		????? // The parameters for this DISPID:
            														
            												
            										
            												
            														
            																
            																		????? // [0]: Maximum progress - VT_I4
            														
            												
            										
            												
            														
            																?????// [1]: Amount of total progress - VT_I4
            												
            										
            												
            														
            																
            																		????? //
            														
            												
            										
            												
            														
            																
            																		????? case DISPID_PROGRESSCHANGE:
            														
            												
            										
            												
            														
            																
            																		???????? if (pDispParams->cArgs != 0)
            														
            												
            										
            												
            														
            																
            																		???????? {
            														
            												
            										
            												
            														
            																
            																		??????????? // Make sure that you access the
            														
            												
            										
            												
            														
            																
            																		??????????? // correct data member of the rgvarg array.
            														
            												
            										
            												
            														
            																
            																		??????????? // To do this, check the type of data to
            														
            												
            										
            												
            														
            																
            																		??????????? // make sure it is correct.
            														
            												
            										
            												
            														
            																
            																		??????????? //
            														
            												
            										
            												
            														
            																
            																		??????????? if (pDispParams->cArgs > 1
            														
            												
            										
            												
            														
            																
            																		?????????????? && pDispParams->rgvarg[1].vt == VT_I4
            														
            												
            										
            												
            														
            																
            																		?????????????? && pDispParams->rgvarg[0].vt == VT_I4)
            														
            												
            										
            												
            														
            																
            																		??????????? {
            														
            												
            										
            												
            														
            																
            																		???? 
            																		??????????if (-1 == pDispParams->rgvarg[1].lVal)
            														
            												
            										
            												
            														
            																
            																		????????????????? m_fCanBePrinted = TRUE;
            														
            												
            										
            												
            														
            																
            																		??????????? }
            														
            												
            										
            												
            														
            																
            																		???????? }
            														
            												
            										
            												
            														
            																?

            												
            														
            																
            																		???????? break;
            														
            												
            										
            												
            														
            																?

            												
            														
            																
            																		????? default:
            														
            												
            										
            												
            														
            																
            																		???????? // Call the base class implementation of Invoke
            														
            												
            										
            												
            														
            																
            																		???????? // so that IPrintCtl methods and properties will
            														
            												
            										
            												
            														
            																
            																		???????? // work correctly.
            														
            												
            										
            												
            														
            																
            																		???????? //
            														
            												
            										
            												
            														
            																
            																		???????? IDispatchImpl<IPrintCtl, &IID_IPrintCtl, 
            														
            												
            										
            												
            														
            																
            																		????????????&LIBID_ATLPRINTLib>::Invoke(dispidMember, riid, lcid,
            														
            												
            										
            												
            														
            																
            																		??????????????????????????????????????? wFlags, pDispParams,
            														
            												
            										
            												
            														
            																
            																		????????????????????????????? 
            																		??????????pvarResult, pExcepInfo, puArgErr);
            														
            												
            										
            												
            														
            																?

            												
            														
            																
            																		???????? break;
            														
            												
            										
            												
            														
            																
            																		?? }
            														
            												
            										
            												
            														
            																?

            												
            														
            																
            																		?? return S_OK;
            														
            												
            										
            												
            														}
            												
            										

            ProgressChange 事件處理中,當(dāng)Progress 參數(shù)(pDispParams->rgvarg[1].lVal) 是-1, 我們設(shè)置一個變量告訴控件問打光在完成可以打印. FCanBePrinted 就是我們要設(shè)定的變量。

            現(xiàn)在當(dāng)用戶試圖調(diào)用Print 方法打印文檔,你可以檢查變量以確定是否可打印. 此處為 Print 方法的代碼:

            												
            														STDMETHODIMP CPrintCtl::Print()
            												
            										
            												
            														{
            												
            										
            												
            														
            																
            																		?? if (!m_fCanBePrinted)
            														
            												
            										
            												
            														
            																
            																		?? {
            														
            												
            										
            												
            														
            																
            																		????? ::MessageBox(NULL, _T("The page is not ready to be printed."),
            														
            												
            										
            												
            														
            																
            																		?????????????????? _T("PrintCtl"), MB_OK);
            														
            												
            										
            												
            														
            																
            																		????? return E_FAIL;
            														
            												
            										
            												
            														
            																
            																		?? }
            														
            												
            										
            												
            														
            																?

            												
            														
            																
            																		?? ATLASSERT(m_spWebBrowser);
            														
            												
            										
            												
            														
            																?

            												
            														
            																
            																		?? HRESULT hr = E_FAIL;
            														
            												
            										
            												
            														
            																?

            												
            														
            																
            																		?? if (m_spWebBrowser)
            														
            												
            										
            												
            														
            																
            																		?? {
            														
            												
            										
            												
            														
            																
            																		????? hr = m_spWebBrowser->ExecWB(OLECMDID_PRINT, 
            														
            												
            										
            												
            														
            																
            																		??????????????????????????????????OLECMDEXECOPT_PROMPTUSER, NULL, NULL);
            														
            												
            										
            												
            														
            																
            																		?? }
            														
            												
            										
            												
            														
            																?

            												
            														
            																
            																		?? return hr;
            														
            												
            										
            												
            														}
            												
            										

            posted on 2006-06-23 21:46 楊粼波 閱讀(2421) 評論(0)  編輯 收藏 引用 所屬分類: Windows編程

            亚洲美日韩Av中文字幕无码久久久妻妇| 久久国产精品二国产精品| 亚洲国产欧洲综合997久久| 色欲久久久天天天综合网| 99久久国产热无码精品免费| 久久99精品国产麻豆蜜芽| 国产成人精品综合久久久久| 久久精品草草草| 亚洲精品乱码久久久久久久久久久久 | 亚洲av成人无码久久精品| 久久久中文字幕| 99久久这里只精品国产免费| 国产99久久精品一区二区| 免费精品久久久久久中文字幕| 久久精品aⅴ无码中文字字幕不卡 久久精品aⅴ无码中文字字幕重口 | 女人香蕉久久**毛片精品| 欧美伊人久久大香线蕉综合| 色噜噜狠狠先锋影音久久| 久久精品国产亚洲77777| 欧美精品九九99久久在观看| 青青青青久久精品国产| 久久精品欧美日韩精品| 麻豆成人久久精品二区三区免费 | 久久精品9988| 国产综合久久久久| 久久亚洲精品人成综合网| 精品伊人久久大线蕉色首页| 免费一级欧美大片久久网| 久久人人爽人爽人人爽av| 国内精品久久久久久久久电影网| 91精品国产高清91久久久久久| 亚洲国产另类久久久精品黑人| 久久久久亚洲AV综合波多野结衣| 丁香五月综合久久激情| 91精品无码久久久久久五月天| 亚洲国产成人久久综合碰碰动漫3d| 97久久久久人妻精品专区| 久久无码av三级| 久久精品无码av| 久久无码一区二区三区少妇 | 国产99久久久国产精品小说|