HTML内のBODYの正確なサイズを取得する方法

UIWebBrowserをC++Builderで使ってみる実験 その2
以前、get_scrollHeight 、get_scrollWidth を使って、HTMLの描画領域のサイズを求める
と言うのをやったのですが、最近のWindowsのIEコンポーネントどうもバグってるみたいで
正しい値が取得できない様です。

void resizeFirst(IWebBrowser2* pSite, HWND hWnd){
 RECT rc={0};
 HWND hWnd,hWnd2;
 IDispatch *pDisp;
 IHTMLDocument2* pIHTMLDocument2 = NULL;
 pSite->get_Document(&pDisp);
 if(pDisp != NULL) {
  long cx=-1,cy=-1;      
  CComQIPtr pDoc=pDisp;
  BSTR url;
  pDoc->get_URL(&url);
  if(lstrcmpW(url,L"about:blank")){
     IHTMLElementCollection *pCol;
     (CComQIPtr(pDisp))-> get_all( &pCol) ;     
     if( pCol) {
      long lSize;
      pCol->get_length( &lSize);
      USES_CONVERSION ;
      for( long i = 0; i < lSize; i++)
      {
       VARIANT vtVariant,vtVariant2;
       long cx3,cy3,cx2,cy2;
       CComVariant vintName( i) ;
       CComVariant vintIndex( 0) ;
       IDispatch *pdsp2;
       pCol->item( vintName, vintIndex, &pdsp2) ;
       if(pdsp2){
        CComQIPtr pElement = pdsp2;
        pElement->get_offsetHeight(&cy2);
        pElement->get_offsetTop(&cy3);
        pElement->get_offsetWidth(&cx2);
        pElement->get_offsetLeft(&cx3);
        if(cx<cx2+cx3&&(cx3!=0||cy3!=0))cx=cx2+cx3;
        if(cy<cy2+cy3&&(cx3!=0||cy3!=0))cy=cy2+cy3;
       }
      }
      rc.bottom=cy;
      rc.right=cx;     
      AdjustWindowRectEx(&rc,GetWindowLong(hWnd,GWL_STYLE ),NULL,GetWindowLong(hWnd,GWL_EXSTYLE));
      int cxNew = rc.right - rc.left;
      int cyNew = rc.bottom - rc.top;
      SetWindowPos(hWnd,NULL,0,0,cxNew,cyNew, SWP_NOZORDER | SWP_NOMOVE );
     }
  }
 }
}

そこで編み出した関数がこちら
BODYやそれに重なるエレメントを除くもののうち最大の座標を持つものを抽出して書き換える!

TEXTAREA が最後にあるとリサイズの度に書き換わるとか、
Windows 95 は書き換えてもスクロールサイズが更新されないとか
凄く悩まされた((・ω・))

おすすめ

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です