Artigo: 236312 - Última revisão: terça-feira, 21 de Novembro de 2006 - Revisão: 3.2

Como desactivar o menu de contexto predefinido para CHtmlView no Visual C++

Dica do SistemaEste artigo aplica-se a um sistema operativo diferente do que está a utilizar. Foi desactivado o conteúdo do artigo, que pode não ser relevante para si.

Nesta página

Expandir tudo | Reduzir tudo

Sumário

Crie um aplicação CHtmlView Appwizard predefinidos. Quando clica com o botão direito do rato em qualquer Web site no Microsoft Internet Explorer, aparece um menu de contexto predefinido. Exemplo de driller (MFC) da Microsoft mostra como substituir este comportamento para o controlo WebBrowser para que esse menu pop-up não apareça. Pode desactivar este menu de contexto se pretender que os utilizadores ver origem ou propriedades da página Web ou utilizar outras funcionalidades tais como os botões Retroceder e avançar. Ou, se pretende adicionar a suas próprias funcionalidade ao menu de contexto, também tem de desactivar o menu de contexto predefinido.

Nota Driller (MFC) exemplo mostra como substituir este comportamento só para o controlo WebBrowser. Não utiliza a classe CHtmlView.

Mais Informação

Este artigo baseia-se o exemplo Driller (MFC), que está disponível a partir do seguinte Web site da Microsoft:
http://msdn.microsoft.com/downloads/samples/Internet/browser/driller/Default.asp (http://www.microsoft.com/DOWNLOADS/details.aspx?FamilyID=ae22e7a9-611f-4112-8b17-0980412d07a5&displaylang=en)
Driller inclui o código aqui utilizado para Custsite.h, Custsite.cpp, Idispimp.h e Idispimp.cpp. Estes métodos são suportados no Internet Explorer 4 e Internet Explorer 5.

Passos para desactivar o menu de contexto predefinido

  1. Crie uma aplicação gerado pelo AppWizard SDI chamada MySample. No passo 6/6 altere para CHtmlView.
  2. Abra MySample.h e adicione uma variável de membro público, conforme ilustrado abaixo à classe CMySampleApp:
    public:
             class CImpIDispatch* m_pDispOM;
    					
  3. Adicione um novo ficheiro de cabeçalho ao projecto denominado "Custsite.h". Copiar e colá-lo o seguinte código:
    //=--------------------------------------------------------------------------=
    //  (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 ficheiro CPP denominado "Custsite.cpp" e adicionar o código abaixo à mesma:
    //=--------------------------------------------------------------------------=
    //  (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 ficheiro de cabeçalho chamado "Idispimp.h" e adicionar o seguinte código à mesma:
    /*
     * 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 ficheiro CPP denominado "Idispimp.cpp" e adicionar o seguinte código à mesma:
    /*
     * 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;
    }
    						
  7. Abra MySample.cpp e, em InitInstance de CMySample, adicione o código seguinte. 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 lista de ficheiros de inclusão para MySample.cpp:
    #include "afxpriv.h"
    #include <..\src\occimpl.h>
    #include "CustSite.h"
    						
  9. Vá para MySample.h e adicione a seguinte instrução na parte inferior do ficheiro.
    extern CMySampleApp theApp;
    						
  10. Agora vá para o separador Exibir classe e substituir a função virtual Create para CMySampleView. Substituir o corpo da função código apresentado abaixo, para a função deverá aspecto:
    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. Reconstruir e executar a aplicação. Quando clica com o botão direito do rato, a predefinição janelas de pop-up de menu não aparecerá. Isto acontece porque o método CCustomControlSite::XDocHostUIHandler::ShowContextMenu, o procedimento simplesmente devolve um S_OK isso já não tenta Mshtml.dll visualizar seu próprio menu pop-up. Neste ponto, pode também adicionar seu próprio menu pop-up para substituir o menu de contexto predefinido.
Nota Se a versões futuras do MFC alterar a implementação do COleControlSite ou COccManager, esta técnica para desactivar o menu de contexto poderá não funcionar. Se estiver a utilizar esta técnica para estruturar o código, atenção que poderá ter de alterar o código no futuro.

Referências

Driller exemplo (MFC)
http://www.microsoft.com/DOWNLOADS/details.aspx?FamilyID=ae22e7a9-611f-4112-8b17-0980412d07a5&displaylang=en (http://www.microsoft.com/DOWNLOADS/details.aspx?FamilyID=ae22e7a9-611f-4112-8b17-0980412d07a5&displaylang=en)

A informação contida neste artigo aplica-se a:
  • Microsoft Foundation Class Library 4.2 nas seguintes plataformas
    • Microsoft Visual C++ 6.0 Professional Edition
    • Microsoft Visual C++, 32-bit Learning Edition 6.0
    • Microsoft Visual C++ 6.0 Enterprise Edition
Palavras-chave: 
kbmt kbdhtml kbhowto kbieobj kbmenu kbwebbrowser KB236312 KbMtpt
Tradução automáticaTradução automática
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 revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 236312  (http://support.microsoft.com/kb/236312/en-us/ )