用SubClassWindow子类化出现的问题,请教各位如何解决?

socrates 2008-05-13 08:39:26
各位,我自己写了一个类CXXListCtrl,现在创建了一个CListView,通过CListCtrl &ListCtrl = GetListCtrl();
现在想把这个ListCtrl子类化为CXXListCtrl的对象,用了SubClassWindow,但是运行时得不能成功,请问SubClassWindow的使用方法.
...全文
590 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
socrates 2008-05-19
  • 打赏
  • 举报
回复
我调试过好多次了.
	
CListCtrl &list = GetListCtrl();
HWND hwnd = list.UnsubclassWindow();
m_sortList.SubclassWindow(hwnd);

这些都能成功执行,执行完HWND hwnd = list.UnsubclassWindow()后这个ListView的hWnd = 0x00000000,以后调用些view时出错.不知如何是好?
vocanicy 2008-05-19
  • 打赏
  • 举报
回复
不用试了,Subclass的方式无法实现,subclass是可以成功
但是CListView在AssertValid中会检查List的对象是否是自己,导致运行时错误

最好的方法就是不用CListView,而是使用CView,然后在OnInitialUpdate动态创建一个CSortListCtrl控件对象
scq2099yt 2008-05-19
  • 打赏
  • 举报
回复
单步调试看问题出在哪儿,然后try catch察看具体错误
socrates 2008-05-16
  • 打赏
  • 举报
回复
楼上的朋友,谢谢你,这篇文章我在发贴前已查看过,控件子类化是问题的,但ListView没有我们想的那么简单啊,请看上面的网址中那篇贴子<<How can I subclass CListCtrl from CListView? >>
编程夜猫 2008-05-16
  • 打赏
  • 举报
回复
推荐:
http://www.cnblogs.com/SummerHeart/archive/2008/05/15/1197462.html
socrates 2008-05-16
  • 打赏
  • 举报
回复
对了,这个问题我请教过CSDN网友Loomman,他很热情,让我看篇文章,看过之后我自己还是没搞懂,好象那个问题在codeguru上也没有很好的答案,帖在这里,请大家再次帮忙,谢谢Loomman.
http://www.codeguru.com/forum/archive/index.php/t-237359.html
socrates 2008-05-16
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 vocanicy 的回复:]
把程序发给我看看吧

我觉得应该没有问题啊
17413771@qq.com
[/Quote]
大哥,已发谢,谢谢你的耐心和帮助.
zgl7903 2008-05-16
  • 打赏
  • 举报
回复
在 SubclassWindow() 之前设置一个断点 Step into
socrates 2008-05-16
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 ma87089123 的回复:]
对于组合控件应该分到最基本的一个窗口来子类化吧,
[/Quote]
你好,你肯定是对一个ListCtrl用这种方法,我发现这与CListView有区别啊!
ma87089123 2008-05-16
  • 打赏
  • 举报
回复
对于组合控件应该分到最基本的一个窗口来子类化吧,
ma87089123 2008-05-16
  • 打赏
  • 举报
回复
m_head.SubclassWindow(listCtrl.GetHeaderCtrl()->UnsubclassWindow());
m_head是我写的一个CHeaderCtrl类,上面一行我也是写在void CMailListView::OnInitialUpdate()
没什么问题啊
zhaohongbo83 2008-05-16
  • 打赏
  • 举报
回复
猛!等我问下同事
socrates 2008-05-16
  • 打赏
  • 举报
回复
难道真的不能解决吗?
vocanicy 2008-05-15
  • 打赏
  • 举报
回复
把程序发给我看看吧

我觉得应该没有问题啊
17413771@qq.com
socrates 2008-05-15
  • 打赏
  • 举报
回复
上面的方法和我用的一样,但运行调试错误如下:
	ASSERT(m_hWnd == NULL);     // only attach once, detach on destroy
ASSERT(FromHandlePermanent(hWndNew) == NULL);
// must not already be in permanent map

vocanicy 2008-05-15
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 dyx1024 的回复:]
谢谢楼上的大哥,我以前就是这样用的,运行时崩溃,
//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_SHOWSELAL…
[/Quote]

一定要放在CListView::OnInitialUpdate之后,因为在基类OnInitialUpdate之后,ListCtrl才真正创建了
只是才能SubclassWindow

CMyListView::OnInitialUpdate() 
{
CListView::OnInitialUpdate();
m_SortListCtrl.SubclassWindow(GetListCtrl()); // 一定要放在CListView::OnInitialUpdate();之后
}
socrates 2008-05-15
  • 打赏
  • 举报
回复
在MSDN中这个方法的说明中有这样一句:
the window must not already be attached to an MFC object when this function is called.
是不是在我调用SubClassWindow时已经与MFC对象绑定了,但不写在OnInitialUpdate()中,其他地方
m_hWnd == NULL,还请各位多多指点.
rickymathit 2008-05-15
  • 打赏
  • 举报
回复
3楼正确!顶
jameshooo 2008-05-14
  • 打赏
  • 举报
回复
必须在ListView完全创建好后才能子类化
jameshooo 2008-05-14
  • 打赏
  • 举报
回复
CMyListView::OnInitialUpdate()
{
m_newListCtrl.SubclassWindow(GetListCtrl());
}
加载更多回复(5)

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧