📄 dlgdhtmleventsdlg.cpp
字号:
// dlgDHTMLEventsDlg.cpp : implementation file
//
#include "stdafx.h"
#include "dlgDHTMLEvents.h"
#include "dlgDHTMLEventsDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// Dialog Data
//{{AFX_DATA(CAboutDlg)
enum { IDD = IDD_ABOUTBOX };
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
// No message handlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CDlgDHTMLEventsDlg dialog
CDlgDHTMLEventsDlg::CDlgDHTMLEventsDlg(CWnd* pParent /*=NULL*/)
: CDialog(CDlgDHTMLEventsDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CDlgDHTMLEventsDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
m_bolLoaded = FALSE;
// modify this path accordingly
m_strBaseAddress = _T("c:\\dlgDHTMLEvents\\res");
}
void CDlgDHTMLEventsDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CDlgDHTMLEventsDlg)
DDX_Control(pDX, IDC_STATIC_VALUE, m_stcValue);
DDX_Control(pDX, IDC_STATIC_EVENT, m_stcEvent);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CDlgDHTMLEventsDlg, CDialog)
//{{AFX_MSG_MAP(CDlgDHTMLEventsDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_WM_CREATE()
ON_WM_SIZE()
ON_BN_CLICKED(IDC_BUTTON_LOAD, OnButtonLoad)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CDlgDHTMLEventsDlg message handlers
BOOL CDlgDHTMLEventsDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Add "About..." menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
return TRUE; // return TRUE unless you set the focus to a control
}
void CDlgDHTMLEventsDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.
void CDlgDHTMLEventsDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CDlgDHTMLEventsDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
int CDlgDHTMLEventsDlg::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CDialog::OnCreate(lpCreateStruct) == -1)
return -1;
m_pBrowser = NULL;
CRect rect;
this->GetClientRect(&rect);
m_pBrowser = new CWebBrowser2;
ASSERT(m_pBrowser);
BOOL bwb;
bwb = m_pBrowser->Create(NULL,
NULL,
WS_VISIBLE,
rect,
this,
IDC_WBC);
if (!bwb)
{
TRACE("failed to create browser/n");
return 0;
}
VARIANT varURL;
VariantInit(&varURL);
varURL.vt = VT_BSTR;
varURL.bstrVal = ::SysAllocString(L"about:blank");
m_pBrowser->Navigate2(&varURL, NULL, NULL, NULL, NULL);
VariantClear(&varURL);
return 0;
}
void CDlgDHTMLEventsDlg::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);
if (m_pBrowser)
{
m_pBrowser->SetWidth(cx);
m_pBrowser->SetHeight(cy);
m_pBrowser->MoveWindow(0, 65, cx, cy-65);
}
}
void CDlgDHTMLEventsDlg::OnButtonLoad()
{
LoadHTMLPage(m_strBaseAddress);
}
void CDlgDHTMLEventsDlg::LoadHTMLPage(CString strBaseAddress)
{
short sResult = FALSE;
HRESULT hr;
CString strhtml;
HGLOBAL hHMLText;
IStream* pIStream = NULL;
COleVariant noArg;
IPersistStreamInit* pPersistStreamInit = NULL;
LPDISPATCH pHTMLDoc = NULL;
LPTSTR lpsz = NULL;
pHTMLDoc = m_pBrowser->GetDocument();
DWORD dwIDR_HTMLResource;
dwIDR_HTMLResource = IDR_HTML;
LPVOID lpvHTMLResource =(LPVOID)::LoadResource(
NULL,
::FindResource( NULL,
MAKEINTRESOURCE(dwIDR_HTMLResource),
RT_HTML));
strhtml =(LPCTSTR)lpvHTMLResource;
INT nIndex = strhtml.Find(_T("<BASE>"), 0);
CString strBase(_T(" HREF='"));
strBase += strBaseAddress + _T("\\'");
strhtml.Insert(nIndex + 5, strBase);
lpsz = new TCHAR[strhtml.GetLength()+1];
_tcscpy(lpsz, strhtml);
hHMLText = ::GlobalAlloc(GPTR, lstrlen (lpsz) + 1);
lstrcpy ((CHAR*)hHMLText, lpsz);
hr = ::CreateStreamOnHGlobal(hHMLText, TRUE, &pIStream);
if (hr) goto cleanup;
hr = pHTMLDoc->QueryInterface(IID_IPersistStreamInit,
(void**)&pPersistStreamInit);
if (hr) goto cleanup;
hr = pPersistStreamInit->InitNew();
if (hr) goto cleanup;
hr = pPersistStreamInit->Load(pIStream);
m_bolLoaded = TRUE;
cleanup:
if(pHTMLDoc) pHTMLDoc->Release();
if(pPersistStreamInit) pPersistStreamInit->Release();
if(pIStream) pIStream->Release();
if (lpsz) delete [] lpsz;
pHTMLDoc = NULL;
pPersistStreamInit = NULL;
pIStream = NULL;
}
BEGIN_EVENTSINK_MAP(CDlgDHTMLEventsDlg, CDialog)
//{{AFX_EVENTSINK_MAP(CDlgDHTMLEventsDlg)
ON_EVENT(CDlgDHTMLEventsDlg, IDC_WBC, 250 /* BeforeNavigate2 */, OnBeforeNavigate2, VTS_DISPATCH VTS_PVARIANT VTS_PVARIANT VTS_PVARIANT VTS_PVARIANT VTS_PVARIANT VTS_PBOOL)
ON_EVENT(CDlgDHTMLEventsDlg, IDC_WBC, 259 /* DocumentComplete */, OnDocumentComplete, VTS_DISPATCH VTS_PVARIANT)
//}}AFX_EVENTSINK_MAP
END_EVENTSINK_MAP()
void CDlgDHTMLEventsDlg::OnBeforeNavigate2(LPDISPATCH pDisp,
VARIANT FAR* URL,
VARIANT FAR* Flags,
VARIANT FAR* TargetFrameName,
VARIANT FAR* PostData,
VARIANT FAR* Headers,
BOOL FAR* Cancel)
{
CString strURL(URL->bstrVal);
CString strXML(strURL.Right(strURL.GetLength()-6));
strXML.Replace("%20", " ");
if(strURL == _T("about:blank"))
*Cancel = FALSE;
else
{
ExtractXMLInfo(strXML);
*Cancel = TRUE;
}
}
void CDlgDHTMLEventsDlg::OnDocumentComplete(LPDISPATCH pDisp, VARIANT FAR* URL)
{
if( !m_bolLoaded)
LoadHTMLPage(m_strBaseAddress);
}
void CDlgDHTMLEventsDlg::ExtractXMLInfo(CString strXML)
{
HRESULT hr;
CComBSTR bstrxml (_T(strXML));
MSXML2::IXMLDOMDocument* pxmlDoc = NULL;
hr = CoInitialize(NULL);
if(FAILED(hr))
return;
hr = CoCreateInstance( MSXML2::CLSID_DOMDocument,
NULL,
CLSCTX_INPROC_SERVER,
MSXML2::IID_IXMLDOMDocument,
(void**)&pxmlDoc);
short sResult = FALSE;
if(SUCCEEDED(hr))
{
hr = pxmlDoc->loadXML(bstrxml, &sResult);
CComBSTR bstrValue;
CComBSTR bstrProc;
if(SUCCEEDED(hr))
{
if (sResult)
{
MSXML2::IXMLDOMNodeList* pnodeList = NULL;
MSXML2::IXMLDOMNode* pNode = NULL;
MSXML2::IXMLDOMNamedNodeMap* pNodeMap = NULL;
MSXML2::IXMLDOMNode* pattrNode = NULL;
hr = pxmlDoc->get_childNodes(&pnodeList);
hr = pnodeList->get_item(0, &pNode);
////////////////////////////////////////
CString strattr=_T("idevent");
BSTR bstrattr=strattr.AllocSysString();
_variant_t varvalue;
pNode->get_attributes(&pNodeMap);
hr = pNodeMap->getNamedItem(bstrattr, &pattrNode);
pattrNode->get_nodeValue(&varvalue);
CString strAttr(varvalue.bstrVal);
////////////////////////////////////////
pNode->get_text(&bstrValue);
CString strValue(bstrValue);
EventHandler(atoi(strAttr), strValue);
// cleanup
pNodeMap->Release();
pattrNode->Release();
pnodeList->Release();
pNode->Release();
::SysFreeString(bstrattr);
VariantClear(&varvalue);
}
}
pxmlDoc->Release();
}
CoUninitialize();
}
void CDlgDHTMLEventsDlg::EventHandler(INT nEvent, CString strValue)
{
CString strEvent(_T(""));
CString strMsg(_T("Value associated to event: "));
m_stcEvent.SetWindowText(_T(""));
m_stcValue.SetWindowText(_T(""));
switch(nEvent)
{
case 1:
strEvent = _T("Click event on 'End App' Button");
strMsg = _T("No value associated to event");
break;
case 2:
strEvent = _T("Click event on 'Validate' Button");
strMsg = _T("No value associated to event");
break;
case 3:
strEvent = _T("Click event on 'DHTML events' text");
strMsg += strValue;
break;
case 4:
strEvent = _T("Click event on Picture object");
strMsg += strValue;
break;
case 5:
strEvent = _T("OnChange event in Username Input element");
strMsg += strValue;
break;
case 6:
strEvent = _T("OnChange event in Password Input element");
strMsg += strValue;
break;
case 7:
strEvent = _T("OnMouseOver event on 'DHTML events' text");
strMsg += strValue;
break;
}
m_stcEvent.SetWindowText(strEvent);
m_stcValue.SetWindowText(strMsg);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -