青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

牽著老婆滿街逛

嚴以律己,寬以待人. 三思而后行.
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

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

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

ActiveX控件中控制Internet Explorer 事件

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

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

除了你必須接收Internet Explorer 事件外, 你可以開發一個可導航的類瀏覽器的應用于公司intranet或者學校網絡.你可以在ActiveX control中自動化Internet Explorer并接受其事件。.

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

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

讓我們學習一個打印控active控件,為從Internet Explorer接收事件,你必須設置事件接收,意味著你必須通過IWebBrowser2 ?接口以獲得實現,如下實現:

												
														protected:
												
										
												
														
																
																		?? CComPtr<IWebBrowser2> m_spWebBrowser;
														
												
										

.

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

												
														IOleObjectImpl<CPrintCtl>::SetClientSite(pClientSite);
												
										

這些帶嗎看起來可能有些生疏, 但記住 IOleObjectImpl 是一個模版類. 為了調用它的方法, 你必須制定要求的模版參數以指示編譯器哪一個類實例在調用SetClientSite 方法時被使用. 現在講殘存的訪問容器和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 方法中接收事件因為此時客戶站點還未設定。

												
														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 調用時你必須建立protected 或者private DWORD的數據成員以掌握返回自AtlAdvise 方法的cookie. CprintCtl 類的構造函數初始化改成員為0.盡管我們注意到CPrintCtl::SetClientSite 方法使用IOleObjectImpl::SetClientSite 方法的返回值. 此方法并不檢查已被調用的返回值因為CPrintCtl::SetClientSi將 反射客戶站點的設定狀態.

最好, 我們檢查pClientSite 的返回值,輸入參數是NULL. 如果這樣,我們當Internet Explorer 卸載這些控時, 他調用SetClientSite w設置為NULL. 或者告訴你已經從站點解除, 所以包含一個接口, IWebBrowser2 容器不需要一定執行。.

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

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

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

												
														
																
																		?? return hr;
														
												
										
												
														}
												
										

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

?

												
														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 事件處理中,當Progress 參數(pDispParams->rgvarg[1].lVal) 是-1, 我們設置一個變量告訴控件問打光在完成可以打印. FCanBePrinted 就是我們要設定的變量。

現在當用戶試圖調用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 楊粼波 閱讀(2431) 評論(0)  編輯 收藏 引用 所屬分類: Windows編程

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            久久精品国产精品亚洲综合| 亚洲国产精品久久久久秋霞不卡| 99在线视频精品| 美腿丝袜亚洲色图| 久热精品视频在线| 久久久av水蜜桃| 牛人盗摄一区二区三区视频| 久久精品视频免费观看| 午夜精品偷拍| 久久亚洲图片| 亚洲人体影院| 欧美一区二区三区男人的天堂| 一色屋精品亚洲香蕉网站| 国产精品你懂的在线| 性做久久久久久免费观看欧美| 欧美一区二区在线视频| 欧美中文在线字幕| 欧美另类在线观看| 欧美涩涩网站| 国产精品欧美日韩久久| 亚洲风情在线资源站| 亚洲精品日日夜夜| 性欧美在线看片a免费观看| 久久国产精品久久久久久| 久久久九九九九| 日韩视频一区二区在线观看| 亚洲在线观看| 亚洲欧美日韩一区在线| 久久久xxx| 欧美日韩成人| 在线激情影院一区| 中文高清一区| 欧美成人国产一区二区| 国产日韩免费| 亚洲人精品午夜在线观看| 久久精品一区二区国产| 亚洲国产精品国自产拍av秋霞| 夜夜嗨av一区二区三区中文字幕| 亚洲欧美在线高清| 免费欧美在线视频| 国产精品亚洲а∨天堂免在线| 狠狠做深爱婷婷久久综合一区| 亚洲综合视频1区| 欧美成人国产va精品日本一级| 一区二区三区成人精品| 久久久免费精品视频| 欧美日韩一区二区三区高清| 亚洲国产裸拍裸体视频在线观看乱了中文 | 久久精品99国产精品日本| 久久免费精品视频| 亚洲免费在线视频| 玖玖玖国产精品| 欧美日韩精品系列| 日韩亚洲在线| 麻豆亚洲精品| 久久嫩草精品久久久精品| 国产精品v欧美精品∨日韩| 激情久久一区| 欧美v亚洲v综合ⅴ国产v| 亚洲免费婷婷| 国产亚洲欧美一区在线观看| 欧美极品一区二区三区| 亚洲一区亚洲| 国产精品久久影院| 99视频在线精品国自产拍免费观看| 欧美不卡福利| 久久久青草婷婷精品综合日韩| 久久免费少妇高潮久久精品99| 国产一区二区三区电影在线观看| 亚洲视频在线观看免费| 一区二区三区视频在线播放| 欧美激情一区二区三区蜜桃视频| 亚洲三级观看| 亚洲精品1区2区| 欧美人与性禽动交情品 | 六月天综合网| 午夜影院日韩| 激情久久久久| 久久久久久国产精品mv| 午夜久久一区| 国产一区二区主播在线| 最新中文字幕一区二区三区| 亚洲精品久久久久久久久久久久| 老牛国产精品一区的观看方式| 亚洲国产精品ⅴa在线观看| 麻豆精品传媒视频| 欧美乱人伦中文字幕在线| 亚洲精选91| 亚洲一区二区在线免费观看视频 | 一区二区三区日韩欧美| 亚洲乱码精品一二三四区日韩在线 | 国产三区精品| 毛片精品免费在线观看| 久久久精品性| 一区二区欧美亚洲| 一区二区三区视频观看| 韩国一区二区三区在线观看| 乱人伦精品视频在线观看| 久久久久高清| 午夜精品久久久久久久久久久 | 亚洲欧美日韩综合aⅴ视频| 一区二区三区在线免费播放| 欧美国产91| 国产日韩欧美不卡在线| 美女精品自拍一二三四| 国产精品久久7| 久久精品二区亚洲w码| 欧美激情一级片一区二区| 亚洲男女自偷自拍图片另类| 亚洲精品一区二区三| 国产亚洲一区在线| 欧美激情精品久久久久久黑人| 国产精品欧美日韩一区| 欧美高清免费| 国产一区二区三区无遮挡| 国产精品盗摄一区二区三区| 亚洲精品乱码久久久久久黑人 | 欧美成人激情视频免费观看| 欧美高清自拍一区| 99在线|亚洲一区二区| 亚洲一区日韩在线| 9国产精品视频| 久久精品人人做人人综合 | 欧美午夜视频在线| 欧美激情一区二区三区高清视频| 国产精品a级| 日韩视频在线你懂得| 狠狠色狠狠色综合日日tαg| 亚洲一区二区三区免费观看 | 亚洲国产精品国自产拍av秋霞| 91久久夜色精品国产网站| 国产一区二区三区直播精品电影| 亚洲黄色一区| 日韩天堂在线观看| 久久av二区| 麻豆国产va免费精品高清在线| 国产伦精品一区| 亚洲一区二区三区精品在线| 亚洲精品在线观| 欧美激情视频一区二区三区在线播放 | 国产日本欧洲亚洲| 99国产成+人+综合+亚洲欧美| 亚洲精品系列| 久久久久五月天| 欧美 日韩 国产在线| 国内视频一区| 亚洲视频中文字幕| 欧美一区影院| 国产精品另类一区| 午夜天堂精品久久久久| 亚洲欧美日韩国产综合| 国产美女精品人人做人人爽| 亚洲精品小视频在线观看| 亚洲一区精品电影| 欧美日韩高清在线播放| 免费欧美在线视频| 国产精品videosex极品| 嫩草伊人久久精品少妇av杨幂| 国内一区二区三区在线视频| 欧美一区二区三区免费看 | 欧美va天堂在线| 91久久夜色精品国产网站| 亚洲精品一区二区三区99| 欧美精品一线| 亚洲精品在线免费观看视频| 狠狠色狠狠色综合日日小说| 欧美成人精品一区二区三区| 欧美激情精品久久久久久久变态| 亚洲视频二区| 国产精品免费看片| 亚洲黄色一区| 国产一区二区高清| 欧美亚洲日本一区| 亚洲国产精品激情在线观看| 一区二区日本视频| 一区二区三区中文在线观看| 欧美大片免费看| 欧美一区二区三区日韩| 欧美成人影音| 亚洲激情综合| 国产精品一区二区你懂的| 久久精品国产99国产精品澳门| 亚洲二区在线视频| 亚洲永久在线观看| 精品999网站| 欧美激情综合在线| 欧美一区在线视频| 亚洲福利电影| 亚洲裸体在线观看| 黑人极品videos精品欧美裸| 欧美jizzhd精品欧美巨大免费| 新狼窝色av性久久久久久| 欧美电影免费网站| 亚洲欧美日韩直播| 国产精品老牛| 欧美四级剧情无删版影片| 亚洲中字在线| 在线午夜精品| 欧美成人高清视频| 久久精品亚洲一区二区|