1. 程式人生 > >如何給WebBrowser中的網頁全身照相

如何給WebBrowser中的網頁全身照相

     首先想到的是最普通的螢幕複製, 也就是大家熟知的bitblt, 從WebBrowser的dc複製到bitmap的dc. 這種方法有很大的侷限性: 1.要正確複製,必須保證WebBrowser在螢幕複製的時候必須處於視窗最前端( 就是沒有遮蔽物 ), 否則複製出來的影象是有遮蓋物. 2.即使沒有遮蓋物,複製出來的影象往往包含3D Border , Scroll , 這在標準的WebBrowser是必要的.但是對於網頁縮略照片,這可就是噁心的東西了.

      於是有人想到了ActiveX裡面的一個介面 IViewObject2 , WebBrowser也實現了這個介面, 你只需要從WebBrowser物件中QueryInterface(...)就可以枚舉出這個介面. IWebBrowser2* pWB2 = ...//獲取WebBrowser介面, pWB2->QueryInterface( IID_IViewObject2 , (void**)&pViewObj2 ); 然後使用 IViewObject2 中的 Draw 這個方法,就可以繪畫WebBrowser中網頁的內容, 很好,即使視窗是隱藏的也可以畫出, 可是,等等, 只要您嘗試這個方法, 您就會發現,這個仍然不盡如人意. 因為你只能獲取WebBrowser這個視窗大小的網頁縮圖 , 而無法獲取整個網頁的縮圖. 同時, 3D Border, Scroll 仍然折磨著我們. 有人提出瞭如下程式碼 , 可以一定程度緩解, 讓我們看看:

 

忽略其中奇怪的巨集,我們可以發現,這個思想就是使用 Body, 來關閉border, 關閉scroll, 在有些場合下是有用的,可是大部分情況,如果頁面過大(比如超過螢幕大小), scroll還是會出現. border也不會消失,因為這和body元素沒有關係.

       真的沒有辦法解決嗎? 當然有,否則我也不會寫那麼多東西了, 有一個很著名的好東西, 介面:IDocHostUIHandler , 他有一個方法: GetHostInfo(DOCHOSTUIINFO *pInfo); 可以改變WebBrowser的顯示方式.完全不需要使用body來關閉border和scroll這種吃力不討好的辦法. 所以為了去除border, scroll我們只要這麼寫:

 

其中DOCHOSTUIFLAG_NO3DBORDER和DOCHOSTUIFLAG_SCROLL_NO正是我們需要的效果. 接下來我們要畫出整個網頁,只需要設定WebBrowser的容器大小為html的大小, 就可以完滿的畫出網頁縮圖. 

      當然, 在下強烈推薦應當使用一個看不見的WebBrowser來實現化網頁縮圖, 畢竟, 一個視窗忽大忽小,不是一個好的使用者體驗.

      最後整理一下程式碼:

      我使用一個叫CShadowWebWindow類實現WebBrowser, 這是一個不可見的視窗. 

      以下是關鍵程式碼, (請忽略奇怪的巨集 )


      至此,我們已經實現了網頁的快照(或者縮圖). 完全可以媲美Chrome的實現. 希望給大家有幫助,我在網上看到的都有這樣那樣的瑕疵, 在下的實現應該稍微完美一點, 希望對大家有幫助.

      如果我的文章對您有幫助,請您留言說說您的感想,這是對我莫大的鼓勵,謝謝!