none
拖一个文件到CHtmlvew对象上就会下载怎么办?我想把不让它下载,而让主程序处理 RRS feed

  • 问题

  • 一个对话框程序自制的播放器,里面加载了一个chtmlview对象,以前拖一个MP3文件到CHtmlView对象上会调主对话框的WM_DROPFILES进行处理,我在这里实现播放.但后来为了屏蔽CHTMLVIEW的脚本错误,自己实现了一个class CCustomControlSite :
     public COleControlSite实现屏蔽脚本错误,但现在拖动文件到CHtmlView对象网页上时,会弹出下载保存对话框,不在调主对话框的WM_DROPFILES消息路径了,在CHTMLVIEW里也根本没WM_DROPFILES消息.
    我该如何做呢,先谢谢各位了!

    下面是CCustomControlSite 类的实现

    #pragma once
    #include "afxocc.h"

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

    protected:
     DECLARE_INTERFACE_MAP()

     BEGIN_INTERFACE_PART(OleCommandTarget, IOleCommandTarget)
      STDMETHOD_(HRESULT, QueryStatus)(const GUID* pguidCmdGroup,
               ULONG cCmds,       
               OLECMD *prgCmds,   
               OLECMDTEXT *pCmdText);
      STDMETHOD_(HRESULT, Exec)(const GUID* pguidCmdGroup,
             DWORD nCmdID,
             DWORD nCmdexecopt,
             VARIANTARG* pvaIn,
             VARIANTARG* pvaOut);
     END_INTERFACE_PART(OleCommandTarget)

    };


    #include "StdAfx.h"
    #include ".\customcontrolsite.h"
    #include "mshtmhst.h"

    BEGIN_INTERFACE_MAP(CCustomControlSite, COleControlSite)
     INTERFACE_PART(CCustomControlSite, IID_IOleCommandTarget, OleCommandTarget)
    END_INTERFACE_MAP()

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

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

    HRESULT FAR EXPORT CCustomControlSite::XOleCommandTarget::QueryInterface(
     REFIID iid, void FAR* FAR* ppvObj)
    {
     METHOD_PROLOGUE(CCustomControlSite, OleCommandTarget)
      return (HRESULT)pThis->ExternalQueryInterface(&iid, ppvObj);
    }

    HRESULT FAR EXPORT CCustomControlSite::XOleCommandTarget::QueryStatus(
     const GUID* pguidCmdGroup,
     ULONG cCmds,          
     OLECMD *prgCmds,   
     OLECMDTEXT *pCmdText)
    {
     METHOD_PROLOGUE(CCustomControlSite, OleCommandTarget)
      return S_OK;
    }

    HRESULT FAR EXPORT CCustomControlSite::XOleCommandTarget::Exec(
     const GUID* pguidCmdGroup,
     DWORD nCmdID,
     DWORD nCmdexecopt,
     VARIANTARG* pvaIn,
     VARIANTARG* pvaOut)
    {
     HRESULT hr = S_OK;
     int a=1;
     if (pguidCmdGroup && IsEqualGUID(*pguidCmdGroup, CGID_DocHostCommandHandler))
     {

      TRACE("nCmdID:%d\n", nCmdID);
      switch (nCmdID) 
      {

      case OLECMDID_SHOWSCRIPTERROR:
       {
        // Continue running scripts on the page.
        (*pvaOut).boolVal = VARIANT_TRUE;
        break;
       }
      case OLECMDID_SAVE:
        a =1;
        break;
      case OLECMDID_SAVEAS:
       a =1;
       break;
       
      default:
       hr = OLECMDERR_E_NOTSUPPORTED;
       break;
      }
     }
     else
     {
      hr = OLECMDERR_E_UNKNOWNGROUP;
     }
     return (hr);
    }

    2009年10月19日 2:39

答案

  • 关键是怎么拦截那个WM_DROPFILES消息,我在CHTMLVIEW里根本截不到,后来看了蒋晟的自定义浏览器里介绍: 用IWEBBROWSER2::RegisterAsDropTarget()方法实现了.
    int CHTMLViewEx::CancelDropFile(void)
    {
     LPDISPATCH   lpDisp   =   GetApplication();  
     if(lpDisp   ==   NULL)  
      return -1;  
     IWebBrowser2*   lpWeb   =   NULL;  
     if(SUCCEEDED(lpDisp->QueryInterface(IID_IWebBrowser2,   (void**)&lpWeb)))  
     {  

      //lpWeb   就是你要的接口指针  
      lpWeb->put_RegisterAsDropTarget(VARIANT_FALSE);
     }
     return 1;
    }

    • 已标记为答案 wang_weid 2009年10月20日 1:57
    2009年10月20日 1:57

全部回复

  • 截获WM_DROPFILES消息自己处理
    0xBAADF00D
    2009年10月19日 9:23
    版主
  • 关键是怎么拦截那个WM_DROPFILES消息,我在CHTMLVIEW里根本截不到,后来看了蒋晟的自定义浏览器里介绍: 用IWEBBROWSER2::RegisterAsDropTarget()方法实现了.
    int CHTMLViewEx::CancelDropFile(void)
    {
     LPDISPATCH   lpDisp   =   GetApplication();  
     if(lpDisp   ==   NULL)  
      return -1;  
     IWebBrowser2*   lpWeb   =   NULL;  
     if(SUCCEEDED(lpDisp->QueryInterface(IID_IWebBrowser2,   (void**)&lpWeb)))  
     {  

      //lpWeb   就是你要的接口指针  
      lpWeb->put_RegisterAsDropTarget(VARIANT_FALSE);
     }
     return 1;
    }

    • 已标记为答案 wang_weid 2009年10月20日 1:57
    2009年10月20日 1:57
  •  CCustomControlSite::XOleCommandTarget::QueryStatus的实现有问题,没有处理命令的话不要返回S_OK

    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful.
    Visual C++ MVP
    2009年10月20日 19:33
    版主