Como desativar o menu pop-up padrão para CHtmlView no Visual C++

IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.

Clique aqui para ver a versão em Inglês deste artigo: 236312
Este artigo foi arquivado. É oferecido "como está" e não será mais atualizado.
Sumário
Crie um aplicativo CHtmlView Appwizard padrão. Quando você clica com o botão direito do mouse em qualquer site no Microsoft Internet Explorer, aparecerá um menu pop-up do padrão. Exemplo de driller (MFC) da Microsoft mostra como substituir esse comportamento para o controle WebBrowser para que esse menu pop-up não apareça. Você pode desativar esse menu pop-up se você não quiser que os usuários exibir origem ou propriedades da página da Web ou usar outros recursos, como os botões Voltar e Avançar. Ou, se você deseja adicionar sua própria funcionalidade para o menu pop-up, você também deve desativar o menu pop-up padrão.

Observação Driller (MFC) exemplo mostra como substituir esse comportamento somente para o controle WebBrowser. Ela não usa a classe CHtmlView.
Mais Informações
Este artigo se baseia no exemplo Driller (MFC), que está disponível no seguinte site da Microsoft: Driller inclui o código usado aqui para Custsite.h, Custsite.cpp, Idispimp.h e Idispimp.cpp. Esses métodos são suportados no Internet Explorer 4 e Internet Explorer 5.

Passos para desativar o menu pop-up padrão

  1. Crie um aplicativo gerados pelo AppWizard SDI chamado MySample. Na etapa 6/6 altere para CHtmlView.
  2. Abra MySample.h e adicione uma variável de membro público, como mostrado abaixo para a classe CMySampleApp:
    public:         class CImpIDispatch* m_pDispOM;					
  3. Adicione um novo arquivo de cabeçalho para o projeto chamado "Custsite.h". Copie e cole o código a seguir no-lo:
    //=--------------------------------------------------------------------------=//  (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						
  4. Adicionar um novo arquivo CPP chamado "Custsite.cpp" e adicione o código abaixo a ele:
    //=--------------------------------------------------------------------------=//  (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;}						
  5. Adicionar um novo arquivo de cabeçalho chamado "Idispimp.h" e adicionar o código a seguir a ele:
    /* * 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_						
  6. Adicionar um novo arquivo CPP chamado "Idispimp.cpp" e adicionar o código a seguir a ele:
    /* * 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_FILEstatic 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;}//IDispatchSTDMETHODIMP 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;}						
  7. Abra o MySample.cpp e, no CWinAppEx de CMySample, adicione o seguinte código. Também comentar a chamada para 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}						
  8. Adicione também o seguinte para a lista de inclusão de arquivos para MySample.cpp:
    #include "afxpriv.h"#include <..\src\occimpl.h>#include "CustSite.h"						
  9. Vá para MySample.h e adicione a instrução a seguir na parte inferior do arquivo.
    extern CMySampleApp theApp;						
  10. Agora vá para a guia ClassView e substituir a função virtual Create para CMySampleView. Substituir o corpo da função com o código mostrado abaixo, para a função deve ter aparência:
    BOOL CMySampleView::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext) {// create the view window itself	m_pCreateContext = pContext;	if (!CView::Create(lpszClassName, lpszWindowName,				dwStyle, rect, pParentWnd,  nID, pContext))	{		return FALSE;	}	RECT rectClient;	GetClientRect(&rectClient);	// create the control window	// AFX_IDW_PANE_FIRST is a safe but arbitrary ID	if (!m_wndBrowser.CreateControl(CLSID_WebBrowser, lpszWindowName,				WS_VISIBLE | WS_CHILD, rectClient, this, AFX_IDW_PANE_FIRST))	{		DestroyWindow();		return FALSE;	}	LPUNKNOWN lpUnk = m_wndBrowser.GetControlUnknown();	HRESULT hr = lpUnk->QueryInterface(IID_IWebBrowser2, (void**) &m_pBrowserApp);	if (!SUCCEEDED(hr))	{		m_pBrowserApp = NULL;		m_wndBrowser.DestroyWindow();		DestroyWindow();		return FALSE;	}	return TRUE;}						
  11. Recriar e executar o aplicativo. Quando você clica com o botão direito do mouse, o padrão menu pop-up não será exibido. Isso ocorre porque no método CCustomControlSite::XDocHostUIHandler::ShowContextMenu, o procedimento simplesmente retorna uma S_OK poder Mshtml.dll não tenta exibir seu próprio menu pop-up. Neste ponto, você também pode adicionar seu próprio menu pop-up para substituir o menu pop-up padrão.
Observação Se versões futuras do MFC alterar a implementação de COleControlSite ou COccManager, essa técnica para desativar o menu pop-up pode não funcionar. Se você estiver usando essa técnica para criar seu código, por favor ser informado que você talvez tenha que alterar seu código no futuro.
Driller, CHtmlView, pop-up, menu

Propriedades

ID do Artigo: 236312 - Última Revisão: 12/05/2015 15:07:53 - Revisão: 3.2

Microsoft Foundation Class Library 4.2

  • kbnosurvey kbarchive kbmt kbdhtml kbhowto kbieobj kbmenu kbwebbrowser KB236312 KbMtpt
Comentários