国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
去除WebBrowser控件的邊界和ScrollBar
http://wenhaobing.spaces.live.com/blog/cns!9d6443eb4bff9145!122.entry

2005/10/11

邊界系列二:去除WebBrowser控件的邊界和ScrollBar

參考文章:
MSDN Q324419:BUG: Scroll Bars and Borders Appear in Framesets When You Navigate Again in BeforeNavigate;
MSDN Q236312:How to disable the default pop-up menu for CHtmlView in Visual C++;
MSDN Q196835:How to override the default behavior of several of the MFC control container interface methods in Visual C++;

成因:WebBrowser控件邊界的成因簡單的說是Bug而不同于CFormView邊界的成因(Style),因?yàn)樵诓粚ebBrowser進(jìn)行Navigate的時(shí)候,是不會出現(xiàn)邊界和ScrollBar的。

解決方案:
上面提到的第一篇文章中,有詳細(xì)的解決去除ScrollBar的方法的,主要是用到重寫DocumentComplete的方法,就可以解決ScrollBar的問題,第一篇文章中,只是粗粗提到了要用重寫GetHostInfo的方法來解決邊界問題,但是說的并不夠詳細(xì),查閱了另外兩篇參考文章后,終于得解,下面只提供解決步驟,詳細(xì)原因請自我分析:

假定新建了一個(gè)對話框或單/多文檔工程MySample
步驟一:在MySample.h中加入為CMySampleApp類加入public成員變量:
public:
         class CImpIDispatch* m_pDispOM;

步驟二:為工程加入頭文件Custsite.h,內(nèi)容如下:
//=--------------------------------------------------------------------------=
//  (C) Copyright 1996-1999 Microsoft Corporation. All Rights Reserved.
//=--------------------------------------------------------------------------=
#ifndef __CUSTOMSITEH__
#define __CUSTOMSITEH__

#include "idispimp.h"
#include <mshtmhst.h>

//
// NOTE:
// Some of the code in this file is MFC implementation specific.
// Changes in future versions of MFC implementation may require
// the code to be changed. Please check the readme of this
// sample for more information
//

class CCustomControlSite:public COleControlSite
{
public:
 CCustomControlSite(COleControlContainer *pCnt):COleControlSite(pCnt){}

protected:

 DECLARE_INTERFACE_MAP();
BEGIN_INTERFACE_PART(DocHostUIHandler, IDocHostUIHandler)
 STDMETHOD(ShowContextMenu)(/* [in] */ DWORD dwID,
            /* [in] */ POINT __RPC_FAR *ppt,
            /* [in] */ IUnknown __RPC_FAR *pcmdtReserved,
            /* [in] */ IDispatch __RPC_FAR *pdispReserved);
 STDMETHOD(GetHostInfo)(
            /* [out][in] */ DOCHOSTUIINFO __RPC_FAR *pInfo);
 STDMETHOD(ShowUI)(
            /* [in] */ DWORD dwID,
            /* [in] */ IOleInPlaceActiveObject __RPC_FAR *pActiveObject,
            /* [in] */ IOleCommandTarget __RPC_FAR *pCommandTarget,
            /* [in] */ IOleInPlaceFrame __RPC_FAR *pFrame,
            /* [in] */ IOleInPlaceUIWindow __RPC_FAR *pDoc);
 STDMETHOD(HideUI)(void);
 STDMETHOD(UpdateUI)(void);
 STDMETHOD(EnableModeless)(/* [in] */ BOOL fEnable);
 STDMETHOD(OnDocWindowActivate)(/* [in] */ BOOL fEnable);
 STDMETHOD(OnFrameWindowActivate)(/* [in] */ BOOL fEnable);
 STDMETHOD(ResizeBorder)(
            /* [in] */ LPCRECT prcBorder,
            /* [in] */ IOleInPlaceUIWindow __RPC_FAR *pUIWindow,
            /* [in] */ BOOL fRameWindow);
 STDMETHOD(TranslateAccelerator)(
            /* [in] */ LPMSG lpMsg,
            /* [in] */ const GUID __RPC_FAR *pguidCmdGroup,
            /* [in] */ DWORD nCmdID);
 STDMETHOD(GetOptionKeyPath)(
            /* [out] */ LPOLESTR __RPC_FAR *pchKey,
            /* [in] */ DWORD dw);
 STDMETHOD(GetDropTarget)(
            /* [in] */ IDropTarget __RPC_FAR *pDropTarget,
            /* [out] */ IDropTarget __RPC_FAR *__RPC_FAR *ppDropTarget);
    STDMETHOD(GetExternal)(
            /* [out] */ IDispatch __RPC_FAR *__RPC_FAR *ppDispatch);
    STDMETHOD(TranslateUrl)(
            /* [in] */ DWORD dwTranslate,
            /* [in] */ OLECHAR __RPC_FAR *pchURLIn,
            /* [out] */ OLECHAR __RPC_FAR *__RPC_FAR *ppchURLOut);
    STDMETHOD(FilterDataObject)(
            /* [in] */ IDataObject __RPC_FAR *pDO,
            /* [out] */ IDataObject __RPC_FAR *__RPC_FAR *ppDORet);
END_INTERFACE_PART(DocHostUIHandler)
};


class CCustomOccManager :public COccManager
{
public:
 CCustomOccManager(){}
 COleControlSite* CreateSite(COleControlContainer* pCtrlCont)
 {
  CCustomControlSite *pSite = new CCustomControlSite(pCtrlCont);
  return pSite;
 }
};

#endif

步驟三:為工程加入CPP文件Custsite.cpp,內(nèi)容如下:
//=--------------------------------------------------------------------------=
//  (C) Copyright 1996-1999 Microsoft Corporation. All Rights Reserved.
//=--------------------------------------------------------------------------=


//
// NOTE:
// Some of the code in this file is MFC implementation specific.
// Changes in future versions of MFC implementation may require
// the code to be changed. Please check the readme of this
// sample for more information
//

#include "stdafx.h"
#undef AFX_DATA
#define AFX_DATA AFX_DATA_IMPORT
#include "MySample.h"


// NOTE: This line is a hardcoded reference to an MFC header file
//  this path may need to be changed to refer to the location of VC5 install
//  for successful compilation.


#include <..\src\occimpl.h>
#undef AFX_DATA
#define AFX_DATA AFX_DATA_EXPORT
#include "custsite.h"

 

BEGIN_INTERFACE_MAP(CCustomControlSite, COleControlSite)
 INTERFACE_PART(CCustomControlSite, IID_IDocHostUIHandler, DocHostUIHandler)
END_INTERFACE_MAP()

 

ULONG FAR EXPORT  CCustomControlSite::XDocHostUIHandler::AddRef()
{
 METHOD_PROLOGUE(CCustomControlSite, DocHostUIHandler)
 return pThis->ExternalAddRef();
}


ULONG FAR EXPORT  CCustomControlSite::XDocHostUIHandler::Release()
{
    METHOD_PROLOGUE(CCustomControlSite, DocHostUIHandler)
 return pThis->ExternalRelease();
}

HRESULT FAR EXPORT  CCustomControlSite::XDocHostUIHandler::QueryInterface(REFIID riid, void **ppvObj)
{
 METHOD_PROLOGUE(CCustomControlSite, DocHostUIHandler)
    HRESULT hr = (HRESULT)pThis->ExternalQueryInterface(&riid, ppvObj);
 return hr;
}

// * CImpIDocHostUIHandler::GetHostInfo
// *
// * Purpose: Called at initialization
// *
HRESULT FAR EXPORT  CCustomControlSite::XDocHostUIHandler::GetHostInfo( DOCHOSTUIINFO* pInfo )
{

 METHOD_PROLOGUE(CCustomControlSite, DocHostUIHandler)
 pInfo->dwFlags = DOCHOSTUIFLAG_NO3DBORDER;
    pInfo->dwDoubleClick = DOCHOSTUIDBLCLK_DEFAULT;

    return S_OK;
}

// * CImpIDocHostUIHandler::ShowUI
// *
// * Purpose: Called when MSHTML.DLL shows its UI
// *
HRESULT FAR EXPORT  CCustomControlSite::XDocHostUIHandler::ShowUI(
    DWORD dwID,
    IOleInPlaceActiveObject * /*pActiveObject*/,
    IOleCommandTarget * pCommandTarget,
    IOleInPlaceFrame * /*pFrame*/,
    IOleInPlaceUIWindow * /*pDoc*/)
{

 METHOD_PROLOGUE(CCustomControlSite, DocHostUIHandler)
 // We've already got our own UI in place so just return S_OK
    return S_OK;
}

// * CImpIDocHostUIHandler::HideUI
// *
// * Purpose: Called when MSHTML.DLL hides its UI
// *
HRESULT FAR EXPORT  CCustomControlSite::XDocHostUIHandler::HideUI(void)
{
 METHOD_PROLOGUE(CCustomControlSite, DocHostUIHandler)
    return S_OK;
}

// * CImpIDocHostUIHandler::UpdateUI
// *
// * Purpose: Called when MSHTML.DLL updates its UI
// *
HRESULT FAR EXPORT  CCustomControlSite::XDocHostUIHandler::UpdateUI(void)
{
 METHOD_PROLOGUE(CCustomControlSite, DocHostUIHandler)
 // MFC is pretty good about updating it's UI in it's Idle loop so I don't do anything here
 return S_OK;
}

// * CImpIDocHostUIHandler::EnableModeless
// *
// * Purpose: Called from MSHTML.DLL's IOleInPlaceActiveObject::EnableModeless
// *
HRESULT FAR EXPORT  CCustomControlSite::XDocHostUIHandler::EnableModeless(BOOL /*fEnable*/)
{
 METHOD_PROLOGUE(CCustomControlSite, DocHostUIHandler)
    return E_NOTIMPL;
}

// * CImpIDocHostUIHandler::OnDocWindowActivate
// *
// * Purpose: Called from MSHTML.DLL's IOleInPlaceActiveObject::OnDocWindowActivate
// *
HRESULT FAR EXPORT  CCustomControlSite::XDocHostUIHandler::OnDocWindowActivate(BOOL /*fActivate*/)
{
 METHOD_PROLOGUE(CCustomControlSite, DocHostUIHandler)
    return E_NOTIMPL;
}

// * CImpIDocHostUIHandler::OnFrameWindowActivate
// *
// * Purpose: Called from MSHTML.DLL's IOleInPlaceActiveObject::OnFrameWindowActivate
// *
HRESULT FAR EXPORT  CCustomControlSite::XDocHostUIHandler::OnFrameWindowActivate(BOOL /*fActivate*/)
{
 METHOD_PROLOGUE(CCustomControlSite, DocHostUIHandler)
    return E_NOTIMPL;
}

// * CImpIDocHostUIHandler::ResizeBorder
// *
// * Purpose: Called from MSHTML.DLL's IOleInPlaceActiveObject::ResizeBorder
// *
HRESULT FAR EXPORT  CCustomControlSite::XDocHostUIHandler::ResizeBorder(
    LPCRECT /*prcBorder*/,
    IOleInPlaceUIWindow* /*pUIWindow*/,
    BOOL /*fRameWindow*/)
{
 METHOD_PROLOGUE(CCustomControlSite, DocHostUIHandler)
    return E_NOTIMPL;
}

// * CImpIDocHostUIHandler::ShowContextMenu
// *
// * Purpose: Called when MSHTML.DLL would normally display its context menu
// *
HRESULT FAR EXPORT  CCustomControlSite::XDocHostUIHandler::ShowContextMenu(
    DWORD /*dwID*/,
    POINT* /*pptPosition*/,
    IUnknown* /*pCommandTarget*/,
    IDispatch* /*pDispatchObjectHit*/)
{
 METHOD_PROLOGUE(CCustomControlSite, DocHostUIHandler)
    return S_OK; // We've shown our own context menu. MSHTML.DLL will no longer try to show its own.
}

// * CImpIDocHostUIHandler::TranslateAccelerator
// *
// * Purpose: Called from MSHTML.DLL's TranslateAccelerator routines
// *
HRESULT FAR EXPORT  CCustomControlSite::XDocHostUIHandler::TranslateAccelerator(LPMSG lpMsg,
            /* [in] */ const GUID __RPC_FAR *pguidCmdGroup,
            /* [in] */ DWORD nCmdID)
{
 METHOD_PROLOGUE(CCustomControlSite, DocHostUIHandler)
    return S_FALSE;
}

// * CImpIDocHostUIHandler::GetOptionKeyPath
// *
// * Purpose: Called by MSHTML.DLL to find where the host wishes to store
// * its options in the registry
// *
HRESULT FAR EXPORT  CCustomControlSite::XDocHostUIHandler::GetOptionKeyPath(BSTR* pbstrKey, DWORD)
{

 METHOD_PROLOGUE(CCustomControlSite, DocHostUIHandler)
 return E_NOTIMPL;
}

STDMETHODIMP CCustomControlSite::XDocHostUIHandler::GetDropTarget(
            /* [in] */ IDropTarget __RPC_FAR *pDropTarget,
            /* [out] */ IDropTarget __RPC_FAR *__RPC_FAR *ppDropTarget)
{
 METHOD_PROLOGUE(CCustomControlSite, DocHostUIHandler)
    return E_NOTIMPL;
}


STDMETHODIMP CCustomControlSite::XDocHostUIHandler::GetExternal(
            /* [out] */ IDispatch __RPC_FAR *__RPC_FAR *ppDispatch)
{
 // return the IDispatch we have for extending the object Model
 IDispatch* pDisp = (IDispatch*)theApp.m_pDispOM;
 pDisp->AddRef();
 *ppDispatch = pDisp;
    return S_OK;
}

STDMETHODIMP CCustomControlSite::XDocHostUIHandler::TranslateUrl(
            /* [in] */ DWORD dwTranslate,
            /* [in] */ OLECHAR __RPC_FAR *pchURLIn,
            /* [out] */ OLECHAR __RPC_FAR *__RPC_FAR *ppchURLOut)
{
 METHOD_PROLOGUE(CCustomControlSite, DocHostUIHandler)
    return E_NOTIMPL;
}

STDMETHODIMP CCustomControlSite::XDocHostUIHandler::FilterDataObject(
            /* [in] */ IDataObject __RPC_FAR *pDO,
            /* [out] */ IDataObject __RPC_FAR *__RPC_FAR *ppDORet)
{
 METHOD_PROLOGUE(CCustomControlSite, DocHostUIHandler)
    return E_NOTIMPL;
}

步驟四:為工程加入頭文件Idispimp.h,內(nèi)容如下:
/*
 * IDispimp.H
 * IDispatch
 *
 * Copyright (c)1995-1999 Microsoft Corporation, All Rights Reserved
 */


#ifndef _IDISPIMP_H_
#define _IDISPIMP_H_

class CImpIDispatch : public IDispatch
{
    protected:
        ULONG               m_cRef;

    public:
        CImpIDispatch(void);
        ~CImpIDispatch(void);

        STDMETHODIMP QueryInterface(REFIID, void **);
        STDMETHODIMP_(ULONG) AddRef(void);
        STDMETHODIMP_(ULONG) Release(void);

  //IDispatch
        STDMETHODIMP GetTypeInfoCount(UINT* pctinfo);
        STDMETHODIMP GetTypeInfo(/* [in] */ UINT iTInfo,
            /* [in] */ LCID lcid,
            /* [out] */ ITypeInfo** ppTInfo);
  STDMETHODIMP GetIDsOfNames(
            /* [in] */ REFIID riid,
            /* [size_is][in] */ LPOLESTR *rgszNames,
            /* [in] */ UINT cNames,
            /* [in] */ LCID lcid,
            /* [size_is][out] */ DISPID *rgDispId);
  STDMETHODIMP Invoke(
            /* [in] */ DISPID dispIdMember,
            /* [in] */ REFIID riid,
            /* [in] */ LCID lcid,
            /* [in] */ WORD wFlags,
            /* [out][in] */ DISPPARAMS  *pDispParams,
            /* [out] */ VARIANT  *pVarResult,
            /* [out] */ EXCEPINFO *pExcepInfo,
            /* [out] */ UINT *puArgErr);

};
#endif //_IDISPIMP_H_

步驟五:為工程加入CPP文件Idispimp.cpp,內(nèi)容如下: 
/*
 * idispimp.CPP
 * IDispatch for Extending Dynamic HTML Object Model
 *
 * Copyright (c)1995-1999 Microsoft Corporation, All Rights Reserved
 */

#include "stdafx.h"
#include "idispimp.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif


// Hardcoded information for extending the Object Model
// Typically this would be supplied through a TypeInfo
// In this case the name "xxyyzz" maps to DISPID_Extend
const WCHAR pszExtend[10]=L"xxyyzz";
#define DISPID_Extend 12345

 

/*
 * CImpIDispatch::CImpIDispatch
 * CImpIDispatch::~CImpIDispatch
 *
 * Parameters (Constructor):
 *  pSite           PCSite of the site we're in.
 *  pUnkOuter       LPUNKNOWN to which we delegate.
 */

CImpIDispatch::CImpIDispatch( void )
{
    m_cRef = 0;
}

CImpIDispatch::~CImpIDispatch( void )
{
 ASSERT( m_cRef == 0 );
}


/*
 * CImpIDispatch::QueryInterface
 * CImpIDispatch::AddRef
 * CImpIDispatch::Release
 *
 * Purpose:
 *  IUnknown members for CImpIDispatch object.
 */

STDMETHODIMP CImpIDispatch::QueryInterface( REFIID riid, void **ppv )
{
    *ppv = NULL;


    if ( IID_IDispatch == riid )
 {
        *ppv = this;
 }

 if ( NULL != *ppv )
    {
        ((LPUNKNOWN)*ppv)->AddRef();
        return NOERROR;
    }

 return E_NOINTERFACE;
}


STDMETHODIMP_(ULONG) CImpIDispatch::AddRef(void)
{
    return ++m_cRef;
}

STDMETHODIMP_(ULONG) CImpIDispatch::Release(void)
{
    return --m_cRef;
}


//IDispatch
STDMETHODIMP CImpIDispatch::GetTypeInfoCount(UINT* /*pctinfo*/)
{
 return E_NOTIMPL;
}

STDMETHODIMP CImpIDispatch::GetTypeInfo(/* [in] */ UINT /*iTInfo*/,
            /* [in] */ LCID /*lcid*/,
            /* [out] */ ITypeInfo** /*ppTInfo*/)
{
 return E_NOTIMPL;
}

STDMETHODIMP CImpIDispatch::GetIDsOfNames(
            /* [in] */ REFIID riid,
            /* [size_is][in] */ OLECHAR** rgszNames,
            /* [in] */ UINT cNames,
            /* [in] */ LCID lcid,
            /* [size_is][out] */ DISPID* rgDispId)
{
 HRESULT hr;
 UINT i;

 // Assume some degree of success
 hr = NOERROR;

 // Hardcoded mapping for this sample
 // A more usual procedure would be to use a TypeInfo
 for ( i=0; i < cNames; i++)
 {
  if (  2 == CompareString( lcid, NORM_IGNOREWIDTH, (char*)pszExtend, 3, (char*)rgszNames[i], 3 ) )
  {
   rgDispId[i] = DISPID_Extend;
  }
  else
  {
   // One or more are unknown so set the return code accordingly
   hr = ResultFromScode(DISP_E_UNKNOWNNAME);
   rgDispId[i] = DISPID_UNKNOWN;
  }
 }
 return hr;
}

STDMETHODIMP CImpIDispatch::Invoke(
            /* [in] */ DISPID dispIdMember,
            /* [in] */ REFIID /*riid*/,
            /* [in] */ LCID /*lcid*/,
            /* [in] */ WORD wFlags,
            /* [out][in] */ DISPPARAMS* pDispParams,
            /* [out] */ VARIANT* pVarResult,
            /* [out] */ EXCEPINFO* /*pExcepInfo*/,
            /* [out] */ UINT* puArgErr)
{

 // For this sample we only support a Property Get on DISPID_Extend
 // returning a BSTR with "Wibble" as the value
 if ( dispIdMember == DISPID_Extend )
 {
  if ( wFlags & DISPATCH_PROPERTYGET )
  {
   if ( pVarResult != NULL )
   {
    WCHAR buff[10]=L"Wibble";
    BSTR bstrRet = SysAllocString( buff );
    VariantInit(pVarResult);
    V_VT(pVarResult)=VT_BSTR;
    V_BSTR(pVarResult) = bstrRet;
   }
  }
 }

 return S_OK;
}

步驟六:打開MySample.cpp并在CMySample類的InitInstance函數(shù)中加入如下代碼,另外請注掉原有的AfxEnableControlContainer():
BOOL CMySampleApp::InitInstance()
{
 CCustomOccManager *pMgr = new CCustomOccManager;

 // Create an IDispatch class for extending the Dynamic HTML Object Model
 m_pDispOM = new CImpIDispatch;

 // Set our control containment up but using our control container
 // management class instead of MFC's default
 AfxEnableControlContainer(pMgr);


// AfxEnableControlContainer();
//... rest of the code here
}

步驟七:把以下include文件添加到MySample.h中去(注意這里與參考文獻(xiàn)稍有差別)
#include <afxpriv.h>
#if (_MFC_VER < 0x0700)
#include <..\src\occimpl.h> // For COccManager
#else
#include <afxocc.h>
#endif
#include "CustSite.h"
(其中對MFC版本的判斷是因?yàn)閂C7的版本中occimpl.h已經(jīng)被去除了)

步驟八:在MySample.h文件最后加入以下語句:
extern CMySampleApp theApp;
(很可能這行已經(jīng)由MFC自動(dòng)添加了)

以上就是整體解決方案,利用此種方法,還可以對WebBrowser進(jìn)行其他擴(kuò)展,以后再說   


(#)

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
CDHtmlDialog探索
OCX控件避免彈出安全警告的類
在PowerPoint中插入視頻文件的方法
c#界面隨電腦分辨率自動(dòng)適應(yīng)
12.地圖組件(36頁擴(kuò)展基礎(chǔ)知識)
Flash builder 4 學(xué)習(xí)筆記
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服