📄 hhctrl.cpp
字号:
/*
版权声明:
本文件版权为易语言作者吴涛所有,仅授权给第三方用作开发易语言支持库,禁止用于其他任何场合。
*/
#include "stdafx.h"
#include <AFXPRIV.H>
#include "hhctrl.h"
#include "htmlview.h"
INT WINAPI NotifySys (INT nMsg, DWORD dwParam1, DWORD dwParam2 = 0);
#include "untshare.cpp"
extern CHtmlViewApp theApp;
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static const char THIS_FILE[] = __FILE__;
#endif
BEGIN_MESSAGE_MAP(CHHCtrl, CWnd)
//{{AFX_MSG_MAP(CHHCtrl)
ON_WM_SETFOCUS()
ON_WM_SIZE()
ON_WM_PAINT()
ON_WM_DESTROY()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
BEGIN_EVENTSINK_MAP(CHHCtrl, CWnd)
ON_EVENT(CHHCtrl, AFX_IDW_PANE_FIRST, 102, OnStatusTextChange, VTS_BSTR)
ON_EVENT(CHHCtrl, AFX_IDW_PANE_FIRST, 108, OnProgressChange, VTS_I4 VTS_I4)
ON_EVENT(CHHCtrl, AFX_IDW_PANE_FIRST, 105, OnCommandStateChange, VTS_I4 VTS_BOOL)
ON_EVENT(CHHCtrl, AFX_IDW_PANE_FIRST, 106, OnDownloadBegin, VTS_NONE)
ON_EVENT(CHHCtrl, AFX_IDW_PANE_FIRST, 104, OnDownloadComplete, VTS_NONE)
ON_EVENT(CHHCtrl, AFX_IDW_PANE_FIRST, 113, OnTitleChange, VTS_BSTR)
ON_EVENT(CHHCtrl, AFX_IDW_PANE_FIRST, 252, NavigateComplete2, VTS_DISPATCH VTS_PVARIANT)
ON_EVENT(CHHCtrl, AFX_IDW_PANE_FIRST, 250, BeforeNavigate2, VTS_DISPATCH VTS_PVARIANT VTS_PVARIANT VTS_PVARIANT VTS_PVARIANT VTS_PVARIANT VTS_PBOOL)
ON_EVENT(CHHCtrl, AFX_IDW_PANE_FIRST, 112, OnPropertyChange, VTS_BSTR)
ON_EVENT(CHHCtrl, AFX_IDW_PANE_FIRST, 251, OnNewWindow2, VTS_PDISPATCH VTS_PBOOL)
ON_EVENT(CHHCtrl, AFX_IDW_PANE_FIRST, 259, DocumentComplete, VTS_DISPATCH VTS_PVARIANT)
ON_EVENT(CHHCtrl, AFX_IDW_PANE_FIRST, 253, OnQuit, VTS_NONE)
ON_EVENT(CHHCtrl, AFX_IDW_PANE_FIRST, 254, OnVisible, VTS_BOOL)
END_EVENTSINK_MAP()
CHHCtrl::CHHCtrl() : CWnd()
{
m_pBrowserApp = NULL;
m_blHasForceURL = m_blHasTitle = FALSE;
}
CHHCtrl::~CHHCtrl()
{
if (m_pBrowserApp != NULL)
m_pBrowserApp->Release();
}
void CHHCtrl::OnDraw(CDC* pDC)
{
// this class should never do its own drawing;
// the browser control should handle everything
ASSERT(FALSE); // make certain we aren't called
}
/*
OLECMDID_OPEN
OLECMDID_SAVEAS
OLECMDID_PRINT
OLECMDID_PRINTPREVIEW
OLECMDID_PAGESETUP
*/
void CHHCtrl::RunCmd (OLECMDID cmdid)
{
if (m_pBrowserApp != NULL) {
LPDISPATCH lpDisp;
m_pBrowserApp->get_Document(&lpDisp);
if (lpDisp != NULL) {
// the control will handle all printing UI
LPOLECOMMANDTARGET lpTarget;
if (SUCCEEDED(lpDisp->QueryInterface(IID_IOleCommandTarget,
(LPVOID*) &lpTarget))) {
lpTarget->Exec(NULL, cmdid, 0, NULL, NULL);
lpTarget->Release();
}
lpDisp->Release();
}
}
}
void CHHCtrl::OnDestroy()
{
if (m_pBrowserApp)
{
m_pBrowserApp->Release();
m_pBrowserApp = NULL;
}
}
void CHHCtrl::PostNcDestroy()
{
CWnd::PostNcDestroy ();
NotifySys (NRS_UNIT_DESTROIED, m_dwWinFormID, m_dwUnitID);
delete this;
}
void CHHCtrl::OnSize(UINT nType, int cx, int cy)
{
CWnd::OnSize(nType, cx, cy);
if (::IsWindow(m_wndBrowser.m_hWnd))
{
// need to push non-client borders out of the client area
CRect rect;
GetClientRect(rect);
//::AdjustWindowRectEx(rect,
// m_wndBrowser.GetStyle(), FALSE, WS_EX_CLIENTEDGE);
m_wndBrowser.SetWindowPos(NULL, rect.left, rect.top,
rect.Width(), rect.Height(), SWP_NOACTIVATE | SWP_NOZORDER);
}
}
void CHHCtrl::OnPaint()
{
Default();
}
void CHHCtrl::OnSetFocus(CWnd* pOldWnd)
{
CWnd::OnSetFocus(pOldWnd);
if (::IsWindow (m_wndBrowser.m_hWnd))
m_wndBrowser.SetFocus ();
}
BOOL CHHCtrl::Create (HWND hParentWnd, DWORD dwStyle, UINT uID,
INT x, INT y, INT cx, INT cy)
{
if (!CWnd::CreateEx (NULL, AfxRegisterWndClass (CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW,
::LoadCursor (NULL, IDC_ARROW), HBRUSH (::GetStockObject (WHITE_BRUSH))),
_T(""), dwStyle, x, y, cx, cy, hParentWnd, (HMENU)uID, NULL))
return FALSE;
theApp.InitCom ();
AfxEnableControlContainer();
RECT rectClient;
GetClientRect(&rectClient);
// create the control window
// AFX_IDW_PANE_FIRST is a safe but arbitrary ID
if (!m_wndBrowser.CreateControl(CLSID_WebBrowser, NULL,
WS_VISIBLE | WS_CHILD, rectClient, this, AFX_IDW_PANE_FIRST))
{
DestroyWindow();
return FALSE;
}
LPUNKNOWN lpUnk = m_wndBrowser.GetControlUnknown();
HRESULT hr = lpUnk->QueryInterface(IID_IWebBrowser2, (void**) &m_pBrowserApp);
if (!SUCCEEDED(hr))
{
m_pBrowserApp = NULL;
m_wndBrowser.DestroyWindow();
DestroyWindow();
return FALSE;
}
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
CString CHHCtrl::GetType() const
{
ASSERT(m_pBrowserApp != NULL);
BSTR bstr;
m_pBrowserApp->get_Type(&bstr);
CString retVal(bstr);
return retVal;
}
long CHHCtrl::GetLeft() const
{
ASSERT(m_pBrowserApp != NULL);
long result;
m_pBrowserApp->get_Left(&result);
return result;
}
long CHHCtrl::GetTop() const
{
ASSERT(m_pBrowserApp != NULL);
long result;
m_pBrowserApp->get_Top(&result);
return result;
}
long CHHCtrl::GetHeight() const
{
ASSERT(m_pBrowserApp != NULL);
long result;
m_pBrowserApp->get_Height(&result);
return result;
}
BOOL CHHCtrl::GetVisible() const
{
ASSERT(m_pBrowserApp != NULL);
VARIANT_BOOL result;
m_pBrowserApp->get_Visible(&result);
return result;
}
CString CHHCtrl::GetLocationName() const
{
ASSERT(m_pBrowserApp != NULL);
BSTR bstr;
m_pBrowserApp->get_LocationName(&bstr);
CString retVal(bstr);
return retVal;
}
CString CHHCtrl::GetLocationURL() const
{
ASSERT(m_pBrowserApp != NULL);
BSTR bstr;
m_pBrowserApp->get_LocationURL(&bstr);
CString retVal(bstr);
return retVal;
}
BOOL CHHCtrl::GetBusy() const
{
ASSERT(m_pBrowserApp != NULL);
VARIANT_BOOL result;
m_pBrowserApp->get_Busy(&result);
return result;
}
READYSTATE CHHCtrl::GetReadyState() const
{
ASSERT(m_pBrowserApp != NULL);
READYSTATE result;
m_pBrowserApp->get_ReadyState(&result);
return result;
}
BOOL CHHCtrl::GetOffline() const
{
ASSERT(m_pBrowserApp != NULL);
VARIANT_BOOL result;
m_pBrowserApp->get_Offline(&result);
return result;
}
BOOL CHHCtrl::GetSilent() const
{
ASSERT(m_pBrowserApp != NULL);
VARIANT_BOOL result;
m_pBrowserApp->get_Silent(&result);
return result;
}
void CHHCtrl::ExecWB(OLECMDID cmdID, OLECMDEXECOPT cmdexecopt,
VARIANT* pvaIn, VARIANT* pvaOut)
{
ASSERT(m_pBrowserApp != NULL);
m_pBrowserApp->ExecWB(cmdID, cmdexecopt, pvaIn, pvaOut);
}
HRESULT CHHCtrl::Navigate(LPCTSTR lpszURL, DWORD dwFlags /* = 0 */,
LPCTSTR lpszTargetFrameName /* = NULL */ ,
LPCTSTR lpszHeaders /* = NULL */, LPVOID lpvPostData /* = NULL */,
DWORD dwPostDataLen /* = 0 */)
{
CString strURL(lpszURL);
BSTR bstrURL = strURL.AllocSysString();
COleSafeArray vPostData;
if (lpvPostData != NULL)
{
if (dwPostDataLen == 0)
dwPostDataLen = lstrlen((LPCTSTR) lpvPostData);
vPostData.CreateOneDim(VT_UI1, dwPostDataLen, lpvPostData);
}
return m_pBrowserApp->Navigate(bstrURL,
COleVariant((long) dwFlags, VT_I4),
COleVariant(lpszTargetFrameName, VT_BSTR),
vPostData,
COleVariant(lpszHeaders, VT_BSTR));
}
HRESULT CHHCtrl::NavigateChm(LPCTSTR szChmFileName, LPCTSTR URL, LPCTSTR lpszTargetFrameName)
{
if (szChmFileName == NULL || *szChmFileName == '\0')
return STG_E_FILENOTFOUND; // CHM file wasn't located
char szURL[MAX_PATH * 2];
wsprintf(szURL, "its:%s::%s", szChmFileName, URL);
return Navigate(szURL, NULL, lpszTargetFrameName);
}
/////////////////////////////////////////////////////////////////////////////
// CHHCtrl event reflectors
void CHHCtrl::NavigateComplete2(LPDISPATCH /* pDisp */, VARIANT* URL)
{
ASSERT(V_VT(URL) == VT_BSTR);
// USES_CONVERSION;
CString str(V_BSTR(URL));
OnNavigateComplete2(str);
}
void CHHCtrl::BeforeNavigate2(LPDISPATCH /* pDisp */, VARIANT* URL,
VARIANT* Flags, VARIANT* TargetFrameName,
VARIANT* PostData, VARIANT* Headers, BOOL* pfCancel)
{
ASSERT(V_VT(URL) == VT_BSTR);
ASSERT(V_VT(TargetFrameName) == VT_BSTR);
ASSERT(V_VT(PostData) == (VT_VARIANT | VT_BYREF));
ASSERT(V_VT(Headers) == VT_BSTR);
ASSERT(pfCancel != NULL);
//USES_CONVERSION;
VARIANT* vtPostedData = V_VARIANTREF(PostData);
CByteArray array;
if (V_VT(vtPostedData) & VT_ARRAY)
{
// must be a vector of bytes
ASSERT(vtPostedData->parray->cDims == 1 && vtPostedData->parray->cbElements == 1);
vtPostedData->vt |= VT_UI1;
COleSafeArray safe(vtPostedData);
DWORD dwSize = safe.GetOneDimSize();
LPVOID pVoid;
safe.AccessData(&pVoid);
array.SetSize(dwSize);
LPBYTE lpByte = array.GetData();
memcpy(lpByte, pVoid, dwSize);
safe.UnaccessData();
}
// make real parameters out of the notification
CString strTargetFrameName(V_BSTR(TargetFrameName));
CString strURL = V_BSTR(URL);
CString strHeaders = V_BSTR(Headers);
DWORD nFlags = V_I4(Flags);
// notify the user's class
OnBeforeNavigate2(strURL, nFlags, strTargetFrameName, array, strHeaders, pfCancel);
}
void CHHCtrl::DocumentComplete(LPDISPATCH pDisp, VARIANT* URL)
{
UNUSED_ALWAYS(pDisp);
ASSERT(V_VT(URL) == VT_BSTR);
CString str(V_BSTR(URL));
OnDocumentComplete(str);
}
/////////////////////////////////////////////////////////////////////////////
// CHHCtrl Events
void CHHCtrl::OnProgressChange(long lProgress, long lProgressMax)
{
EVENT_NOTIFY event (m_dwWinFormID, m_dwUnitID, 3);
event.m_nArgCount = 1;
event.m_nArgValue [0] = lProgressMax == 0 ? 100 :
MulDiv (lProgress, 100, lProgressMax);
NotifySys (NRS_EVENT_NOTIFY, (DWORD)&event);
}
void CHHCtrl::OnCommandStateChange(long lCommand, BOOL bEnable)
{
if (lCommand == CSC_NAVIGATEFORWARD || lCommand == CSC_NAVIGATEBACK)
{
EVENT_NOTIFY event (m_dwWinFormID, m_dwUnitID, 8);
event.m_nArgCount = 2;
event.m_nArgValue [0] = lCommand == CSC_NAVIGATEFORWARD ? 0 : 1;
event.m_nArgValue [1] = bEnable ? 1 : 0;
NotifySys (NRS_EVENT_NOTIFY, (DWORD)&event);
}
}
void CHHCtrl::OnDownloadBegin()
{
NotifySys (NRS_EVENT_NOTIFY, (DWORD)&EVENT_NOTIFY (m_dwWinFormID, m_dwUnitID, 2));
}
void CHHCtrl::OnQuit()
{
}
void CHHCtrl::OnDocumentComplete(LPCTSTR lpszURL)
{
m_blHasForceURL = TRUE;
SetStr (m_strForceURL, (LPTSTR)lpszURL);
NotifySys (NRS_EVENT_NOTIFY, (DWORD)&EVENT_NOTIFY (m_dwWinFormID, m_dwUnitID, 5));
m_blHasForceURL = FALSE;
m_strForceURL.Empty ();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -