在派生的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是空指针,并没有指定表头请问动态创建的时候子类化应该放在哪里,或者说还有什么其他的方法吗?
ModifyStyle(0,LVS_OWNERDRAWFIXED);
CListCtrl::PreSubclassWindow();
CHeaderCtrl *pHeader = GetHeaderCtrl();
HWND h = pHeader->GetSafeHwnd();
m_Header.SubclassWindow(pHeader->GetSafeHwnd());其实m_Header是自绘的CHeaderCtrl,如果在对话框里托控件的话是可以成功的。而如果用动态创建的话,这种方法就不能子类化成功,事实pHeader是空指针,并没有指定表头请问动态创建的时候子类化应该放在哪里,或者说还有什么其他的方法吗?
这个有过,我PreSubclassWindow里添加的也是造上面的写的,在对话框用拖控件的方法是可以实现,但是如果动态创建的话,就不行,子类化表头不能成功。
plistCtrl->Create(WS_CHILD|WS_VISIBLE|WS_BORDER|LVS_REPORT
,CRect(5,10,200,200), this, WM_USER+1111);
在动态创建的时候,Create后会响应PreSubclassWindow函数,可是这个时候调用 GetHeaderCtrl()获得表头指针却是空,所以子类化CHeaderCtrl不能成功,这就现在遇到的问题。
-----------------
这样当然不行。加个断点看看,此时listctrl创建完了没?
PreSubclassWindow,是在Create之前调用,所以应该是没有创建完。我把子类化放在OnCreate里就可以了,算是解决了
CHeaderCtrl *pHeader = GetHeaderCtrl();
HWND h = pHeader->GetSafeHwnd();
m_Header.SubclassWindow(pHeader->GetSafeHwnd());放在PreSubclassWindow,动态创建能子类化失败,而用拖控件的方法就可以了
放在OnCreate就相反,动态创建能子类化成功,而拖控件又不能用了。