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

yehao's Blog

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

目錄(?)[-]

  1. 僅僅用于Internet Explorer的事件
  2. 自ActiveX控件中控制Internet Explorer 事件

僅僅用于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 2012-09-22 21:59 厚積薄發 閱讀(590) 評論(0)  編輯 收藏 引用 所屬分類: Windows編程

導航

<2025年11月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456

統計

常用鏈接

留言簿

隨筆分類

文章分類

文章檔案

搜索

最新評論

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            黄色一区二区在线| 国产欧美在线看| 亚洲第一天堂无码专区| 欧美在线一二三四区| 亚洲欧美春色| 国产一区二区三区久久| 牛牛国产精品| 欧美极品aⅴ影院| 亚洲视频在线播放| 亚洲欧美国产另类| 一区二区三区在线观看欧美| 欧美护士18xxxxhd| 欧美午夜精品久久久久久孕妇| 亚洲一区免费视频| 久久精品国产亚洲高清剧情介绍| 揄拍成人国产精品视频| 亚洲国产精品精华液2区45| 欧美日韩国产美女| 欧美一区二区三区视频在线观看| 久久久久久有精品国产| 日韩亚洲一区在线播放| 午夜精品国产| 亚洲激情在线视频| 亚洲一区二区少妇| 91久久精品一区二区别| 中文精品一区二区三区| 亚洲成色999久久网站| 日韩亚洲欧美精品| 一区二区三区在线视频播放| 亚洲精品国产精品乱码不99| 国产无一区二区| 最新中文字幕一区二区三区| 国产亚洲欧美一区二区三区| 亚洲片在线观看| 国语自产精品视频在线看| 亚洲精品一区二区在线| 国产日韩欧美三区| 99re热这里只有精品视频| 又紧又大又爽精品一区二区| 中日韩高清电影网| 亚洲破处大片| 久久精品国产亚洲精品| 亚洲欧美日本日韩| 欧美激情成人在线视频| 老牛国产精品一区的观看方式| 欧美日韩在线综合| 亚洲激情国产| 狠狠综合久久av一区二区老牛| 亚洲图片在区色| 99re成人精品视频| 欧美va天堂va视频va在线| 久久精品国产综合精品| 国产精品毛片在线| 一本色道婷婷久久欧美| 亚洲免费成人| 欧美成人69av| 亚洲国产一区二区精品专区| 一区免费观看视频| 久久精品国产77777蜜臀| 欧美伊人久久久久久午夜久久久久| 欧美日韩亚洲一区在线观看| 亚洲日本在线视频观看| 亚洲人成在线播放| 男同欧美伦乱| 亚洲国产美女久久久久| 亚洲精品欧美精品| 欧美高清影院| 亚洲精品久久久久| 日韩天堂在线观看| 欧美日韩你懂的| 99国产精品私拍| 亚洲女性裸体视频| 国产精品视频一二| 香蕉亚洲视频| 久久乐国产精品| 亚洲国产91精品在线观看| 裸体一区二区三区| 亚洲激情另类| 亚洲一卡久久| 国产精品揄拍500视频| 午夜在线观看免费一区| 玖玖玖国产精品| 亚洲欧洲精品一区二区三区不卡 | 亚洲色图自拍| 亚洲欧美不卡| 国产一区二区三区黄视频| 久久国产精品久久久久久久久久 | 久久中文字幕一区| 最新高清无码专区| 欧美性猛交xxxx免费看久久久| 亚洲网站在线观看| 狼人社综合社区| 亚洲最新色图| 国产欧美日韩麻豆91| 久久久综合免费视频| 日韩视频在线免费观看| 久久国产视频网| 亚洲三级电影全部在线观看高清| 欧美日韩一区二区精品| 久久狠狠久久综合桃花| 亚洲国产精品成人久久综合一区| 亚洲一区图片| 永久域名在线精品| 国产精品第一区| 久久免费视频在线观看| 99亚洲伊人久久精品影院红桃| 久久久精品tv| 亚洲无线一线二线三线区别av| 国产一二精品视频| 欧美日韩中文在线观看| 久久久噜噜噜久久久| 这里是久久伊人| 欧美激情视频一区二区三区免费| 亚洲一区二区视频在线观看| 永久555www成人免费| 国产精品美女www爽爽爽视频| 久久综合999| 午夜精品剧场| 99这里只有精品| 欧美国产一区二区在线观看| 久久国产精品久久w女人spa| 一本久久知道综合久久| 影音先锋亚洲电影| 国产日产欧产精品推荐色| 欧美日韩视频一区二区| 免费观看在线综合色| 久久国产精品亚洲77777| 亚洲在线一区二区| 日韩一区二区免费高清| 亚洲黄色成人久久久| 久久视频免费观看| 欧美中文字幕在线播放| 亚洲一区黄色| 亚洲无线一线二线三线区别av| 亚洲精品自在久久| 亚洲黄色一区| 亚洲国产裸拍裸体视频在线观看乱了中文| 国产精品一区二区久久国产| 国产精品久久久| 欧美日韩一区二区国产| 欧美日韩免费网站| 欧美日韩成人一区二区| 欧美久久一区| 欧美日韩免费一区| 欧美肉体xxxx裸体137大胆| 欧美人体xx| 欧美视频精品一区| 国产精品多人| 国产欧美日韩亚洲一区二区三区| 国产精品久久久99| 国产精品一区二区在线观看| 国产麻豆日韩欧美久久| 国产亚洲一区二区三区| 国外成人在线视频网站| 伊人久久综合97精品| 亚洲国产日韩欧美综合久久 | 国产精品久久久久秋霞鲁丝| 国产精品国产福利国产秒拍| 国产精品久久久久久影视| 国产精品美女久久久久久免费| 国产精品伦一区| 国产亚洲精品自拍| 一区二区三区在线观看欧美| 91久久精品一区| 一区二区三区四区五区视频| 亚洲一区二区三区久久| 欧美在线一级va免费观看| 久久嫩草精品久久久精品| 欧美成人激情视频免费观看| 亚洲国产三级网| 亚洲小说欧美另类婷婷| 久久国产精品99国产精| 免费的成人av| 国产精品久久午夜| 激情综合亚洲| 一区二区三区 在线观看视频| 亚洲欧美在线观看| 欧美成人国产| 亚洲午夜精品久久| 久久这里有精品视频| 国产精品成人观看视频国产奇米| 国产视频一区三区| a4yy欧美一区二区三区| 久久爱www.| 亚洲精品国产精品国产自| 午夜视频在线观看一区二区| 欧美福利小视频| 国产亚洲欧美日韩精品| 99精品欧美一区| 久久久久久久久久久久久久一区| 亚洲黄色在线视频| 欧美一区二区三区免费观看视频| 欧美成人三级在线| 国产曰批免费观看久久久| 一区二区三区欧美在线| 欧美成人嫩草网站| 欧美一区在线视频| 欧美性做爰毛片| 亚洲精品美女在线| 老牛国产精品一区的观看方式|