CHtmlEditCtrl
переопределяет NavigateComplete2
и вызывает SetDesignMode(TRUE)
.Если вы хотите, чтобы средство просмотра вместо редактора, переопределите его следующим образом:
class CMyHtmlEditCtrl : public CHtmlEditCtrl
{
virtual void _OnNavigateComplete2(LPDISPATCH, VARIANT FAR*)
{
//SetDesignMode(TRUE);
}
public:
DECLARE_EVENTSINK_MAP()
};
BEGIN_EVENTSINK_MAP(CMyHtmlEditCtrl, CHtmlEditCtrl)
ON_EVENT_REFLECT(CMyHtmlEditCtrl, 252 /* NavigateComplete2 */, _OnNavigateComplete2, VTS_DISPATCH VTS_PVARIANT)
END_EVENTSINK_MAP()
Используйте этот класс вместо CHtmlEditCtrl
.Вам больше не понадобится WaitForComplete
, потому что SetDesignMode
не блокирует вызовы в OnInitDialog
.
Чтобы запустить браузер по умолчанию, необходимо также переопределить
_OnBeforeNavigate
Кроме того, добавьте #
к ссылке: href="#http://www.google.com"
, чтобы элемент управления браузера не знал, что делать со ссылкой, и позволяет обрабатывать ее.Затем вы конвертируете #http://www.google.com
в http://www.google.com
и открываете ссылку.
Объявите как CMyHtmlEditCtrl browser;
как член класса, чтобы избежать утечек.
Пример:
class CMyHtmlEditCtrl : public CHtmlEditCtrl
{
public:
virtual void _OnNavigateComplete2(LPDISPATCH, VARIANT FAR*)
{
//SetDesignMode(TRUE);
}
void _OnBeforeNavigate2(LPDISPATCH,
VARIANT* URL, VARIANT*, VARIANT*, VARIANT*, VARIANT*, VARIANT_BOOL*)
{
CString str(V_BSTR(URL));
int pos = str.Find(L'#');
if(pos >= 0)
{
str = str.Mid(pos + 1);
ShellExecute(NULL, L"open", str, NULL, NULL, SW_SHOWNORMAL);
}
}
DECLARE_EVENTSINK_MAP()
};
BEGIN_EVENTSINK_MAP(CMyHtmlEditCtrl, CHtmlEditCtrl)
ON_EVENT_REFLECT(CMyHtmlEditCtrl, 250, _OnBeforeNavigate2, VTS_DISPATCH VTS_PVARIANT VTS_PVARIANT VTS_PVARIANT VTS_PVARIANT VTS_PVARIANT VTS_PBOOL)
ON_EVENT_REFLECT(CMyHtmlEditCtrl, 252, _OnNavigateComplete2, VTS_DISPATCH VTS_PVARIANT)
END_EVENTSINK_MAP()
...
//declare class member for CMyDialog:
CMyHtmlEditCtrl browser;
...
CMyHtmlEditCtrl browser;
BOOL CMyDialog::OnInitDialog()
{
CDialogEx::OnInitDialog();
CWnd* edit = GetDlgItem(IDC_EDIT1);
CRect rc;
edit->GetWindowRect(&rc);
ScreenToClient(&rc);
browser.Create(0, WS_CHILD | WS_VISIBLE, rc, this, 301, 0);
CString html = LR"(<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01
Transitional//EN">
<html>
<head>
<style type="text/css">
body
{
border:1px solid gray;
}
</style>
</head>
<body>
<a href="#http://www.stackoverflow.com">http://www.stackoverflow.com</a>
</body>
</html>
)";
browser.SetDocumentHTML(html);
return TRUE;
}