用flash控件做的flash播放器怎样用自己的右键菜单替换它自带的菜单。我从CShockwaveFlash派生了一个CFlashWnd类,
在CFlashWnd中加了
WM_MOUSEMOVE;
WM_RBOTTOMDOWN
还加了自己的右键菜单,但都没有反应。这是怎么回事,难道flash控件
不接受我的这些鼠标消息吗?
请哪位高手指点一下,谢谢!

解决方案 »

  1.   

    我见过别人做的flash播放器,有自己定做的菜单的。
    我重载这个函数.
    BOOL CShockwaveFlash::PreTranslateMessage(MSG* pMsg)
    {
    if (pMsg->message == WM_RBUTTONDOWN)
    {
    AfxMessageBox("Click Right");
    }return CWnd::PreTranslateMessage(pMsg);
    }但是flash的菜单也会弹出来的呀,
    如果在return CWnd::PreTranslateMessage(pMsg);
    之前直接return TRUE;则只有单击右键时flash才播放,如果单击左键,
    flash立即暂停,除非再单击右键才继续播放。这是怎么回事?
      

  2.   

    Flash 有一个接口函数可以控制自身右键菜单是否弹出。
    你可以重载Flash控件的WM_CONTEXTMENU消息,在这个消息中弹出自己的菜单。
    如果不行的话,重载对话框的PreTranslateMessage()函数,在这个里面弹出自己的菜单。
    注意这个函数中,只有当pMsg->hwnd == Flash.m_hWnd时才能弹出自己的菜单 。
    ===================================================
    Digit Pro space  欢迎您
    http://www.dpspace.com
    有什么问题到论坛上发表,我将尽我全力为您解决
    论坛欢迎高手注册加入,让我们共同进步
      

  3.   

    CMyWnd是CShockwaveFlash的派生类.我在CMyWnd重载了Flash控件的WM_CONTEXTMENU消息,
    怎么不能弹出自己的菜单呀。我在父窗口CMyDlg中重载了WM_CONTEXTMENU消息,
    又重载CMyWnd的PreTranslateMessage()函数,
    只可以弹出父窗口对话框的菜单。
    BOOL CMyWnd::PreTranslateMessage(MSG* pMsg) 
    {
    CWnd::PreTranslateMessage(pMsg);
    if (pMsg->message == WM_RBUTTONDOWN)
    {
    this->GetParent()->SetCapture();
    return TRUE;
    }

    }我把flash做成屏保,怎么flash只能接受内置的鼠标消息,而我的
    WM_MOUSEMOVE;
    WM_RBOTTOMDOWN
    还加了自己的右键菜单,但都没有反应。
      

  4.   

    我很奇怪,为什么我重载了
    void CMyWnd::OnContextMenu(CWnd*, CPoint point)
    程序却不执行CMyWnd::OnContextMenu(CWnd*, CPoint point)
    而是执行CShockwaveFlash::OnContextMenu(CWnd*, CPoint point)为什么CMyWnd的所有鼠标消息在
    CMyWnd::PreTranslateMessage(MSG* pMsg) 
    中可以检测到,而在相应的消息处理函数中却不响应?难道CMyWnd中的鼠标消息真的被flash控件给吃掉了吗?
      

  5.   

    程序代码在http://www.dpspace.com/bbs/viewfile.asp?ID=1
      

  6.   

    不知道有没有提供COM接口来搞这个东东
    不过你可以试试用钩子来钩住消息呀
      

  7.   

    楼主,不好意思才看到短信。注意鼠标消息顺流消息,由里向外传。你要截主流消息:在这:BOOL CxxxApp::PreTranslateMessage(MSG* pMsg) 
    {
       if ( pMsg->message == WM_RBUTTONDOWN )
       {
           AfxMessageBox("WM_RBUTTONDOWN");
           return TRUE;   
       }   return CWinApp::PreTranslateMessage(pMsg); //be careful
    }
    如果你用SPY++看看控件一定有它的容器。其容器会处理相应的消息。所有你派生的消息由容器处理。不会分发到你的窗口类中。以上有我的看法,如与实际不符请通告我的。GOOD LUCKY
      

  8.   

    的确如你所说,会弹出
    AfxMessageBox("WM_RBUTTONDOWN");
    对话框。但我想让CShockwaveFlash的派生类CMyWnd能响应各种鼠标消息。比如单击右键,void CMyWnd::OnRButtonDown(UINT nFlags, CPoint point)
    要有响应。
      

  9.   

    我用atl+win32做了一个例子,初步实现功能。实现方法只能是subclassWindow
      

  10.   

    谁有兴趣,email:[email protected] 索要源码
      

  11.   

    程序代码在http://www.dpspace.com/bbs/viewfile.asp?ID=1
      

  12.   


    TO:   tigerfox(混合体:=初级程序员.郁闷.被开发中)的确在BOOL CMy111Dlg::OnInitDialog()
    中加
    m_flash.SubclassDlgItem(1234,this);可以实现各种鼠标消息的响应了。但是程序一运行就出错,必须按两下忽略才行!子类化是怎么回事,我还不太懂,能大概说说吗?谢谢!
      

  13.   

    子类化其实同在对话框编辑器中加FLASH是一样的,
    关键是你要用Create的方法做,所以子类化技术用不了。
      

  14.   

    子类化可以实现,但是有个问题:
    我在BOOL CMy111Dlg::OnInitDialog()
    中加了
    if(isFlashCreated)
        m_flash.SubclassDlgItem(1234,this);在CMyWnd中加
    void CMyWnd::OnRButtonDown(UINT nFlags, CPoint point) 
    {
    // TODO: Add your message handler code here and/or call default
    MessageBox("ff");
    // CWnd::OnRButtonDown(nFlags, point);
    }现在可以响应各种鼠标消息了,
    注意要将
    // CWnd::OnRButtonDown(nFlags, point);注释掉。但是程序运行时有错误,要按两下忽略才行,
    请高手指教,这是怎么回事?子类化后的程序代码在http://www.dpspace.com/bbs/viewfile.asp?ID=2
      

  15.   

    如果将flash控件嵌入对话框,没问题!问题在用m_flash.Create(...)创建控件时,
    子类化时会出错,但按两下忽略就可以了,
    鼠标消息也有响应了?请问这种情况下怎样子类化?