1. 程式人生 > >C++中嵌入IE瀏覽器(一)

C++中嵌入IE瀏覽器(一)

    最近專案中用html 來做介面,也就折騰了一下在wxwidget中嵌入瀏覽器的若干細節工作,mfc也基本是類似的,由於wxwidget中已經做了一個封裝wxie,但是開發過程中也遇到了不少問題,在此做一下總結: 

  1. ie邊框 及上下文選單
       普通嵌入到程式裡面的瀏覽器頁面都會有一個灰色的邊框,這樣放到程式裡面就很難看。目前網上流行的辦法新增css:
    body{
      border
    :0;
    }
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

     但是目前很多頁面用了比較新的css,改成這樣後,頁面就無法正常顯示了。讓網頁美工改樣式? 真是有點困難。
    後來繼續查閱了資料,發現比較好的辦法,那就是過載  IDocHostUIHandler 介面,其中,實現以下部分: 


HRESULT STDMETHODCALLTYPE FrameSite::GetHostInfo(DOCHOSTUIINFO *pInfo)
{
    pInfo->cbSize = sizeof(DOCHOSTUIINFO);
    pInfo->dwFlags = DOCHOSTUIFLAG_NO3DBORDER|DOCHOSTUIFLAG_SCROLL_NO;
    pInfo->dwDoubleClick = DOCHOSTUIDBLCLK_DEFAULT;
    return S_OK;

}

       其中  DOCHOSTUIFLAG_NO3DBORDER 就表示不要生成邊框,DOCHOSTUIFLAG_SCROLL_NO 表示不要生成滾動條
這樣就可以比較完美的解決邊框和滾動條的問題,不用依賴頁面的調整 。讓設計師愛用什麼用什麼。
     另外一個就是禁用右鍵選單,網上也有不少辦法,但是用這個介面可以很簡單的實現: 
 

HRESULT STDMETHODCALLTYPE FrameSite::ShowContextMenu(DWORD dwID, POINT *ppt, 
                                                             IUnknown *pcmdtReserved, IDispatch *pdispReserved)
{
    HRESULT result    = S_FALSE; //Dont Interfere
    BOOL    handled    = FALSE;

    switch ( m_contextMenuMode )
    {
    case kDefaultMenuSupport:
        break;

    case kNoContextMenu:
        result    = S_OK;
        handled    = TRUE;
        break;

    case kTextSelectionOnly:
        if (dwID != CONTEXT_MENU_TEXTSELECT)
        {
            result    = S_OK;
            handled    = TRUE;
        }

        break;

    case kAllowAllButViewSource:
        if (dwID == CONTEXT_MENU_DEFAULT)
        {
            //result    = ModifyContextMenu(dwID, ppt, pcmdtReserved);
            handled    = TRUE;
        }

        break;

    case kCustomMenuSupport:
        if (dwID == CONTEXT_MENU_DEFAULT)
        {
            //result = CustomContextMenu(ppt, pcmdtReserved);
            handled    = TRUE;
        }

        break;
    }


    if (! handled)
    {
         result = S_FALSE;
    }


    return result;
}

    這裡不僅可以控制右鍵選單顯示,m_contextMenuMode  = kNoContextMenu,還可以做到自定義選單顯示,m_contextMenuMode  =其他值。因為暫時還不需要自定義選單,所以這裡沒有實現。
   
   如果用wxie,就在FrameSite類增加這個介面即可,不關注的介面直接返回S_FALSE 或E_NOTIMPL;

  如果用sdk或mfc,可以 呼叫IOleObject 的SetClientSite 方法,設定一個繼承了IOleClientSite 和 IDocHostUIHandler 的介面。

相關推薦

no