本人想要用CListCtrlEx 来替换clistview中的clistctrl,看以前各位大虾的帖子写的是这样:
CListCtrlEx m_MyList;//在CListView类中添加一个CListCtrlEx成员变量
...
方法1(smatter(充内行)的回帖 ):
//在PreSubclassWindow里加就可以了
m_MyList.SubclassWindow(GetListCtrl().m_hWnd);
方法2( zcy_beijing (行云流水) 的帖子 ):
//CMyListView类的OnCreate()函数中添加:
m_MyList.SubclassWnd(GetListCtrl().m_hWnd);
方法3( laiyiling(最熟悉的陌生人) 的回帖):
//在视图里定义CMyListCtrl最成员对象,在OnInitUpdate函数里
CRect rect;
GetClientRect(&rect);
m_MyList.MoveWindow(rect);//函数把你自己的控件占满整个客户区就可以了。但几种方法都会出错。
方法1运行后显示INT 3的汇编代码,提示“User beakpoint called from code at 0x77fa144b”方法2运行后显示ASSERT异常,程序停在
BOOL CWnd::Attach(HWND hWndNew)
{
ASSERT(m_hWnd == NULL);     // only attach once, detach on destroy
ASSERT(FromHandlePermanent(hWndNew) == NULL);
// must not already be in permanent map
方法3运行后显示ASSERT异常,程序停在
void CWnd::MoveWindow(int x, int y, int nWidth, int nHeight, BOOL bRepaint)
{
ASSERT(::IsWindow(m_hWnd));
不知这些方法是否可行,或者还应该进行一些别的操作,希望各位高手能指点一二,先谢谢了

解决方案 »

  1.   

    CMyListView::OnInitialUpdate()中处理:HWND hwnd = this->GetTreeCtrl().UnsubclassWindow();
    m_tree.SubclassWindow(hwnd);但是这时不要用原先的CTreeCtrl(用GetTreeCtrl()得到)
      

  2.   

    看你的错误大多是窗口还没有创建起来的原因
    可能这样吧CListCtrlEx::OnInitialUpdate()
    {
      CListCtrlEx::OnInitialUpdate(); //先调用了基类的OnInitialUpdate
      // 然后才是你的代码
    }
      

  3.   

    sorry,写错类名了CMyListView::OnInitialUpdate()
    {
      CMyListView::OnInitialUpdate(); //先调用了基类的OnInitialUpdate
      // 然后才是你的代码
    }
      

  4.   

    -_-||||
    顺手又写错了,csdn不能修改真是不方便CMyListView::OnInitialUpdate()
    {
      CListView::OnInitialUpdate(); //先调用了基类的OnInitialUpdate
      // 然后才是你的代码
    }
      

  5.   

    简单的说,没有比较简单的方法。
    方案1:把Ctrl和View中重复的功能作成模板(可以参考CHTMLEditCtrl/CHTMLEditView的实现)
    方案2:在FormView里面创建一个Listctrl,在FormView大小变化时移动它以充满整个窗口
    方案3:单独编写Ctrl和View,把Ctrl和View中重复的代码作成辅助函数供窗口的消息相应函数调用。
      

  6.   

    看来jiangsheng(蒋晟.MSMVP2004Jan)说的有道理,我按 truewill(无处不在) 说得将代码放在基类函数后仍然报错,错误和方法2一样。
    void CMyListView::OnInitialUpdate() 
    {
    CListView::OnInitialUpdate();
    m_TestListCtrl.SubclassWindow(GetListCtrl().m_hWnd); // TODO: Add your specialized code here and/or call the base class

    }
      

  7.   

    方法一
    void CMyListView::PreSubclassWindow() 
    {
    // TODO: Add your specialized code here and/or call the base class
    HWND hwnd = GetListCtrl().m_hWnd;
    if (hwnd)
    {
    CWnd* pListCtrl = CWnd::FromHandlePermanent(hwnd);
    if (pListCtrl)
    {
    if (!pListCtrl->IsKindOf(RUNTIME_CLASS(CListCtrlEx)))
    {
    pListCtrl->Detach();
    m_MyList.SubclassWindow(hwnd);
    }
    }
    else
    m_Header.SubclassWindow(hwnd);
    }
    CListCtrl::PreSubclassWindow();
    }
      

  8.   

    不好意思
    CListCtrl::PreSubclassWindow();
    改成CListView::PreSubclassWindow();
      

  9.   

    goodboyws(深夜不眠者) 的方法也试了试,还是要出错。后来只好用FORMVIEW上放ListCtrlEx的方法来解决,只是OnSize中的MoveWindows应该在FormView初始化后再起作用,不然最开始会有几个异常,不管怎样,总算解决了,谢谢各位兄弟的指点。