如题,各位大虾,在view里面支持动态创建各种控件,专门作了一个函数C**View::AddCtrl(CRuntimeClass * , CRect)来支持往view里面添加控件
C**View::AddCtrl(CRuntimeClass * , CRect/*=CRect(0,0,0,0)*/)
{
  CWnd* pWnd = NULL;
  TRY
  {
    pWnd = (CWnd*)(pRuntimeClass->CreateObject());
    if (pWnd == NULL)
    {
AfxThrowMemoryException();
     }
  } }
然后在.h
CListCtrl Mylistctrl;
.cpp
C***View::OninitialUpdate()
{
    .....
    AddCtrl(RUNTIME_CLASS(Mylistctrl));
}
调试:F11跟踪pWnd = (CWnd*)(pRuntimeClass->CreateObject());发现没有创建成功,
CRuntimeClass:CreateObject()
{
   if ( m_pfnCreateObject==NULL)//为空返回,难道CListCtrl没有缺省构造函数
   {
         ASSERT(_T("Trying to create object which is not   DECLARE_DYNCREATE"));
         return;
   }

看MSDN上说明需要声明DECLARE_DYNCREATE()的类方可以,CListCtrl肯定是的阿
请问哪里理解错了?还望指教

解决方案 »

  1.   

    pRuntimeClass->CreateObject();中最好加入要创建的对象的类型
      

  2.   

    如果你要把ListCtrl添加到视图中,我建议你
    C***View::OnCreate(LPCREATESTRUCT lpCreateStruct) 
    {
        if (CView::OnCreate(lpCreateStruct) == -1)
    return -1;

    // TODO: Add your specialized creation code here
    if (!MyListCtrl.Create(
    WS_VISIBLE | LVS_REPORT | LVS_SHOWSELALWAYS | LVS_SINGLESEL,
    CRect(0,0,0,0), this, IDC_SHELL_LIST))
    {
    TRACE0("Unable to create list view control.\n");
    return -1;
    }
            .....
    }
    最好不要用RUNTIME_CLASS
      

  3.   

    看MSDN上说明需要声明DECLARE_DYNCREATE()的类方可以,CListCtrl肯定是的阿
    请问哪里理解错了?很可惜,CListCtrl声明的是DECLARE_DYNAMIC
      

  4.   

    to byry(百事罐头) 谢谢你的方法我知道,我以前一直就是这么做的。我上面就说了,我需要一个通用的,封装好的方法,所以才想到了用RUNTIME_CLASS。不过还是谢谢你
      

  5.   

    看MSDN上说明需要声明DECLARE_DYNCREATE()的类方可以,CListCtrl肯定是的阿
    请问哪里理解错了?很可惜,CListCtrl声明的是DECLARE_DYNAMIC
    ~~~~~~~~~~~~~~~~~~~~~~~
    啊,ft,今天一看,才知道是DECLARE_DYNAMIC,以前总是理所当然的认为他继承自CWnd应该也可以支持动态生成,看来又理解错了,见笑了.....
    顺便问一句,为什么CListCtrl不支持动态生成呢,另外大侠能否提供一个思路,可以完成一个封装比较好的函数来往view里面添加控件呢?谢谢了
      

  6.   

    就用CListView类吧。
    如果用CListCtrl,直接用new CListCtrl,定义指针。
      

  7.   

    关键是实际情况中往往不只一个listctrl在view中,而且也不一定就是listctrl控件,可能是treeveiw控件,或者其他控件,我只是想做一个通用的方法,大家能提供一点思路么?