派生类动态创建后的一系列问题..请求高手拉一把

k80676535 2010-04-30 04:03:29
现在想把一些自己派生出来的类组合出一个大的功能,封装在一个类中实现
问题描述:
在动态创建ClistCtrl的派生类之后(报告模式),发现完全没有预期中的特性,但是直接在设计器中绑定的时候就有预期效果。

我发现的问题:
动态创建的实例,可能由于CHeaderCtrl还没来得及生成,所以在PreSubclassWindow中没有得到指针,没有子类化成功,在内容初始化的时候再次子类化,成功(表头有右图的效果)。

求助:
有什么办法可以让动态创建的派生类具有用设计向导绑定时的效果?或者可以像表头一样子类化的方式绕过这个问题?

效果图(左为动态创建,右边用设计向导绑定的,希望能有右边的效果)
...全文
194 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
k80676535 2010-05-05
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 cnzdgs 的回复:]
如果在创建控件时指定LVS_OWNERDRAWFIXED风格,在产生WM_MEASUREITEM消息时控件尚未子类化,所以无法通过反射来响应。可以改成在控件的父窗口响应,或者试试在创建时不指定LVS_OWNERDRAWFIXED风格,在PreSubclassWindow中通过ModifyStyle加上去。
[/Quote]

如果仅在PreSubclassWindow中用ModifyStyle添加LVS_OWNERDRAWFIXED,那么,在动态创建的时候,将不调用DrawItem,必须在Create中指定LVS_OWNERDRAWFIXED。貌似PreSubclassWindow中的ModifyStyle被无视了

在产生WM_MEASUREITEM消息时控件尚未子类化,所以无法通过反射来响应。这个正解,在完全创建后再改变窗口大小就可以了

动态创建的时候没注意内部创建的先后。以后要多多注意,感谢大家,现在结帖。
cnzdgs 2010-05-05
  • 打赏
  • 举报
回复
如果在创建控件时指定LVS_OWNERDRAWFIXED风格,在产生WM_MEASUREITEM消息时控件尚未子类化,所以无法通过反射来响应。可以改成在控件的父窗口响应,或者试试在创建时不指定LVS_OWNERDRAWFIXED风格,在PreSubclassWindow中通过ModifyStyle加上去。
k80676535 2010-05-04
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 zhou1xp 的回复:]
你什么意思,是说你不能自己设置行高么
[/Quote]

请注意效果图,没有在顶楼解释一下是我的失误。(表头的问题解决,在WM_CREATE子类化)

现在我说明一下:
图上的是CEventReminderListCtrl 的动态生成(左)和静态绑定(右)两种状态
CEventReminderListCtrl继承于CColorListCtrl,CColorListCtrl继承于CListCtrl
现在CColorListCtrl中的功能已经很完善了,对行距、背景、图标、文字等方面都有应用,我现在想要在CColorListCtrl的基础上再派生出一个特定的显示方式,需要使用CColorListCtrl的部分功能(这个可以使用CColorListCtrl中的参数设置完成),封装在CEventReminderListCtrl中。

CEventReminderListCtrl的DrawItem直接返回
在左图中,Create()中不添加LVS_OWNERDRAWFIXED属笥,有显示,这个是CListCtrl的效果。添加LVS_OWNERDRAWFIXED之后,无显示,但是行高没有改变
在右图中,无显示,改变行高、自绘正常。

CEventReminderListCtrl在动态创建之后,ON_WM_MEASUREITEM_REFLECT无响应。
为什么动态创建的控件,这个方法不响应呢?
zhou1xp 2010-05-04
  • 打赏
  • 举报
回复
你什么意思,是说你不能自己设置行高么
k80676535 2010-05-04
  • 打赏
  • 举报
回复
或者谁能帮我说明一下,为什么动态生成的控件只具有ClistCtrl的功能?派生的方法中关于显示的部分,无效,虚函数除外
k80676535 2010-05-04
  • 打赏
  • 举报
回复
很不好意思,五一外出啦~感谢大家帮忙
[Quote=引用 4 楼 yincheng01 的回复:]
对啊,这样还不行吗?响应WM_CREATE消息或者重载Create函数,在调用基类函数后子类化HeaderCtrl
[/Quote]

这个是可以的,但是重点是列表的那部分。表头已经可以做到子类化,这种方式比我原来的更好,但是列表那部分就没空办法了。
因为不能用CImageList方式来占位,基类中已经有对图标的应用,要响应ON_WM_MEASUREITEM_REFLECT消息的方式才可以,不然会破坏基类的功能
Eleven 2010-05-01
  • 打赏
  • 举报
回复
随手写了一个可能不是很像:

m_list.Create(LVS_REPORT|WS_BORDER|WS_CHILD|WS_VISIBLE, CRect(0, 0, 210, 200), this, 10001);
m_list.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);

CImageList img;
img.Create(1,24,TRUE|ILC_COLOR32,1,0);
m_list.SetImageList(&img,LVSIL_SMALL);

CString strTxt[] = {_T("1"), _T("2"),_T("3"),_T("4"),_T("5"),_T("6"),_T("7")};
for(int i=0; i<sizeof(strTxt)/sizeof(strTxt[0]); i++)
{
m_list.InsertColumn(i, strTxt[i], LVCFMT_CENTER, 30);
}
尹成 2010-05-01
  • 打赏
  • 举报
回复
对啊,这样还不行吗?响应WM_CREATE消息或者重载Create函数,在调用基类函数后子类化HeaderCtrl
cnzdgs 2010-05-01
  • 打赏
  • 举报
回复
响应WM_CREATE消息或者重载Create函数,在调用基类函数后子类化HeaderCtrl。
wmswxpmyl 2010-04-30
  • 打赏
  • 举报
回复
学习学习!!!!!!!!!!!!!
jeromeyu 2010-04-30
  • 打赏
  • 举报
回复
需要进行刷新吧

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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