在派生的CListCtrl的PreSubclassWindow时添加代码,来子类化CHeaderCtrl
ModifyStyle(0,LVS_OWNERDRAWFIXED);
CListCtrl::PreSubclassWindow();
CHeaderCtrl *pHeader = GetHeaderCtrl();
HWND h = pHeader->GetSafeHwnd();
m_Header.SubclassWindow(pHeader->GetSafeHwnd());其实m_Header是自绘的CHeaderCtrl,如果在对话框里托控件的话是可以成功的。而如果用动态创建的话,这种方法就不能子类化成功,事实pHeader是空指针,并没有指定表头请问动态创建的时候子类化应该放在哪里,或者说还有什么其他的方法吗?

解决方案 »

  1.   

    http://www.vckbase.com/document/viewdoc/?id=1855
      

  2.   


    这个有过,我PreSubclassWindow里添加的也是造上面的写的,在对话框用拖控件的方法是可以实现,但是如果动态创建的话,就不行,子类化表头不能成功。
    plistCtrl->Create(WS_CHILD|WS_VISIBLE|WS_BORDER|LVS_REPORT
    ,CRect(5,10,200,200), this, WM_USER+1111);
      

  3.   


    在动态创建的时候,Create后会响应PreSubclassWindow函数,可是这个时候调用 GetHeaderCtrl()获得表头指针却是空,所以子类化CHeaderCtrl不能成功,这就现在遇到的问题。
      

  4.   

    事实pHeader是空指针
    -----------------
    这样当然不行。加个断点看看,此时listctrl创建完了没?
      

  5.   

    刚又看了一下那篇文章,楼下的回复里有和我遇到问题的人。有个问题是,如果ClistCtl是Create产生的,表头设置就不起作用。 ( gongdiwudu 发表于 2011-6-3 10:04:00)
      

  6.   


    PreSubclassWindow,是在Create之前调用,所以应该是没有创建完。我把子类化放在OnCreate里就可以了,算是解决了
      

  7.   

    如果把子类化句
        CHeaderCtrl *pHeader = GetHeaderCtrl();
        HWND h = pHeader->GetSafeHwnd();
        m_Header.SubclassWindow(pHeader->GetSafeHwnd());放在PreSubclassWindow,动态创建能子类化失败,而用拖控件的方法就可以了
    放在OnCreate就相反,动态创建能子类化成功,而拖控件又不能用了。
      

  8.   

    我也遇到了同样的问题,谢谢楼主发帖!我只用动态创建在OnCreate里子类化,先凑合用,期待高人解答!