⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 smartdartboard.cpp

📁 The source code samples for chapter 2, 4, 6, and 8 are contained in the EvenChapters project. Those
💻 CPP
字号:
// SmartDartBoard.cpp : Implementation of CSmartDartBoard

#include "stdafx.h"
#include "Controls.h"
#include "SmartDartBoard.h"

/////////////////////////////////////////////////////////////////////////////
// CSmartDartBoard

CSmartDartBoard::CSmartDartBoard()
: m_nScore(0)
{
  m_bWindowOnly = TRUE;
}

HRESULT CSmartDartBoard::SetScoreSpan()
{
  // Convert score to VARIANT
  CComVariant varScore = m_nScore;
  HRESULT hr = varScore.ChangeType(VT_BSTR);
  if( FAILED(hr) ) return hr;

  // Find score span element
  CComPtr<IHTMLElement> speScore;
  hr = GetHtmlElement(OLESTR("spanScore"), &speScore);
  if( FAILED(hr) ) return hr;

  // Set the element's inner text
  return speScore->put_innerText(varScore.bstrVal);
}

HRESULT CSmartDartBoard::GetHtmlElement(
  LPCOLESTR       pszElementID,
  IHTMLElement**  ppElement)
{
  ATLASSERT(ppElement);
  *ppElement = 0;

  // Get the document from the browser
  HRESULT hr = E_FAIL;
  CComPtr<IDispatch> spdispDoc;
  hr = m_spBrowser->get_Document(&spdispDoc);
  if( FAILED(hr) ) return hr;

  CComQIPtr<IHTMLDocument2> spDoc = spdispDoc;
  if( !spDoc ) return E_NOINTERFACE;

  // Get the All collection from the document
  CComPtr<IHTMLElementCollection> spAll;
  hr = spDoc->get_all(&spAll);
  if( FAILED(hr) ) return hr;

  // Get the element from the All collection
  CComVariant         varID = pszElementID;
  CComPtr<IDispatch>  spdispItem;
  hr = spAll->item(varID, CComVariant(0), &spdispItem);

  // Return the IHTMLElement interface
  return spdispItem->QueryInterface(ppElement);
}

// Message handlers
LRESULT CSmartDartBoard::OnDestroy(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
  // Crashes under IE5b2
  //DispEventUnadvise(m_spBrowser);
  return 0;
}

// Sink event handlers
void __stdcall CSmartDartBoard::OnDocumentComplete(IDispatch*, VARIANT*)
{
  // Set the spanScore object's inner HTML
  SetScoreSpan();

  // Retrieve the Reset button
  HRESULT hr;
  CComPtr<IHTMLElement> speReset;
  hr = GetHtmlElement(OLESTR("cmdReset"), &speReset);
  if( FAILED(hr) ) return;

  // Set up the connection point w/ the button
  ButtonEvents::DispEventAdvise(speReset);
}

VARIANT_BOOL __stdcall CSmartDartBoard::OnClickReset()
{
  ResetScore();
  return VARIANT_TRUE;
}

// ISmartDartBoard
STDMETHODIMP CSmartDartBoard::get_Score(/*[out, retval]*/ long *pVal)
{
  *pVal = m_nScore;
  return S_OK;
}

STDMETHODIMP CSmartDartBoard::put_Score(/*[in]*/ long newVal)
{
  m_nScore = newVal;
  FireOnChanged(1);

  // Update the <spanScore> inner text
  if( m_spBrowser ) return SetScoreSpan();

  return S_OK;
}

STDMETHODIMP CSmartDartBoard::ResetScore()
{
  return put_Score(0);
}

// ISmartDartBoardUI
STDMETHODIMP CSmartDartBoard::AddToScore(long ringValue)
{
  return put_Score(m_nScore + ringValue);
}

LRESULT CSmartDartBoard::OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
  // Wrap the control's window to use it to host control
  // (not an AtlAxWin, so no CAxHostWindow yet created)
  //CAxWindow wnd(m_hWnd);
  CAxWindow2 wnd(m_hWnd);
  
  // Create a CAxWinHost: It will subclass this window and
  // create a control based on an HTML resource.
  HRESULT hr = wnd.CreateControl(IDH_SMARTDARTBOARD);
  
  // Cache the IWebBrowser2 interface
  if (SUCCEEDED(hr))
    hr = wnd.QueryControl(IID_IWebBrowser2, (void**)&m_spBrowser);
  
  // Set up connection point w/ the browser
  if( SUCCEEDED(hr) )
    hr = BrowserEvents::DispEventAdvise(m_spBrowser);
  
  // Optional: Set the window.external interface
  if (SUCCEEDED(hr))
    hr = wnd.SetExternalDispatch(static_cast<ISmartDartBoardUI*>(this));

  // Optional: Set up the external UI handler
  //if( SUCCEEDED(hr) )
  //  hr = wnd.SetExternalUIHandler(this);

  // Turn off the context menu
  CComPtr<IAxWinAmbientDispatch> spAmbient;
  hr = wnd.QueryHost(&spAmbient);
  if( SUCCEEDED(hr) )
    spAmbient->put_AllowContextMenu(VARIANT_FALSE);
  
  return SUCCEEDED(hr) ? 0 : -1;
}

// ISmartDartBoard
STDMETHODIMP CSmartDartBoard::ShowContextMenu(
  DWORD dwID, 
  DWORD x, 
  DWORD y, 
  IUnknown* pcmdtReserved,  
  IDispatch* pdispReserved,
  HRESULT* dwRetVal)
{
  // Turn off IE4 context menu
  *dwRetVal = S_OK;
  return S_OK;
}

STDMETHODIMP CSmartDartBoard::GetHostInfo(
  DWORD* pdwFlags,
  DWORD* pdwDoubleClick)
{
  return E_NOTIMPL;
}

STDMETHODIMP CSmartDartBoard::ShowUI(
  DWORD dwID,
  IUnknown* pActiveObject,
  IUnknown* pCommandTarget,
  IUnknown* pFrame,
  IUnknown* pDoc,
  HRESULT* dwRetVal)
{
  return E_NOTIMPL;
}

STDMETHODIMP CSmartDartBoard::HideUI()
{
  return E_NOTIMPL;
}

STDMETHODIMP CSmartDartBoard::UpdateUI()
{
  return E_NOTIMPL;
}

STDMETHODIMP CSmartDartBoard::EnableModeless(
  VARIANT_BOOL fEnable)
{
  return E_NOTIMPL;
}

STDMETHODIMP CSmartDartBoard::OnDocWindowActivate(
  VARIANT_BOOL fActivate)
{
  return E_NOTIMPL;
}

STDMETHODIMP CSmartDartBoard::OnFrameWindowActivate(
  VARIANT_BOOL fActivate)
{
  return E_NOTIMPL;
}

STDMETHODIMP CSmartDartBoard::ResizeBorder(
  long left,
  long top,
  long right,
  long bottom,
  IUnknown * pUIWindow,
  VARIANT_BOOL fFrameWindow)
{
  return E_NOTIMPL;
}

STDMETHODIMP CSmartDartBoard::TranslateAccelerator(
  DWORD hWnd,
  DWORD nMessage,
  DWORD wParam,
  DWORD lParam,
  BSTR bstrGuidCmdGroup, 
  DWORD nCmdID,
  HRESULT* dwRetVal)
{
  return E_NOTIMPL;
}

STDMETHODIMP CSmartDartBoard::GetOptionKeyPath(
  BSTR* pbstrKey,
  DWORD dw)
{
  return E_NOTIMPL;
}

STDMETHODIMP CSmartDartBoard::GetDropTarget(
  IUnknown* pDropTarget, 
  IUnknown** ppDropTarget)
{
  return E_NOTIMPL;
}

STDMETHODIMP CSmartDartBoard::GetExternal(
  IDispatch **ppDispatch)
{
  (*ppDispatch = static_cast<ISmartDartBoardUI*>(this))->AddRef();
  return S_OK;
}

STDMETHODIMP CSmartDartBoard::TranslateUrl(
  DWORD dwTranslate,
  BSTR bstrURLIn,
  BSTR* pbstrURLOut)
{
  return E_NOTIMPL;
}

STDMETHODIMP CSmartDartBoard::FilterDataObject(
  IUnknown *pDO,
  IUnknown **ppDORet)
{
  return E_NOTIMPL;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -