我创建了一个复合控件
我希望能在这个控件中动态的创建一个BUTTON
我看了之前的很多贴子,一般方法如下:
mybutton.Create("button",WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,
CRect(0,0,10,10),this,0);
而此时我的this指针指向CCATLLT*  (注这个是我的复合控件的名称)
我把this改为CWND *pD = CWND::FromHandle(m_hWnd)后编译器报错;
我怎么获取这个this指针呢?
盼指教!!

解决方案 »

  1.   

    对于这行:
    CWND *pD = CWND::FromHandle(m_hWnd)
    1、窗口类是CWnd,注意大小写;
    2、CWnd::FromHandle()是将参数指定的窗口句柄绑定到一个**临时**对象,并返回该对象指针;
    3、m_hWnd已经跟你的复合控件对象绑定了,你又这样调用不知道你想干嘛?那个参数是指创建按钮的父窗口,传入this,则表示以当前对象(你的复合控件)为父窗口创建按钮。如果你想以其他窗口作为父窗口创建按纽,则传入相应父窗口对象的指针即可。
      

  2.   

    那如何获取这个复合控件的窗口对象指针呢?
    或者说如何通过这个已绑定的m_hWnd获取窗口对象指针呢?
    我的this指向的是(CCATLLT*),而不是(CWnd*)  
      

  3.   

    你的CCATLLT不是继承自CWnd吗?
      

  4.   

    class ATL_NO_VTABLE CCATLLT : 
    public CComObjectRootEx<CComSingleThreadModel>,
    public CStockPropImpl<CATLControl, IATLControl, &IID_IATLControl, &LIBID_ATLNEWLib>,
    public CComControl<CATLControl>,
    public IPersistStreamInitImpl<CATLControl>,
    public IOleControlImpl<CATLControl>,
    public IOleObjectImpl<CATLControl>,
    public IOleInPlaceActiveObjectImpl<CATLControl>,
    public IViewObjectExImpl<CATLControl>,
    public IOleInPlaceObjectWindowlessImpl<CATLControl>,
    public IConnectionPointContainerImpl<CATLControl>,
    public IPersistStorageImpl<CATLControl>,
    public ISpecifyPropertyPagesImpl<CATLControl>,
    public IQuickActivateImpl<CATLControl>,
    public IDataObjectImpl<CATLControl>,
    public IProvideClassInfo2Impl<&CLSID_ATLControl, &DIID__IATLControlEvents, &LIBID_ATLNEWLib>,
    public IPropertyNotifySinkCP<CATLControl>,
    public CComCoClass<CATLControl, &CLSID_ATLControl>
      

  5.   

    上面的类名给错了,其实是CATLControlclass ATL_NO_VTABLE CATLControl : 
    public CComObjectRootEx<CComSingleThreadModel>,
    public CStockPropImpl<CATLControl, IATLControl, &IID_IATLControl, &LIBID_ATLNEWLib>,
    public CComControl<CATLControl>,
    public IPersistStreamInitImpl<CATLControl>,
    public IOleControlImpl<CATLControl>,
    public IOleObjectImpl<CATLControl>,
    public IOleInPlaceActiveObjectImpl<CATLControl>,
    public IViewObjectExImpl<CATLControl>,
    public IOleInPlaceObjectWindowlessImpl<CATLControl>,
    public IConnectionPointContainerImpl<CATLControl>,
    public IPersistStorageImpl<CATLControl>,
    public ISpecifyPropertyPagesImpl<CATLControl>,
    public IQuickActivateImpl<CATLControl>,
    public IDataObjectImpl<CATLControl>,
    public IProvideClassInfo2Impl<&CLSID_ATLControl, &DIID__IATLControlEvents, &LIBID_ATLNEWLib>,
    public IPropertyNotifySinkCP<CATLControl>,
    public CComCoClass<CATLControl, &CLSID_ATLControl>
      

  6.   

    我在control选项下选的是Composite Control
    然后类名定义为CATLControl 
    就出来这些
      

  7.   

    你可以这样:
    在CATLControl类里加入CButton m_myButton;
    HWND hwndButton = ::CreateWindowEx(0, "Button", "按钮", WS_VISIBLE | WS_CHILD,
         0, 0, 10, 10, m_hWnd, 0, 0, 0); //创建一个按钮,得到按钮窗口句柄
    m_myButton.Attach(hwndButton);       //将按钮窗口句柄绑定到按钮对象
      

  8.   

    这样创建的按钮如何响应消息呢??
    比如用mybutton.Create("button",WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,
    CRect(0,0,10,10),this,nID);
    可以通过nID来定制消息响应函数,,
    另:为什么别人的程序能够在Active控件上通过这种方式来动态创建按钮
        我也是用的ATL的复合控件啊,,郁闷中~~~~
      

  9.   

    在::CreateWindowEx()的第10个参数传入(HMENU)nID即可照常相应消息,
    别人用这种方式创建按钮,别人的this对象是继承自CWnd的。
      

  10.   

    那我怎么用ATL COM AppWizard创建一个继承自CWnd的ATL控件呢??