📄 uihtmlview.cpp
字号:
pElement->Release();
if (FAILED(hr))
return bRet;
IHTMLElement *pNewElem=NULL;
GetHTMLDocument()->createElement(_bstr_t(_T("OPTION")),&pNewElem);
IHTMLOptionElement *pNewOptElem=NULL;
hr = E_FAIL;
if (pNewElem)
hr = pNewElem->QueryInterface(IID_IHTMLOptionElement,(LPVOID*)&pNewOptElem);
if (SUCCEEDED(hr))
{
if (pszValue)
{
_bstr_t bsValue(pszValue);
pNewOptElem->put_value(bsValue);
}
_bstr_t bsText(pszText);
pNewOptElem->put_text(bsText);
pSelElem->add(pNewElem,_variant_t(vtMissing));
pNewOptElem->Release();
if (bSelect)
{
long nLength=0;
pSelElem->get_length(&nLength);
if (nLength > 0)
pSelElem->put_selectedIndex(nLength-1);
}
bRet=true;
}
if (pSelElem)
pSelElem->Release();
return bRet;
}
void CUIHtmlView::GetElement(LPCTSTR pszID,IHTMLElement **pElement)
{
*pElement=NULL;
if (m_pHTMLDocument2 == NULL)
return;
CComQIPtr<IHTMLElementCollection> spAllElements;
m_pHTMLDocument2->get_all(&spAllElements);
if (spAllElements)
{
IDispatch *pDisp=NULL;
HRESULT hr = spAllElements->item(CComVariant(pszID),CComVariant(0),&pDisp);
if (SUCCEEDED(hr))
{
hr = pDisp->QueryInterface(IID_IHTMLElement,(LPVOID*)pElement);
}
pDisp->Release();
}
}
void CUIHtmlView::ParseDocument()
{
if(m_pHTMLDocument2 == NULL)
return;
try
{
CComQIPtr<IHTMLDocument2> spDocument(m_pHTMLDocument2);
CComQIPtr<IHTMLElementCollection> spAllElements;
spDocument->get_all(&spAllElements);
CComBSTR bsIsControl(_T("OBJECT"));
CComBSTR bsIsImage(_T("IMG"));
long nElems;
spAllElements->get_length(&nElems);
for(long i = 0; i < nElems; i++)
{
CComVariant vIndex(i, VT_I4);
LPDISPATCH pDisp=NULL;
spAllElements->item(vIndex,vIndex,&pDisp);
CComQIPtr<IHTMLElement> spAnElement(pDisp);
pDisp->Release();
CComBSTR bsTagName;
spAnElement->get_tagName(&bsTagName);
if(bsTagName == bsIsControl)
{
// This will get you any ActiveX controls in a page. It is possible
// to call methods and properties of the control off the IHTMLElementPtr.
CComQIPtr<IHTMLObjectElement> spObj(spAnElement);
ActiveXControl(spObj);
}
else if(bsTagName == bsIsImage)
{
CComQIPtr<IHTMLImgElement> spImg(spAnElement);
ImageElement(spImg);
}
else
Element(spAnElement);
}
}
catch(...)
{
#ifdef _DEBUG
AfxMessageBox(_T("Unspecified exception thrown in UIHtmlView"),MB_ICONSTOP);
#endif
throw;
}
}
void CUIHtmlView::ActiveXControl(IHTMLObjectElement *pObj)
{
}
void CUIHtmlView::ImageElement(IHTMLImgElement *pImg)
{
}
void CUIHtmlView::Element(IHTMLElement *pElement)
{
}
void CUIHtmlView::DoDataExchange(CDataExchange* pDX)
{
CHtmlView::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CUIHtmlView)
// NOTE: the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CUIHtmlView, CHtmlView)
//{{AFX_MSG_MAP(CUIHtmlView)
ON_WM_SETCURSOR()
ON_COMMAND(ID_BROWSER_GO_BACK, OnBrowserGoBack)
ON_COMMAND(ID_BROWSER_GO_FORWARD, OnBrowserGoForward)
ON_COMMAND(ID_BROWSER_GO_BACK, OnBrowserGoBack)
ON_UPDATE_COMMAND_UI(ID_BROWSER_GO_FORWARD, OnUpdateBrowserGoForward)
ON_UPDATE_COMMAND_UI(ID_BROWSER_GO_BACK, OnUpdateBrowserGoBack)
ON_COMMAND(ID_BROWSER_GO_HOME, OnBrowserGoHome)
ON_COMMAND(ID_BROWSER_REFRESH, OnBrowserRefresh)
ON_COMMAND(ID_BROWSER_STOP, OnBrowserStop)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CUIHtmlView diagnostics
#ifdef _DEBUG
void CUIHtmlView::AssertValid() const
{
CHtmlView::AssertValid();
}
void CUIHtmlView::Dump(CDumpContext& dc) const
{
CHtmlView::Dump(dc);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CUIHtmlView message handlers
void CUIHtmlView::DocumentComplete(LPDISPATCH pDisp, VARIANT* URL)
{
// TODO: Add your specialized code here and/or call the base class
HRESULT hr;
LPUNKNOWN lpUnknown;
LPUNKNOWN lpUnknownWB = NULL;
LPUNKNOWN lpUnknownDC = NULL;
lpUnknown = m_wndBrowser.GetControlUnknown();
ASSERT(lpUnknown);
if (lpUnknown)
{
// Get the IUnknown of the WebBrowser control being hosted.
// The IUnknown returned from GetControlUnknown is not the
// IUnknown of the WebBrowser control. It's actually a
// IOleObject pointer.
//
hr = lpUnknown->QueryInterface(IID_IUnknown,
(LPVOID*)&lpUnknownWB);
ASSERT(SUCCEEDED(hr));
if (FAILED(hr))
return;
// Get the IUnknown of the object that fired this event.
//
hr = pDisp->QueryInterface(IID_IUnknown, (LPVOID*)&lpUnknownDC);
ASSERT(SUCCEEDED(hr));
if (SUCCEEDED(hr) && lpUnknownWB == lpUnknownDC)
{
// The document has finished loading.
//
LPDISPATCH pDispatch = GetHtmlDocument();
if (pDispatch)
{
hr = pDispatch->QueryInterface(IID_IHTMLDocument2,(LPVOID*)&m_pHTMLDocument2);
DocumentReady();
pDispatch->Release();
}
}
if (lpUnknownWB)
lpUnknownWB->Release();
if (lpUnknownDC)
lpUnknownDC->Release();
}
}
void CUIHtmlView::OnBeforeNavigate2(LPCTSTR lpszURL, DWORD nFlags, LPCTSTR lpszTargetFrameName, CByteArray& baPostedData, LPCTSTR lpszHeaders, BOOL* pbCancel)
{
// TODO: Add your specialized code here and/or call the base class ReleaseDocument();
m_bSetCursor = true;
#ifdef _DEBUG
if (GetKeyState(VK_LCONTROL) < 0)
{
if (baPostedData.GetSize() > 0)
{
LPTSTR pszData = new TCHAR[baPostedData.GetSize()+1];
LPTSTR pszPosted = pszData;
for(int i=0;i < baPostedData.GetSize();i++)
{
*pszPosted = baPostedData[i];
pszPosted =_tcsinc(pszPosted);
}
*pszPosted = '\0';
CString sMess;
sMess = _T("Posted Data: ");
sMess += pszData;
sMess += _T("\n");
sMess += _T("URL: ");
sMess += lpszURL;
AfxMessageBox(sMess);
delete pszData;
}
}
#endif
ReleaseDocument();
if (m_hNotifyWnd)
{
::SendMessage(m_hNotifyWnd,WM_APP_CB_IE_SET_EDIT_TEXT,(WPARAM)lpszURL,0);
}
CHtmlView::OnBeforeNavigate2(lpszURL, nFlags, lpszTargetFrameName, baPostedData, lpszHeaders, pbCancel);
}
BOOL CUIHtmlView::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
// TODO: Add your message handler code here and/or call default
if (m_bSetCursor)
{
SetCursor(::LoadCursor(NULL,IDC_APPSTARTING));
return TRUE;
}
return CHtmlView::OnSetCursor(pWnd, nHitTest, message);
}
void CUIHtmlView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint)
{
// TODO: Add your specialized code here and/or call the base class
}
void CUIHtmlView::OnActivateView(BOOL bActivate, CView* pActivateView, CView* pDeactiveView)
{
// TODO: Add your specialized code here and/or call the base class
CHtmlView::OnActivateView(bActivate, pActivateView, pDeactiveView);
if (bActivate && pDeactiveView != NULL)
{
OnTitleChange(GetLocationURL());
SetActiveWindow();
}
}
void CUIHtmlView::OnCommandStateChange(long nCommand, BOOL bEnable)
{
// TODO: Add your specialized code here and/or call the base class
switch(nCommand)
{
case CSC_NAVIGATEFORWARD:
m_bGoForward = bEnable;
break;
case CSC_NAVIGATEBACK:
m_bGoBack = bEnable;
break;
default:
break;
}
CHtmlView::OnCommandStateChange(nCommand, bEnable);
}
void CUIHtmlView::OnUpdateBrowserGoBack(CCmdUI *pUI)
{
pUI->Enable(m_bGoBack);
}
void CUIHtmlView::OnUpdateBrowserGoForward(CCmdUI *pUI)
{
pUI->Enable(m_bGoForward);
}
void CUIHtmlView::OnBrowserGoBack()
{
// TODO: Add your command handler code here
GoBack();
}
void CUIHtmlView::OnBrowserGoForward()
{
// TODO: Add your command handler code here
GoForward();
}
void CUIHtmlView::OnBrowserGoHome()
{
// TODO: Add your command handler code here
GoHome();
}
void CUIHtmlView::OnBrowserRefresh()
{
// TODO: Add your command handler code here
Refresh();
}
void CUIHtmlView::OnBrowserStop()
{
// TODO: Add your command handler code here
Stop();
}
void CUIHtmlView::OnDocumentComplete(LPCTSTR lpszUrl)
{
// make sure the main frame has the new URL. This call also stops the animation
if (m_hNotifyWnd)
{
::SendMessage(m_hNotifyWnd,WM_APP_CB_IE_SET_EDIT_TEXT,(WPARAM)lpszUrl,0);
}
CHtmlView::OnDocumentComplete(lpszUrl);
}
void CUIHtmlView::OnTitleChange(LPCTSTR lpszText)
{
// this will change the main frame's title bar
if (m_pDocument != NULL)
m_pDocument->SetTitle(lpszText);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -