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

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>
            亚洲欧美春色| 欧美顶级艳妇交换群宴| 日韩一区二区精品在线观看| 欧美韩国日本一区| 亚洲美女在线国产| 国产精品99久久99久久久二8| 欧美日韩国产色综合一二三四| 一区二区三区四区五区精品| 9i看片成人免费高清| 国产精品乱码人人做人人爱| 先锋亚洲精品| 久久av老司机精品网站导航| 在线国产欧美| 亚洲狼人综合| 国产日韩在线看片| 欧美高清在线视频| 欧美日韩在线免费| 久久久久久婷| 欧美国产第一页| 亚洲综合色在线| 久久精品中文字幕一区二区三区| 亚洲国产精品第一区二区三区| 亚洲国产视频一区| 国产精品丝袜xxxxxxx| 看片网站欧美日韩| 欧美日韩综合精品| 久久中文久久字幕| 欧美日韩亚洲视频一区| 久久久久久久尹人综合网亚洲| 免费亚洲一区二区| 欧美一区二区观看视频| 欧美成人午夜激情视频| 亚洲欧美日韩成人高清在线一区| 久久久久久久久久久久久久一区| 亚洲美女91| 欧美在线免费一级片| 亚洲视频网在线直播| 久久久精品免费视频| 亚洲免费视频在线观看| 欧美成年人视频网站| 久久成人一区二区| 欧美三日本三级少妇三2023 | 欧美黄色小视频| 久久精品国产欧美亚洲人人爽| 欧美风情在线观看| 裸体素人女欧美日韩| 国产精品免费网站在线观看| 亚洲国产精品第一区二区三区 | 蜜桃久久av一区| 久久精品国产综合| 欧美视频免费看| 亚洲激情不卡| 精品999在线播放| 99国产一区| 日韩亚洲欧美一区二区三区| 久久精品综合网| 久久久久久亚洲精品杨幂换脸| 国产精品日韩在线播放| 一区二区日韩欧美| 亚洲一级黄色av| 欧美精品1区| 最新高清无码专区| 日韩亚洲欧美高清| 欧美精品videossex性护士| 亚洲第一免费播放区| 亚洲成色777777在线观看影院| 久久aⅴ国产紧身牛仔裤| 久久久99爱| 激情久久婷婷| 久久香蕉国产线看观看av| 免费观看国产成人| 影音国产精品| 欧美freesex8一10精品| 欧美激情按摩| 一本色道久久综合亚洲精品婷婷 | 欧美成人dvd在线视频| 麻豆av福利av久久av| 黄色精品一区| 玖玖玖国产精品| 最新成人在线| 亚洲综合色在线| 国产日韩专区| 久久久中精品2020中文| 欧美激情a∨在线视频播放| 日韩亚洲一区二区| 国产精品欧美精品| 欧美亚洲色图校园春色| 免费高清在线一区| 亚洲精品一区二区三区av| 欧美日韩日日夜夜| 亚洲免费视频观看| 两个人的视频www国产精品| 91久久精品一区| 欧美日韩三级| 久久成人18免费观看| 亚洲国产欧美一区二区三区同亚洲 | 欧美日韩国产精品一卡| 一区二区av| 老妇喷水一区二区三区| 99re6这里只有精品| 国产欧美日韩另类一区| 麻豆国产精品777777在线| 一本色道久久| 看片网站欧美日韩| 亚洲小说欧美另类婷婷| 在线成人亚洲| 国产精品视区| 欧美精品成人一区二区在线观看 | 午夜精品成人在线| 亚洲第一页中文字幕| 午夜精品免费视频| 亚洲国产精品va在线看黑人| 国产精品乱码| 欧美精品国产精品日韩精品| 欧美在线亚洲在线| 亚洲精一区二区三区| 老鸭窝毛片一区二区三区| 亚洲一区二区三区视频播放| 亚洲电影有码| 国产主播一区二区三区| 欧美日韩在线视频观看| 欧美成年人网| 久久免费精品视频| 午夜综合激情| 一区二区激情小说| 亚洲日本电影| 欧美成人中文| 噜噜噜久久亚洲精品国产品小说| 亚洲免费影视第一页| 亚洲精品久久视频| 亚洲成色777777在线观看影院| 国产精品视频久久| 国产精品国内视频| 欧美日韩国产在线| 欧美激情精品久久久六区热门 | 久久精品国产99国产精品澳门 | 亚洲国产精品美女| 免费在线国产精品| 免费日韩视频| 久久亚洲私人国产精品va媚药 | 在线观看不卡av| 国产在线不卡精品| 国产一区二区中文| 国产一区二区三区四区在线观看 | 巨乳诱惑日韩免费av| 久久激情综合| 久久精品国产久精国产思思| 欧美一区影院| 久久久精品日韩欧美| 久久综合久久综合九色| 免费在线看一区| 免费日本视频一区| 欧美极品aⅴ影院| 欧美日精品一区视频| 国产精品久久久一区麻豆最新章节 | 欧美一区二区视频在线| 性xx色xx综合久久久xx| 欧美亚洲一区二区在线观看| 午夜精品福利一区二区蜜股av| 亚洲欧美伊人| 久久九九精品99国产精品| 久久精品亚洲精品| 欧美成人影音| 欧美日韩一二三区| 国产伦精品一区二区三区照片91 | 精品电影在线观看| 在线日韩中文字幕| 亚洲人成艺术| 亚洲一区二区精品在线| 久久av红桃一区二区小说| 噜噜噜久久亚洲精品国产品小说| 欧美电影免费| 亚洲素人一区二区| 久久久噜噜噜久久| 欧美日韩国产另类不卡| 国产精品综合久久久| 亚洲国产另类精品专区| 亚洲午夜激情网站| 久久在线免费视频| 日韩视频在线一区| 久久av一区二区| 欧美日韩精品二区第二页| 国产日韩欧美亚洲一区| 亚洲精品美女免费| 久久gogo国模裸体人体| 亚洲国产天堂久久综合网| 亚洲欧美日韩在线综合| 欧美大胆人体视频| 国产欧美一区二区精品婷婷| 亚洲精品护士| 久久精品女人| 99这里有精品| 欧美freesex交免费视频| 国产午夜亚洲精品羞羞网站| 亚洲乱码国产乱码精品精| 久久久久久久一区二区| 亚洲一区二区三区精品视频| 美女日韩在线中文字幕| 国产一区二区三区久久精品| 亚洲午夜精品国产|