属性页的SetModified问题

ustcfxx 2008-04-07 10:38:09
1.CPropertyPage中的Apply按钮默认是Disabled的,如何让Apply按钮一开始就是Enabled,在OnInitDialog中调用SetModified无用!
2.为何MFC不能替我们监控控件状态的改变?每次改变控件的值以后,需要自己调用SetModified(true)才能使Apply按钮变为Enalbe?,当属性页中的控件很多时,这相当麻烦啊。有没有更好的解决办法
...全文
438 点赞 收藏 9
写回复
9 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
houzi80 2010-01-15
学习了
回复
ustcfxx 2008-04-08
校友起得好早啊,不到七点就回我帖了。
再次谢谢你。
回复
arong1234 2008-04-08
看你名字也一定和我一样来自南七技校吧?咱南七技校的人往往过于重内功,实际这种内功可能一辈子都用不上。
回复
arong1234 2008-04-08
觉得你研究的方式还是不错,不过不要过于追求细节,需要学习的东西太多了,而你学习的时间是很宝贵的。如果未来需要,未来学好了。不要把未来可能的需求当作需求来学习,从而忽略了更重要的知识的学习。

propertypage应该是没有这种功能的,首先这依赖控件的通知,而这个通知根本就没有实现过
其次,不是所有的控件的更新都应该apply
举个简单的例子,有些程序设置项很多,在propertypage之外,可能会使用combobox来作为一个多重选择项。例如,对于编辑控制的颜色控制,我在combobox中写入前景色、背景色和文字色,然后再在旁边放三个编辑框分别设置RGB。当我设置前景色,我会先选择combobox中的前景色,然后在编辑框中修改。

考虑我在检查三个颜色的时候,我可能轮选combobox,然后在combobox的selchange事件中,我可能会用代码设置RGB的编辑框值。在这种情况下,四个控件都改变了,但是实际不需要apply
另外一种情况是:我如果在界面上轮流的显示不同图片你是不是也不应该apply

所以你认为必须的功能可能对别人是一个烦恼。

如果一定要做,重载一个CPropertyPage,在他上面映射ON_COMMAND_RANGE, 批量检查子控件的通知消息也许是个方向
[Quote=引用 5 楼 ustcfxx 的回复:]
在自己派生的Dialog类中重载CWnd的OnChildNotify( UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pLResult )方法,
加上SetModified(true),可以实现CPropertyPage中的Apply按钮默认是Enable。不过细想这样实际上用处不大。

另外,还是希望有一种可以自动Track控件变化的PropertyPage,因为对于动态生成的PropertyPage,你需要为每一个控件去添加一个事件来设置Apply按钮的状态,这是相当麻烦的!
希望在这个方…
[/Quote]
回复
ustcfxx 2008-04-07
在自己派生的Dialog类中重载CWnd的OnChildNotify( UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pLResult )方法,
加上SetModified(true),可以实现CPropertyPage中的Apply按钮默认是Enable。不过细想这样实际上用处不大。

另外,还是希望有一种可以自动Track控件变化的PropertyPage,因为对于动态生成的PropertyPage,你需要为每一个控件去添加一个事件来设置Apply按钮的状态,这是相当麻烦的!
希望在这个方面可以继续讨论一下。

回复
ustcfxx 2008-04-07
1.有些原因还是要深究的,不然一出问题就不知道怎么办了。
无法在OnInitDialog中隐藏对话框,是因为打开一个无模对话框的顺序是:
PreSubclassWindow()--> OnCreate() --> OnSize() --> OnMove() --> OnSetFont() --> OnInitDialog() --> OnShowWindow() -->OnCtlColor() --> OnChildNotify()
在OnInitDialog()后Framework自动为你调用了OnShowWindow()函数,所以无法在OnInitDialog()中隐藏对话框。
我在想原因是不是因为后面这个OnChildNotify造成的?
2.谢谢你的回答。
回复
arong1234 2008-04-07
1. 因为一般在OnInitDialog之后会有一个初始化完成过程,可能在哪里设置了状态。这里没有啥为什么,可能就是人家设计没考虑到。有很多东西都这样,例如,你无法在OnInitDialog里隐藏对话框,设计就这样了,有什么为什么的?

2. 你只引用人家第一句,人家完整的句子是
The framework keeps track of which pages are "dirty," that is, property pages for which you have called SetModified( TRUE ).

翻译:框架跟踪那些被设置为dirty的页,也就是那些被你用True调用SetModified的页

也就是说,所谓的track并不是跟踪页面上控件的变化,而是你调用SetModified的情况

至于为什么不让系统自动跟踪控件的变化,潜在的原因(真实的原因只有问微软设计这个程序的人)是:我们不能保证每个控件都会告诉page自己变化了。例如我自己设计一个控件,从来不通知父窗口怎么办?因此从propertypage设计的角度讲,即使他愿意这么做,他也不能保证成功。既然如此,何不让使用者(也就是程序员)控制这个

当然说到底,产品为什么这么设计不一定有“为什么”的,有可能是微软开发进度赶不上,也许他认为没有那么大的需求,也许他认为不合理,这天知道。所以别问为什么,就是没有原因。
回复
ustcfxx 2008-04-07
1.我问的是如何能让Apply一开始就Enalbe,不要答非所问。SetModified是通过SendMessage PSM_CHANGED 来改变状态的。为何在OnInitDialog中调用无效。
2.MSDN上是这么说" the framework keeps track of which pages are “dirty”"是实际上,当你改变控件状态时,Apply并不变成Enable!所以有此有一问
回复
Aeolia_Tao 2008-04-07
The framework keeps track of which pages are “dirty”
Apply按钮默认是Disabled你什么都没改变,怎么设为TRUE
回复
相关推荐
发帖
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
帖子事件
创建了帖子
2008-04-07 10:38
社区公告

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