各位,我自己写了一个类CXXListCtrl,现在创建了一个CListView,通过CListCtrl &ListCtrl = GetListCtrl();
现在想把这个ListCtrl子类化为CXXListCtrl的对象,用了SubClassWindow,但是运行时得不能成功,请问SubClassWindow的使用方法.
现在想把这个ListCtrl子类化为CXXListCtrl的对象,用了SubClassWindow,但是运行时得不能成功,请问SubClassWindow的使用方法.
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();
}
{
m_newListCtrl.SubclassWindow(GetListCtrl());
}
//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());
}
也会出同样的错误,郁闷中.
the window must not already be attached to an MFC object when this function is called.
是不是在我调用SubClassWindow时已经与MFC对象绑定了,但不写在OnInitialUpdate()中,其他地方
m_hWnd == NULL,还请各位多多指点.
一定要放在CListView::OnInitialUpdate之后,因为在基类OnInitialUpdate之后,ListCtrl才真正创建了
只是才能SubclassWindowCMyListView::OnInitialUpdate()
{
CListView::OnInitialUpdate();
m_SortListCtrl.SubclassWindow(GetListCtrl()); // 一定要放在CListView::OnInitialUpdate();之后
}
ASSERT(m_hWnd == NULL); // only attach once, detach on destroy
ASSERT(FromHandlePermanent(hWndNew) == NULL);
// must not already be in permanent map
[email protected]
http://www.codeguru.com/forum/archive/index.php/t-237359.html
http://www.cnblogs.com/SummerHeart/archive/2008/05/15/1197462.html
m_head是我写的一个CHeaderCtrl类,上面一行我也是写在void CMailListView::OnInitialUpdate()
没什么问题啊
CListCtrl &list = GetListCtrl();
HWND hwnd = list.UnsubclassWindow();
m_sortList.SubclassWindow(hwnd);这些都能成功执行,执行完HWND hwnd = list.UnsubclassWindow()后这个ListView的hWnd = 0x00000000,以后调用些view时出错.不知如何是好?
但是CListView在AssertValid中会检查List的对象是否是自己,导致运行时错误最好的方法就是不用CListView,而是使用CView,然后在OnInitialUpdate动态创建一个CSortListCtrl控件对象