📄 hhctrl.cpp
字号:
void CHHCtrl::OnDownloadComplete()
{
NotifySys (NRS_EVENT_NOTIFY, (DWORD)&EVENT_NOTIFY (m_dwWinFormID, m_dwUnitID, 4));
}
void CHHCtrl::OnTitleChange(LPCTSTR lpszText)
{
m_blHasTitle = TRUE;
SetStr (m_strTitle, (LPTSTR)lpszText);
NotifySys (NRS_EVENT_NOTIFY, (DWORD)&EVENT_NOTIFY (m_dwWinFormID, m_dwUnitID, 7));
m_blHasTitle = FALSE;
m_strTitle.Empty ();
}
void CHHCtrl::OnPropertyChange(LPCTSTR lpszProperty)
{
UNUSED_ALWAYS(lpszProperty);
}
void CHHCtrl::OnNewWindow2(LPDISPATCH* ppDisp, BOOL* pfCancel)
{
EVENT_NOTIFY event (m_dwWinFormID, m_dwUnitID, 9);
if (NotifySys (NRS_EVENT_NOTIFY, (DWORD)&event) != 0 &&
event.m_blHasReturnValue == TRUE &&
event.m_nReturnValue == 0)
*pfCancel = TRUE;
else
*pfCancel = FALSE;
UNUSED_ALWAYS(ppDisp);
}
void CHHCtrl::OnVisible(BOOL fVisible)
{
UNUSED_ALWAYS(fVisible);
}
void CHHCtrl::OnBeforeNavigate2(LPCTSTR lpszURL, DWORD nFlags,
LPCTSTR lpszTargetFrameName, CByteArray& baPostData,
LPCTSTR lpszHeaders, BOOL* pfCancel)
{
m_blHasForceURL = TRUE;
SetStr (m_strForceURL, (LPTSTR)lpszURL);
EVENT_NOTIFY event (m_dwWinFormID, m_dwUnitID, 0);
if (NotifySys (NRS_EVENT_NOTIFY, (DWORD)&event) != 0 &&
event.m_blHasReturnValue == TRUE &&
event.m_nReturnValue == 0)
*pfCancel = TRUE;
else
*pfCancel = FALSE;
m_blHasForceURL = FALSE;
m_strForceURL.Empty ();
UNUSED_ALWAYS(nFlags);
UNUSED_ALWAYS(lpszTargetFrameName);
UNUSED_ALWAYS(baPostData);
UNUSED_ALWAYS(lpszHeaders);
}
void CHHCtrl::OnStatusTextChange(LPCTSTR pszText)
{
SetStr (m_strStatusText, (LPTSTR)pszText);
NotifySys (NRS_EVENT_NOTIFY, (DWORD)&EVENT_NOTIFY (m_dwWinFormID, m_dwUnitID, 6));
}
void CHHCtrl::OnNavigateComplete2(LPCTSTR strURL)
{
m_blHasForceURL = TRUE;
SetStr (m_strForceURL, (LPTSTR)strURL);
NotifySys (NRS_EVENT_NOTIFY, (DWORD)&EVENT_NOTIFY (m_dwWinFormID, m_dwUnitID, 1));
m_blHasForceURL = FALSE;
m_strForceURL.Empty ();
}
#ifdef _DEBUG
void CHHCtrl::AssertValid() const
{
CWnd::AssertValid();
}
void CHHCtrl::Dump(CDumpContext& dc) const
{
CWnd::Dump(dc);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// !!! 此处的定义顺序绝对不可改变
static EVENT_ARG_INFO s_HtmlViewerArgInfo [] =
{
//****** 载入进度改变
{
/*name*/ _WT("进度百分比"),
/*explain*/ _WT("参数值指示当前文档已经被载入的百分比"),
/*state*/ NULL,
},
//****** 命令状态被改变
{
/*name*/ _WT("命令"),
/*explain*/ _WT("参数值指示允许状态被改变的命令类型,为以下常量值之一:"
"0: #前进; 1: #后退"),
/*state*/ NULL,
}, {
/*name*/ _WT("是否被允许"),
/*explain*/ _WT("参数值指示该命令当前是否被允许"),
/*state*/ EAS_IS_BOOL_ARG,
},
};
// !!! 此处的定义顺序绝对不可改变,主默认信息放在首位。
EVENT_INFO g_HtmlViewerEvent [] =
{
{
_WT("即将跳转"),
_WT("在浏览器即将跳转到另一个页面之前产生此事件,"
"在事件处理子程序中读取“地址”属性即可得知即将跳转到的地址,"
"返回假不允许跳转,返回真或不返回值允许跳转"),
/*m_dwState*/ EV_RETURN_BOOL,
/*m_nArgCount*/ 0,
/*m_pBeginArgInfo*/ NULL,
}, {
_WT("跳转完毕"),
_WT("当浏览器已跳转到另一个页面之后产生此事件,"
"在事件处理子程序中读取“地址”属性即可得知已跳转到的地址"),
/*m_dwState*/ NULL,
/*m_nArgCount*/ 0,
/*m_pBeginArgInfo*/ NULL,
}, {
_WT("载入开始"),
_WT("本事件在“即将跳转”事件之后触发,表示浏览器已开始载入将要显示的文档"),
/*m_dwState*/ NULL,
/*m_nArgCount*/ 0,
/*m_pBeginArgInfo*/ NULL,
}, {
_WT("载入进度改变"),
_WT("在浏览器载入文档的过程中,每当文档被载入一部分即触发本事件,用作通知载入进度"),
/*m_dwState*/ NULL,
/*m_nArgCount*/ 1,
/*m_pBeginArgInfo*/ s_HtmlViewerArgInfo,
}, {
_WT("载入完毕"),
_WT("当将要显示在浏览器内的文档被载入完毕后触发本事件"),
/*m_dwState*/ NULL,
/*m_nArgCount*/ 0,
/*m_pBeginArgInfo*/ NULL,
}, {
_WT("已就绪"),
_WT("当浏览器已经将所需显示的文档处理完毕后发送本事件,"
"在事件处理子程序中读取“地址”属性即可得知已就绪文档的地址"),
/*m_dwState*/ NULL,
/*m_nArgCount*/ 0,
/*m_pBeginArgInfo*/ NULL,
}, {
_WT("状态文本被改变"),
_WT("当浏览器的状态条文本被改变后发送本事件,"
"在事件处理子程序中读取“状态条文本”属性即可得知其内容"),
/*m_dwState*/ NULL,
/*m_nArgCount*/ 0,
/*m_pBeginArgInfo*/ NULL,
}, {
_WT("标题被改变"),
_WT("当浏览器的标题文本被改变后发送本事件,"
"在事件处理子程序中读取“标题”属性即可得知其内容"),
/*m_dwState*/ NULL,
/*m_nArgCount*/ 0,
/*m_pBeginArgInfo*/ NULL,
}, {
_WT("命令状态被改变"),
_WT("当“前进”、“后退”等命令的允许状态被改变后发送此事件,"
"用户程序应该根据状态值允许或禁止对应的按钮或菜单项。"),
/*m_dwState*/ NULL,
/*m_nArgCount*/ 2,
/*m_pBeginArgInfo*/ &s_HtmlViewerArgInfo [1],
}, {
_WT("即将打开新窗口"),
_WT("在浏览器即将打开新窗口浏览另一个页面之前产生此事件,"
"事件处理子程序返回假不允许打开,返回真或不返回值允许打开"),
/*m_dwState*/ EV_RETURN_BOOL,
/*m_nArgCount*/ 0,
/*m_pBeginArgInfo*/ NULL,
},
};
INT g_HtmlViewerEventCount = sizeof (g_HtmlViewerEvent) / sizeof (g_HtmlViewerEvent [0]);
// 注意顺序不可改变!!!
UNIT_PROPERTY g_HtmlViewerProperty [] =
{
FIXED_WIN_UNIT_PROPERTY,
{
/*m_szName*/ _WT("字体大小"),
/*m_szEgName*/ _WT("FontSize"),
/*m_szExplain*/ _WT("指定浏览页面时所使用的字体尺寸"),
/*m_shtType*/ UD_PICK_INT,
/*m_wState*/ NULL,
/*m_szzPickStr*/ _WT("最小\0较小\0中等\0较大\0最大\0\0"),
}, {
/*m_szName*/ _WT("离线浏览"),
/*m_szEgName*/ _WT("Offline"),
/*m_szExplain*/ _WT("指定浏览器是否从缓存里面读取超文本页面数据"),
/*m_shtType*/ UD_BOOL,
/*m_wState*/ NULL,
/*m_szzPickStr*/ NULL,
}, {
/*m_szName*/ _WT("静默"),
/*m_szEgName*/ _WT("Silent"),
/*m_szExplain*/ _WT("本属性如果为真,则浏览过程中不允许浏览器显示自己的对话框"),
/*m_shtType*/ UD_BOOL,
/*m_wState*/ NULL,
/*m_szzPickStr*/ NULL,
}, {
/*m_szName*/ _WT("地址"),
/*m_szEgName*/ _WT("url"),
/*m_szExplain*/ _WT("指定欲显示的网络或本机超文本页面地址"),
/*m_shtType*/ UD_FILE_NAME,
/*m_wState*/ NULL,
/*m_szzPickStr*/ _WT("请输入网页文件的名称:\0网页文件 (*.htm;*.html)|*.htm;*.html\0html\0" "0\0\0"),
}, {
/*m_szName*/ _WT("状态条文本"),
/*m_szEgName*/ _WT("StatusText"),
/*m_szExplain*/ _WT("用作在运行时提供浏览器的当前状态条文本"),
/*m_shtType*/ UD_TEXT,
/*m_wState*/ UW_ONLY_READ,
/*m_szzPickStr*/ NULL,
}, {
/*m_szName*/ _WT("标题"),
/*m_szEgName*/ _WT("Caption"),
/*m_szExplain*/ _WT("用作在运行时提供浏览器的当前标题文本"),
/*m_shtType*/ UD_TEXT,
/*m_wState*/ UW_ONLY_READ,
/*m_szzPickStr*/ NULL,
},
};
INT g_HtmlViewerPropertyCount = sizeof (g_HtmlViewerProperty) / sizeof (g_HtmlViewerProperty [0]);
void CPIHtmlViewer::init ()
{
CPropertyInfo::init ();
m_nFontSize = 2;
m_blOffline = FALSE;
m_blSilent = FALSE;
m_strURL.Empty ();
}
BOOL CPIHtmlViewer::Serialize (CArchive& ar)
{
if (CPropertyInfo::Serialize (ar) == FALSE)
return FALSE;
TRY
{
if (ar.IsLoading () == TRUE)
{
DWORD dwUnitDataVer;
ar >> dwUnitDataVer;
if (dwUnitDataVer > CUR_UNIT_VER)
return FALSE;
ar >> m_nFontSize >> m_blOffline >> m_blSilent;
}
else
{
ar << (DWORD)CUR_UNIT_VER;
ar << m_nFontSize << m_blOffline << m_blSilent;
}
SerializeCString (m_strURL, ar);
return TRUE;
}
END_TRY
return FALSE;
}
/////////////////////////////////////////////////////////////////////////////
HUNIT WINAPI Create_HtmlViewer (LPBYTE pAllData, INT nAllDataSize,
DWORD dwStyle, HWND hParentWnd, UINT uID, HMENU hMenu, INT x, INT y, INT cx, INT cy,
DWORD dwWinFormID, DWORD dwUnitID, HWND hDesignWnd, BOOL blInDesignMode)
{
CHHCtrl* pUnit = new CHHCtrl;
if (pUnit->m_info.LoadData (pAllData, nAllDataSize) == FALSE)
{
delete pUnit;
return NULL;
}
pUnit->m_dwWinFormID = dwWinFormID;
pUnit->m_dwUnitID = dwUnitID;
pUnit->m_blInDesignMode = blInDesignMode;
if (pUnit->Create (hParentWnd, dwStyle | WS_CHILD | WS_CLIPSIBLINGS,
uID, x, y, cx, cy))
{
pUnit->SetOffline (pUnit->m_info.m_blOffline);
pUnit->SetSilent (pUnit->m_info.m_blSilent);
COleVariant vaZoomFactor ((LONG)max (0, min (4, pUnit->m_info.m_nFontSize)));
pUnit->ExecWB (OLECMDID_ZOOM, OLECMDEXECOPT_DONTPROMPTUSER, &vaZoomFactor, NULL);
if (!pUnit->m_info.m_strURL.IsEmpty ())
pUnit->Navigate (pUnit->m_info.m_strURL);
return (HUNIT)pUnit;
}
else
return NULL;
}
BOOL WINAPI NotifyPropertyChanged_HtmlViewer (HUNIT hUnit, INT nPropertyIndex,
PUNIT_PROPERTY_VALUE pPropertyVaule,
LPTSTR* ppszTipText)
{
ASSERT (hUnit != NULL);
if (hUnit == NULL) return FALSE;
CHHCtrl* pUnit = (CHHCtrl*)hUnit;
ASSERT (pUnit->GetSafeHwnd () != NULL);
if (ppszTipText != NULL)
*ppszTipText = NULL;
// 注意此处的属性索引必须与属性表完全一致。
switch (nPropertyIndex)
{
case 0:
{
pUnit->m_info.m_nFontSize = max (0, min (4, pPropertyVaule->m_int));
COleVariant vaZoomFactor ((LONG)pUnit->m_info.m_nFontSize);
pUnit->ExecWB (OLECMDID_ZOOM, OLECMDEXECOPT_DONTPROMPTUSER, &vaZoomFactor, NULL);
}
break;
case 1:
pUnit->SetOffline (pUnit->m_info.m_blOffline = pPropertyVaule->m_bool);
break;
case 2:
pUnit->SetSilent (pUnit->m_info.m_blSilent = pPropertyVaule->m_bool);
break;
case 3:
SetStr (pUnit->m_info.m_strURL, pPropertyVaule->m_szText);
pUnit->Navigate (pUnit->m_info.m_strURL);
break;
case 4:
break;
case 5:
break;
default:
ASSERT (FALSE);
break;
}
return FALSE;
}
// !! 对于运行时可能被用户操作改变(不考虑直接调用API函数)的属性,在运行时必须取其现行实际值。
BOOL WINAPI GetPropertyData_HtmlViewer (HUNIT hUnit, INT nPropertyIndex,
PUNIT_PROPERTY_VALUE pPropertyVaule)
{
ASSERT (hUnit != NULL);
if (hUnit == NULL) return FALSE;
CHHCtrl* pUnit = (CHHCtrl*)hUnit;
ASSERT (pUnit->GetSafeHwnd () != NULL);
// 注意此处的属性索引必须与属性表完全一致。
switch (nPropertyIndex)
{
case 0:
pPropertyVaule->m_int = pUnit->m_info.m_nFontSize;
break;
case 1:
pPropertyVaule->m_bool = pUnit->m_blInDesignMode ?
pUnit->m_info.m_blOffline : pUnit->GetOffline ();
break;
case 2:
pPropertyVaule->m_bool = pUnit->m_blInDesignMode ?
pUnit->m_info.m_blSilent : pUnit->GetSilent ();
break;
case 3:
if (pUnit->m_blInDesignMode == FALSE)
{
pUnit->m_info.m_strURL = pUnit->m_blHasForceURL ?
pUnit->m_strForceURL : pUnit->GetLocationURL ();
}
pPropertyVaule->m_szText = (LPTSTR)(LPCTSTR)pUnit->m_info.m_strURL;
break;
case 4:
pPropertyVaule->m_szText = (LPTSTR)(LPCTSTR)pUnit->m_strStatusText;
break;
case 5:
if (pUnit->m_blHasTitle == FALSE)
pUnit->m_strTitle = pUnit->GetLocationName ();
pPropertyVaule->m_szText = (LPTSTR)(LPCTSTR)pUnit->m_strTitle;
break;
default:
ASSERT (FALSE);
return FALSE;
}
return TRUE;
}
HGLOBAL WINAPI GetAllPropertyData_HtmlViewer (HUNIT hUnit)
{
ASSERT (hUnit != NULL);
return ((CHHCtrl*)hUnit)->m_info.SaveData ();
}
PFN_INTERFACE WINAPI GetInterface_HtmlViewer (INT nInterfaceNO)
{
return nInterfaceNO == ITF_CREATE_UNIT ? (PFN_INTERFACE)Create_HtmlViewer :
nInterfaceNO == ITF_NOTIFY_PROPERTY_CHANGED ? (PFN_INTERFACE)NotifyPropertyChanged_HtmlViewer :
nInterfaceNO == ITF_GET_ALL_PROPERTY_DATA ? (PFN_INTERFACE)GetAllPropertyData_HtmlViewer :
nInterfaceNO == ITF_GET_PROPERTY_DATA ? (PFN_INTERFACE)GetPropertyData_HtmlViewer :
NULL;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -