16,550
社区成员
发帖
与我相关
我的任务
分享
#pragma once
#include <afxhtml.h>
// CHtmlCtrl Html 视图
class CHtmlCtrl : public CHtmlView
{
DECLARE_DYNCREATE(CHtmlCtrl)
public:
CHtmlCtrl(BOOL bNewWindow = FALSE);; // 动态创建所使用的受保护的构造函数
virtual ~CHtmlCtrl(){ };
BOOL CreateFromStatic(UINT nID, CWnd* pParent);
public:
#ifdef _DEBUG
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
#endif
BOOL m_bNewWindow;
CHtmlCtrl * m_pHtmlCtrlHandleNewWindow;
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
DECLARE_MESSAGE_MAP()
public:
virtual void OnBeforeNavigate2(LPCTSTR lpszURL, DWORD nFlags, LPCTSTR lpszTargetFrameName, CByteArray& baPostedData, LPCTSTR lpszHeaders, BOOL* pbCancel);
afx_msg void OnDestroy();
afx_msg BOOL OnEraseBkgnd(CDC* pDC);
afx_msg void OnSize(UINT nType, int cx, int cy);
virtual void OnNewWindow2(LPDISPATCH* ppDisp, BOOL* Cancel);
protected:
virtual void PostNcDestroy();
};
// HtmlCtrl.cpp : 实现文件
//
#include "stdafx.h"
#include "HtmlCtrl.h"
// CHtmlCtrl
IMPLEMENT_DYNCREATE(CHtmlCtrl, CHtmlView)
void CHtmlCtrl::DoDataExchange(CDataExchange* pDX)
{
CHtmlView::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CHtmlCtrl, CHtmlView)
ON_WM_DESTROY()
ON_WM_ERASEBKGND()
ON_WM_SIZE()
END_MESSAGE_MAP()
// CHtmlCtrl 诊断
#ifdef _DEBUG
void CHtmlCtrl::AssertValid() const
{
CHtmlView::AssertValid();
}
void CHtmlCtrl::Dump(CDumpContext& dc) const
{
CHtmlView::Dump(dc);
}
#endif //_DEBUG
// CHtmlCtrl 消息处理程序
BOOL CHtmlCtrl::CreateFromStatic(UINT nID, CWnd* pParent)
{
CStatic wndStatic;
if (!wndStatic.SubclassDlgItem(nID, pParent))
return FALSE;
// Get static control rect, convert to parent's client coords.
CRect rc;
wndStatic.GetWindowRect(&rc);
pParent->ScreenToClient(&rc);
wndStatic.DestroyWindow();
// create HTML control (CHtmlView)
return Create(NULL, // class name
NULL, // title
(WS_CHILD | WS_VISIBLE ), // style
rc, // rectangle
pParent, // parent
nID, // control ID
NULL); // frame/doc context not used
}
//开始链接时会触发此事件
void CHtmlCtrl::OnBeforeNavigate2(LPCTSTR lpszURL, DWORD /*nFlags*/, LPCTSTR /*lpszTargetFrameName*/, CByteArray& /*baPostedData*/, LPCTSTR /*lpszHeaders*/, BOOL* pbCancel)
{
*pbCancel = FALSE;
if (m_bNewWindow)
{
*pbCancel = TRUE;
CString sUrl = lpszURL;
// 处理新建窗口的url
if (sUrl.Find(_T("http://www.csdn.net")) != -1)
{
// 拦截
}
else
{
// 不拦截 ShellExecute 打开新窗口或做其他处理
}
}
}
void CHtmlCtrl::OnDestroy()
{
// This is probably unnecessary since ~CHtmlView does it, but
// safer to mimic CHtmlView::OnDestroy.
if (m_pBrowserApp)
{
m_pBrowserApp = NULL;
}
CWnd::OnDestroy(); // bypass CView doc/frame stuff
}
BOOL CHtmlCtrl::OnEraseBkgnd(CDC* /*pDC*/)
{
return true;
}
void CHtmlCtrl::OnSize(UINT nType, int cx, int cy)
{
CFormView::OnSize(nType, cx, cy); //Changed by thilon on 2006.08.10
if (::IsWindow(m_wndBrowser.m_hWnd))
{
CRect rect;
GetClientRect(rect);
// 就这一句与CHtmlView的不同
::AdjustWindowRectEx(rect, GetStyle(), FALSE, WS_EX_CLIENTEDGE);
m_wndBrowser.SetWindowPos(NULL, rect.left, rect.top, rect.Width(), rect.Height(), SWP_NOACTIVATE | SWP_NOZORDER);
}
}
void CHtmlCtrl::PostNcDestroy()
{
if (m_pHtmlCtrlHandleNewWindow)
{
delete m_pHtmlCtrlHandleNewWindow;
m_pHtmlCtrlHandleNewWindow = NULL;
}
}
void CHtmlCtrl::OnNewWindow2( LPDISPATCH* ppDisp, BOOL* Cancel )
{
if (!m_pHtmlCtrlHandleNewWindow)
{
RECT rc = {0, 0, 100, 200};
m_pHtmlCtrlHandleNewWindow = new CHtmlCtrl(TRUE);
m_pHtmlCtrlHandleNewWindow->Create(NULL, // class name
NULL, // title
(WS_CHILD), // style
rc, // rectangle
this, // parent
10000, // control ID
NULL);
}
*ppDisp = m_pHtmlCtrlHandleNewWindow->GetApplication();
}
CHtmlCtrl::CHtmlCtrl( BOOL bNewWindow /*= FALSE*/ )
{
m_bNewWindow = bNewWindow;
m_pHtmlCtrlHandleNewWindow = NULL;
}