各位,我自己写了一个类CXXListCtrl,现在创建了一个CListView,通过CListCtrl &ListCtrl = GetListCtrl();
现在想把这个ListCtrl子类化为CXXListCtrl的对象,用了SubClassWindow,但是运行时得不能成功,请问SubClassWindow的使用方法.

解决方案 »

  1.   

    SubClassWindow(),MSDN上说的很清楚是将一个Window将一个CWnd对象相关联。MSDN上的例子:Note   The window must not already be attached to an MFC object when this function is called.
    Example
    // The following code shows how to subclass the edit control and list box
    // controls inside a combo box. It uses WM_CTLCOLOR for subclassing.
    // CSuperComboBox represents the combo box
    HBRUSH CSuperComboBox::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
    {
       if (nCtlColor == CTLCOLOR_EDIT)
       {
          //Edit control
          if (m_edit.GetSafeHwnd() == NULL)
             m_edit.SubclassWindow(pWnd->GetSafeHwnd());
       }
       else if (nCtlColor == CTLCOLOR_LISTBOX)
       {
          //ListBox control
          if (m_listbox.GetSafeHwnd() == NULL)
             m_listbox.SubclassWindow(pWnd->GetSafeHwnd());
       }
       HBRUSH hbr = CComboBox::OnCtlColor(pDC, pWnd, nCtlColor);
       return hbr;
    }void CSuperComboBox::OnDestroy()
    {
       //unsubclass edit and list box before destruction
       if (m_edit.GetSafeHwnd() != NULL)
          m_edit.UnsubclassWindow();
       if (m_listbox.GetSafeHwnd() != NULL)
          m_listbox.UnsubclassWindow();
       CComboBox::OnDestroy();
    }
      

  2.   

    CMyListView::OnInitialUpdate()
    {
      m_newListCtrl.SubclassWindow(GetListCtrl());
    }
      

  3.   

    必须在ListView完全创建好后才能子类化
      

  4.   

    谢谢楼上的大哥,我以前就是这样用的,运行时崩溃,
    //MyListView.h  CSortListCtrl m_SortListCtrl;
    //MyListView.cpp
    CMyListView::OnInitialUpdate()
    {
      m_SortListCtrl.SubclassWindow(GetListCtrl());  //运行到这里时崩溃
    }刚开始想是不是因为m_SortListCtrl还没有创建,就改为
    CMyListView::OnInitialUpdate()
    {  int bRet = m_sortList.Create(WS_CHILD | LVS_REPORT | LVS_SHOWSELALWAYS , CRect(0, 0,  20, 30), this, ID_MYLIST);  m_SortListCtrl.SubclassWindow(GetListCtrl());  
    }
    也会出同样的错误,郁闷中.
      

  5.   

    在MSDN中这个方法的说明中有这样一句:
    the window must not already be attached to an MFC object when this function is called.
    是不是在我调用SubClassWindow时已经与MFC对象绑定了,但不写在OnInitialUpdate()中,其他地方
    m_hWnd == NULL,还请各位多多指点.
      

  6.   


    一定要放在CListView::OnInitialUpdate之后,因为在基类OnInitialUpdate之后,ListCtrl才真正创建了
    只是才能SubclassWindowCMyListView::OnInitialUpdate() 
    {
    CListView::OnInitialUpdate();
    m_SortListCtrl.SubclassWindow(GetListCtrl());  // 一定要放在CListView::OnInitialUpdate();之后
      

  7.   

    上面的方法和我用的一样,但运行调试错误如下:
    ASSERT(m_hWnd == NULL);     // only attach once, detach on destroy
    ASSERT(FromHandlePermanent(hWndNew) == NULL);
    // must not already be in permanent map
      

  8.   

    把程序发给我看看吧我觉得应该没有问题啊
    [email protected]
      

  9.   

     对了,这个问题我请教过CSDN网友Loomman,他很热情,让我看篇文章,看过之后我自己还是没搞懂,好象那个问题在codeguru上也没有很好的答案,帖在这里,请大家再次帮忙,谢谢Loomman.
    http://www.codeguru.com/forum/archive/index.php/t-237359.html
      

  10.   

    推荐:
    http://www.cnblogs.com/SummerHeart/archive/2008/05/15/1197462.html
      

  11.   

    楼上的朋友,谢谢你,这篇文章我在发贴前已查看过,控件子类化是问题的,但ListView没有我们想的那么简单啊,请看上面的网址中那篇贴子<<How can I subclass CListCtrl from CListView? >>
      

  12.   

    m_head.SubclassWindow(listCtrl.GetHeaderCtrl()->UnsubclassWindow());
    m_head是我写的一个CHeaderCtrl类,上面一行我也是写在void CMailListView::OnInitialUpdate()
    没什么问题啊 
      

  13.   

    你好,你肯定是对一个ListCtrl用这种方法,我发现这与CListView有区别啊!
      

  14.   

    在 SubclassWindow() 之前设置一个断点 Step into 
      

  15.   

    我调试过好多次了.

    CListCtrl &list = GetListCtrl();
    HWND hwnd = list.UnsubclassWindow();
    m_sortList.SubclassWindow(hwnd);这些都能成功执行,执行完HWND hwnd = list.UnsubclassWindow()后这个ListView的hWnd = 0x00000000,以后调用些view时出错.不知如何是好?
      

  16.   

    单步调试看问题出在哪儿,然后try catch察看具体错误
      

  17.   

    不用试了,Subclass的方式无法实现,subclass是可以成功
    但是CListView在AssertValid中会检查List的对象是否是自己,导致运行时错误最好的方法就是不用CListView,而是使用CView,然后在OnInitialUpdate动态创建一个CSortListCtrl控件对象