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

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>
            亚洲综合不卡| 亚洲已满18点击进入久久| 在线看片欧美| 一区精品在线播放| 亚洲国产第一页| 亚洲精品一区二区三| 亚洲精品极品| 亚洲视频网站在线观看| 亚洲女同精品视频| 9l视频自拍蝌蚪9l视频成人| 亚洲视频每日更新| 欧美一级理论性理论a| 欧美一区二区三区在线观看视频 | 国产精品人人爽人人做我的可爱| 欧美 日韩 国产 一区| 欧美成人精品| 欧美巨乳在线观看| 久久久久久久成人| 久久五月婷婷丁香社区| 欧美大片在线看| 日韩视频精品在线观看| 亚洲欧美日韩一区二区在线| 免费观看成人www动漫视频| 欧美色网一区二区| 伊人成人在线| 亚洲一区二区三区三| 久久综合伊人77777尤物| 亚洲福利在线视频| 亚洲美女淫视频| 久久精品国产一区二区三| 欧美—级a级欧美特级ar全黄| 国产视频在线一区二区| 一区二区欧美日韩| 免费日韩视频| 亚洲影视在线播放| 欧美电影在线免费观看网站| 国产真实乱子伦精品视频| 亚洲影音一区| 亚洲高清三级视频| 久久精品中文| 国产日韩欧美一区| 亚洲欧美日韩一区二区三区在线观看| 欧美国产视频在线| 欧美一区二区在线| 国产精品美女黄网| 亚洲午夜激情免费视频| 在线观看三级视频欧美| 这里只有精品在线播放| 国产精品三级视频| 亚洲精品女av网站| 欧美 日韩 国产精品免费观看| 亚洲一区二区免费看| 欧美日韩免费观看一区二区三区| 亚洲第一页中文字幕| 久久久久久有精品国产| 欧美一区二区三区视频| 国产欧美精品在线| 午夜精品视频网站| 亚洲视频免费在线观看| 欧美日韩三级视频| 亚洲视频狠狠| 中文欧美在线视频| 国产精品久久久久久超碰| 一区二区三区免费观看| 99精品视频网| 欧美区在线观看| 亚洲视频一二三| 亚洲亚洲精品三区日韩精品在线视频 | 欧美一级二级三级蜜桃| 亚洲午夜国产成人av电影男同| 国产精品扒开腿做爽爽爽软件 | 美女视频黄免费的久久| 久久精品国产精品亚洲| 激情六月婷婷久久| 欧美va亚洲va国产综合| 久久久亚洲综合| 亚洲国产精品精华液2区45| 欧美成熟视频| 欧美久久久久久久| 亚洲欧美综合精品久久成人| 欧美一区二区精品| 亚洲电影在线看| 亚洲人体偷拍| 国产精品乱人伦中文| 久久偷窥视频| 欧美高清在线视频| 午夜欧美不卡精品aaaaa| 久久激情视频免费观看| 亚洲肉体裸体xxxx137| 亚洲精品小视频在线观看| 国产精品大片wwwwww| 另类国产ts人妖高潮视频| 久久国产精品99久久久久久老狼| 先锋资源久久| 99热这里只有精品8| 午夜综合激情| 一区二区福利| 欧美影院一区| 日韩视频在线一区| 午夜精品久久久久久久99水蜜桃| 在线看片日韩| 亚洲欧美激情精品一区二区| 136国产福利精品导航网址| 一区二区免费在线视频| 亚洲欧美日韩一区二区三区在线| 亚洲国产va精品久久久不卡综合| 一本色道久久综合亚洲精品不卡| 国产视频一区二区在线观看| 亚洲第一页自拍| 国产亚洲第一区| 亚洲视频欧美在线| 亚洲巨乳在线| 久久精品国产一区二区电影| 亚洲图片自拍偷拍| 鲁大师影院一区二区三区| 午夜精品www| 欧美国产精品久久| 久久精品国产在热久久 | 女人天堂亚洲aⅴ在线观看| 欧美四级剧情无删版影片| 美女精品自拍一二三四| 国产精品一区亚洲| 最新日韩av| 亚洲第一黄网| 久久精品一区| 欧美一进一出视频| 欧美午夜在线一二页| 亚洲国产精品激情在线观看| 一区免费在线| 久久精品亚洲国产奇米99| 久久精品二区三区| 国产婷婷一区二区| 亚洲欧美一区二区激情| 亚洲综合成人在线| 欧美色123| 亚洲精选国产| 亚洲伦理自拍| 欧美激情亚洲另类| 欧美激情一区二区三区成人| 国产主播在线一区| 欧美淫片网站| 另类天堂av| 亚洲国产精品尤物yw在线观看| 久久久五月婷婷| 欧美xx69| 一本色道久久综合| 欧美三区不卡| 亚洲主播在线| 久久久噜噜噜久久人人看| 又紧又大又爽精品一区二区| 小辣椒精品导航| 国产精品久久午夜| 午夜久久久久| 免费不卡视频| 最新日韩在线| 欧美日韩精品一区二区| 亚洲一区成人| 久久精品亚洲一区二区三区浴池| 国内免费精品永久在线视频| 久久精品国产69国产精品亚洲| 猫咪成人在线观看| 日韩亚洲欧美在线观看| 欧美日韩在线直播| 午夜精品久久久久久久| 欧美成人一区二区三区片免费| 亚洲毛片在线看| 国产精品久久激情| 久久精品国产v日韩v亚洲 | 亚洲天堂第二页| 国产精品国产三级国产普通话蜜臀| 中国女人久久久| 欧美一区二区黄色| 久久国产手机看片| 亚洲久久成人| 亚洲看片免费| 欧美电影在线观看| 亚洲宅男天堂在线观看无病毒| 久久精品欧美| 日韩午夜激情| 国产亚洲成精品久久| 欧美裸体一区二区三区| 亚洲天堂av在线免费观看| 久久伊人精品天天| 国产精品99久久久久久白浆小说 | 欧美午夜a级限制福利片| 亚洲一区二区视频在线观看| 欧美成人亚洲| 欧美影院午夜播放| 亚洲色图自拍| 在线观看亚洲| 国产一区二区三区久久精品| 欧美精品久久一区| 久久综合给合| 亚洲精品中文字幕女同| 国产精品香蕉在线观看| 欧美精品一区三区| 蜜桃av一区二区| 久久久久久综合网天天| 欧美在线不卡视频| 午夜宅男久久久|