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

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>
            亚洲欧洲中文日韩久久av乱码| 另类天堂av| 国产亚洲网站| 国产精品亚洲网站| 国产日韩三区| 1769国产精品| 亚洲精品日韩精品| 在线亚洲欧美专区二区| 午夜精品久久久久久久久久久| 午夜精品久久久| 久久躁狠狠躁夜夜爽| 免费高清在线一区| 亚洲国产你懂的| 亚洲激情国产精品| 亚洲一区自拍| 日韩一级在线| 可以看av的网站久久看| 欧美一级片一区| 久久网站热最新地址| 欧美精品激情在线| 国产日韩欧美在线看| 亚洲韩日在线| 亚洲欧美日韩直播| 欧美国产精品人人做人人爱| 日韩亚洲欧美成人| 亚洲电影有码| 日韩视频在线观看| 一区二区三区四区国产| 99综合精品| 久久精品人人做人人爽| 欧美日韩一区二区视频在线| 国产一区二区久久| 一区二区三区欧美在线观看| 久久久精品国产免费观看同学| 亚洲国产综合在线看不卡| 亚洲一区日韩在线| 欧美精品黄色| 在线免费高清一区二区三区| 午夜欧美电影在线观看| 亚洲国产日韩美| 久久成人国产精品| 国产精品一区在线观看| 亚洲免费观看| 欧美a级理论片| 欧美亚洲专区| 国产精品入口66mio| 一本色道久久综合亚洲精品按摩| 久久一二三国产| 欧美一区国产二区| 国产精品一级在线| 亚洲免费在线看| 在线天堂一区av电影| 欧美区一区二| 日韩一级二级三级| 亚洲国产精品成人| 欧美本精品男人aⅴ天堂| 亚洲第一精品电影| 免费在线欧美视频| 久久婷婷蜜乳一本欲蜜臀| 国产一区二区av| 久久久美女艺术照精彩视频福利播放 | 亚洲国产aⅴ天堂久久| 久久国产乱子精品免费女 | 国产亚洲一级| 久久精品一区二区| 久久久99国产精品免费| 狠狠干成人综合网| 美女脱光内衣内裤视频久久影院| 久久久久久国产精品一区| 国产欧美日韩综合精品二区| 亚洲精品日本| 激情国产一区二区| 久久综合给合久久狠狠色 | 亚洲私拍自拍| 国产精品国产三级国产普通话三级| 一本色道久久综合亚洲精品高清| 亚洲精品一区二区三| 欧美性大战xxxxx久久久| 午夜在线成人av| 欧美一区网站| 亚洲高清自拍| 在线一区二区三区四区五区| 国产美女在线精品免费观看| 久久视频免费观看| 欧美激情视频一区二区三区免费| 这里是久久伊人| 欧美一区日韩一区| 亚洲乱码国产乱码精品精可以看| 中文国产成人精品久久一| 国产午夜亚洲精品羞羞网站| 欧美激情第五页| 国产精品视区| 亚洲国产99精品国自产| 国产精品国码视频| 欧美承认网站| 国产欧美精品| 亚洲精品免费一二三区| 国产亚洲精品7777| 日韩一区二区久久| 玉米视频成人免费看| 宅男噜噜噜66一区二区| 亚洲国产精品欧美一二99| 亚洲手机成人高清视频| 亚洲日本无吗高清不卡| 香蕉av777xxx色综合一区| 亚洲精品极品| 久久精品日产第一区二区三区| 一本色道久久99精品综合 | 一本一本a久久| 久久久国产成人精品| 亚洲在线视频网站| 欧美激情精品久久久| 久久精品天堂| 国产精品区免费视频| 最新国产成人在线观看| 黄色小说综合网站| 亚洲欧美激情视频| 一区二区三区av| 欧美精品久久久久久久久久| 免费欧美在线| 国语自产精品视频在线看一大j8| 亚洲手机成人高清视频| 夜夜爽99久久国产综合精品女不卡| 久久久爽爽爽美女图片| 欧美色大人视频| 激情综合久久| 欧美亚洲综合网| 欧美一区二区| 国产精品九九| 一区二区免费在线播放| 99精品热视频只有精品10| 老鸭窝毛片一区二区三区| 久久九九免费视频| 国产日韩欧美一区二区三区四区| 中文在线一区| 午夜久久久久| 国产精品区二区三区日本| 一本色道88久久加勒比精品| 一本色道久久综合亚洲精品小说| 欧美紧缚bdsm在线视频| 亚洲国产一区二区三区在线播| 91久久国产综合久久| 欧美r片在线| 亚洲看片免费| 亚洲欧美在线看| 国产亚洲激情在线| 久久在线播放| 亚洲精品美女91| 亚洲欧美在线一区二区| 国产亚洲毛片在线| 久久久久久亚洲综合影院红桃| 欧美成人一区二区| 99精品视频免费观看| 欧美午夜精品一区| 午夜精品免费| 欧美大香线蕉线伊人久久国产精品| 1000部精品久久久久久久久| 欧美不卡视频| 在线一区二区三区四区| 久久精品成人欧美大片古装| 曰韩精品一区二区| 欧美日韩国产免费| 亚洲欧美国产精品桃花| 乱中年女人伦av一区二区| 亚洲人成免费| 国产精品一区二区三区成人| 久久久91精品国产| 亚洲美女色禁图| 久久久精品视频成人| 亚洲精品日韩在线观看| 国产精品一区二区三区乱码| 久久精品水蜜桃av综合天堂| 亚洲激情在线观看| 久久国产婷婷国产香蕉| 亚洲日本乱码在线观看| 国产情人节一区| 欧美理论电影在线播放| 欧美在线播放一区| 亚洲精品中文字幕在线| 久久在线播放| 亚洲专区在线视频| 亚洲免费观看高清完整版在线观看熊| 国产精品专区h在线观看| 欧美大片在线看| 久久久噜噜噜久噜久久| 亚洲一区尤物| 一区二区三区日韩欧美| 亚洲国产精品毛片| 久久亚洲私人国产精品va媚药| 亚洲午夜激情网页| 日韩视频精品| 亚洲电影免费| 好吊视频一区二区三区四区 | 欧美91大片| 午夜视频在线观看一区二区| 欧美成人资源网| 久久久久久一区二区| 在线性视频日韩欧美| 亚洲成在人线av| 亚洲私拍自拍|