在vs2005中,我在添加的资源对话框中插入了activeX控件(WindowsMediaPlayer)
然后将控件生成为MFC的类。但是生成的类是class CWMPPlayer : public COleDispatchDriver,而不是从CWnd继承而来,对于这种情况应如何根据此activex控件的资源id得到其指针?得到的指针是什么类型的?我得到这个指针后如何才能像操作CWnd类一样进行一般的操作诸如移动窗口等?请高手指点!

解决方案 »

  1.   

    全部用API呢?
    如:
    HWND GetDlgItem(
      HWND hDlg,       // handle of dialog box
      int nIDDlgItem   // identifier of control
    );
    ::FindWindowEx, ::MoveWindow,::SetWindowPos
      

  2.   

    全部用API的话得到的HWND如何转为CWMPPlayer*类型呢?我还需要CWMPPlayer*类型对Mediaplayer进行操作。
      

  3.   

    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmplay10/mmp_sdk/embeddingtheplayercontrolinacprogram.asp
      

  4.   

    可以给他关联一个CWMPPlayer型变量吧?
      

  5.   

    to lixiaosan(小三)
    这些我都看了,我所需要的仅仅是能够从对话框中得到一个 CWMPPlayer* 的指针,因为CWMPPlayer不是从CWnd继承的,而是从COleDispatchDriver继承而来的,那么我如何从对话框中得到一个COleDispatchDriver*的指针而不是CWnd*的指针呢?得到了COleDispatchDriver*的指针可以对MediaPlayer进行操作,但是如何对其进行MoveWindow,ShowWindow之类的操作呢?这又得需要一个MediaPlayer的hwnd才可以,但是COleDispatchDriver好像是没有hwnd的,这让我非常的困扰,请指教。
      

  6.   

    to seu07201213(【东南】〖少帅〗)
    我的程序设计上就是不关联变量的,而且在2005中如果放入realplayer的插件然后再关联一个变量就会出问题,比较郁闷。
      

  7.   

    控制那个,需要察看控件的借口,它必须提供相应的接口,你才能够控制,而不是使用GetDlgItem之类的函数,你去查一下,这个控件的接口。才好调用。
      

  8.   

    另外无论是窗口还是控件,好像都有一个成员变量,类似于m_hWnd之类的。你看看吧
      

  9.   

    你看看CWMPPlayer4  这个类class CWMPPlayer4 : public CWnd
    {
     .....
    }
      

  10.   

    class CWMPPlayer : public COleDispatchDriver
    {
    public:
    CWMPPlayer() {} // 调用 COleDispatchDriver 默认构造函数
    CWMPPlayer(LPDISPATCH pDispatch) : COleDispatchDriver(pDispatch) {}
    CWMPPlayer(const CWMPPlayer& dispatchSrc) : COleDispatchDriver(dispatchSrc) {}// 属性
    public:// 操作
    public: void close()
    {
    InvokeHelper(0x3, DISPATCH_METHOD, VT_EMPTY, NULL, NULL);
    }
    CString get_URL()
    {
    CString result;
    InvokeHelper(0x1, DISPATCH_PROPERTYGET, VT_BSTR, (void*)&result, NULL);
    return result;
    }
    void put_URL(LPCTSTR newValue)
    {
    static BYTE parms[] = VTS_BSTR ;
    InvokeHelper(0x1, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue);
    }
    long get_openState()
    {
    long result;
    InvokeHelper(0x2, DISPATCH_PROPERTYGET, VT_I4, (void*)&result, NULL);
    return result;
    }
    long get_playState()
    {
    long result;
    InvokeHelper(0xa, DISPATCH_PROPERTYGET, VT_I4, (void*)&result, NULL);
    return result;
    }
    LPDISPATCH get_controls()
    {
    LPDISPATCH result;
    InvokeHelper(0x4, DISPATCH_PROPERTYGET, VT_DISPATCH, (void*)&result, NULL);
    return result;
    }
    LPDISPATCH get_settings()
    {
    LPDISPATCH result;
    InvokeHelper(0x5, DISPATCH_PROPERTYGET, VT_DISPATCH, (void*)&result, NULL);
    return result;
    }
    LPDISPATCH get_currentMedia()
    {
    LPDISPATCH result;
    InvokeHelper(0x6, DISPATCH_PROPERTYGET, VT_DISPATCH, (void*)&result, NULL);
    return result;
    }
    void put_currentMedia(LPDISPATCH newValue)
    {
    static BYTE parms[] = VTS_DISPATCH ;
    InvokeHelper(0x6, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue);
    }
    LPDISPATCH get_mediaCollection()
    {
    LPDISPATCH result;
    InvokeHelper(0x8, DISPATCH_PROPERTYGET, VT_DISPATCH, (void*)&result, NULL);
    return result;
    }
    LPDISPATCH get_playlistCollection()
    {
    LPDISPATCH result;
    InvokeHelper(0x9, DISPATCH_PROPERTYGET, VT_DISPATCH, (void*)&result, NULL);
    return result;
    }
    CString get_versionInfo()
    {
    CString result;
    InvokeHelper(0xb, DISPATCH_PROPERTYGET, VT_BSTR, (void*)&result, NULL);
    return result;
    }
    void launchURL(LPCTSTR bstrURL)
    {
    static BYTE parms[] = VTS_BSTR ;
    InvokeHelper(0xc, DISPATCH_METHOD, VT_EMPTY, NULL, parms, bstrURL);
    }
    LPDISPATCH get_network()
    {
    LPDISPATCH result;
    InvokeHelper(0x7, DISPATCH_PROPERTYGET, VT_DISPATCH, (void*)&result, NULL);
    return result;
    }
    LPDISPATCH get_currentPlaylist()
    {
    LPDISPATCH result;
    InvokeHelper(0xd, DISPATCH_PROPERTYGET, VT_DISPATCH, (void*)&result, NULL);
    return result;
    }
    void put_currentPlaylist(LPDISPATCH newValue)
    {
    static BYTE parms[] = VTS_DISPATCH ;
    InvokeHelper(0xd, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue);
    }
    LPDISPATCH get_cdromCollection()
    {
    LPDISPATCH result;
    InvokeHelper(0xe, DISPATCH_PROPERTYGET, VT_DISPATCH, (void*)&result, NULL);
    return result;
    }
    LPDISPATCH get_closedCaption()
    {
    LPDISPATCH result;
    InvokeHelper(0xf, DISPATCH_PROPERTYGET, VT_DISPATCH, (void*)&result, NULL);
    return result;
    }
    BOOL get_isOnline()
    {
    BOOL result;
    InvokeHelper(0x10, DISPATCH_PROPERTYGET, VT_BOOL, (void*)&result, NULL);
    return result;
    }
    LPDISPATCH get_Error()
    {
    LPDISPATCH result;
    InvokeHelper(0x11, DISPATCH_PROPERTYGET, VT_DISPATCH, (void*)&result, NULL);
    return result;
    }
    CString get_status()
    {
    CString result;
    InvokeHelper(0x12, DISPATCH_PROPERTYGET, VT_BSTR, (void*)&result, NULL);
    return result;
    }
    BOOL get_enabled()
    {
    BOOL result;
    InvokeHelper(0x13, DISPATCH_PROPERTYGET, VT_BOOL, (void*)&result, NULL);
    return result;
    }
    void put_enabled(BOOL newValue)
    {
    static BYTE parms[] = VTS_BOOL ;
    InvokeHelper(0x13, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue);
    }
    BOOL get_fullScreen()
    {
    BOOL result;
    InvokeHelper(0x15, DISPATCH_PROPERTYGET, VT_BOOL, (void*)&result, NULL);
    return result;
    }
    void put_fullScreen(BOOL newValue)
    {
    static BYTE parms[] = VTS_BOOL ;
    InvokeHelper(0x15, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue);
    }
    BOOL get_enableContextMenu()
    {
    BOOL result;
    InvokeHelper(0x16, DISPATCH_PROPERTYGET, VT_BOOL, (void*)&result, NULL);
    return result;
    }
    void put_enableContextMenu(BOOL newValue)
    {
    static BYTE parms[] = VTS_BOOL ;
    InvokeHelper(0x16, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue);
    }
    void put_uiMode(LPCTSTR newValue)
    {
    static BYTE parms[] = VTS_BSTR ;
    InvokeHelper(0x17, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue);
    }
    CString get_uiMode()
    {
    CString result;
    InvokeHelper(0x17, DISPATCH_PROPERTYGET, VT_BSTR, (void*)&result, NULL);
    return result;
    }
    };class COleDispatchDriver
    {
    // Constructors
    public:
    COleDispatchDriver();
    COleDispatchDriver(LPDISPATCH lpDispatch, BOOL bAutoRelease = TRUE);
    COleDispatchDriver(const COleDispatchDriver& dispatchSrc);// Attributes
    LPDISPATCH m_lpDispatch;
    BOOL m_bAutoRelease;// Operations
    BOOL CreateDispatch(REFCLSID clsid, COleException* pError = NULL);
    BOOL CreateDispatch(LPCTSTR lpszProgID, COleException* pError = NULL); void AttachDispatch(LPDISPATCH lpDispatch, BOOL bAutoRelease = TRUE);
    LPDISPATCH DetachDispatch();
    // detach and get ownership of m_lpDispatch
    void ReleaseDispatch(); // helpers for IDispatch::Invoke
    void AFX_CDECL InvokeHelper(DISPID dwDispID, WORD wFlags,
    VARTYPE vtRet, void* pvRet, const BYTE* pbParamInfo, ...);
    void AFX_CDECL SetProperty(DISPID dwDispID, VARTYPE vtProp, ...);
    void GetProperty(DISPID dwDispID, VARTYPE vtProp, void* pvProp) const; // special operators
    operator LPDISPATCH();
    const COleDispatchDriver& operator=(const COleDispatchDriver& dispatchSrc);// Implementation
    public:
    ~COleDispatchDriver();
    void InvokeHelperV(DISPID dwDispID, WORD wFlags, VARTYPE vtRet,
    void* pvRet, const BYTE* pbParamInfo, va_list argList);
    };看了类的声明,就不知道应该怎么办了!
      

  11.   

    o ..你的是2005, 我这里没有,vc6添加的是CWMPPlayer4。
      

  12.   

    to lixiaosan(小三)
    你看看CWMPPlayer4  这个类class CWMPPlayer4 : public CWnd
    {
     .....
    }
    为什么我的CWMPPlayer4是从COleDispatchDriver继承过来的?
      

  13.   

    我也用的vc6.0 ,你的具体情况没遇到过:
    m_player = (CWMPPlayer4 *)this->GetDlgItem(IDC_OCX1);这样可以吧
    把COleDispatchDriver换成CWnd呢?或者把VC6.0生成的相关文件添加到Project中....
      

  14.   

    暂时没想到好的方法试试用FindWindow的方式找到该wmp控件的句柄
      

  15.   

    要不你动态创建控件试试
    CWnd m_wmp;
    m_wmp.CreateControl(。);LPUNKNOWN lpUnknown = m_wmp.GetControlUnknown();
    LPDISPATCH lpDispatch;
    lpUnknown->QueryInterface(IID_IDispatch, (void**)&lpDispatch);然后,CWMPPlayer构造函数
      

  16.   

    似乎已经找到方法了
    获得句柄的方法就是用GetDlgItem(...),这样可以用获得的句柄来进行窗口的操作。CWMPPlayer是从COleDispatchDriver继承过来的。对于COleDispatchDriver对象,其所有的属性以及方法绑定于其中的COleDispatchDriver::m_lpDispatch成员,即依附于COleDispatchDriver的IDispatch interface,而IDispatch是从IUnknown继承来的。
    CWnd中有这样一个方法LPUNKNOWN GetControlUnknown( ),这就是CWnd中包含的OLE控件。使用COleDispatchDriver的COleDispatchDriver::AttachDispatch(LPDISPATCH lpDispatch, BOOL bAutoRelease = TRUE)将这个从CWnd获得的IUnknow对象依附于COleDispathcDriver即可。
      

  17.   

    activex控件并不一定都有窗口句柄的,即使是同种控件也可以创建成带窗口的和不带窗口的两种。所以MFC中才会出现两种实现方式。但两种实现方式都提供了MoveWindow之类函数。lz可以参考看看msdn中关于windowless control的文章。