C++中嵌入IE瀏覽器(一)
阿新 • • 發佈:2019-01-20
最近專案中用html 來做介面,也就折騰了一下在wxwidget中嵌入瀏覽器的若干細節工作,mfc也基本是類似的,由於wxwidget中已經做了一個封裝wxie,但是開發過程中也遇到了不少問題,在此做一下總結:
-
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 的介面。
