1.CPropertyPage中的Apply按钮默认是Disabled的,如何让Apply按钮一开始就是Enabled,在OnInitDialog中调用SetModified无用!
2.为何MFC不能替我们监控控件状态的改变?每次改变控件的值以后,需要自己调用SetModified(true)才能使Apply按钮变为Enalbe?,当属性页中的控件很多时,这相当麻烦啊。有没有更好的解决办法
2.为何MFC不能替我们监控控件状态的改变?每次改变控件的值以后,需要自己调用SetModified(true)才能使Apply按钮变为Enalbe?,当属性页中的控件很多时,这相当麻烦啊。有没有更好的解决办法
Apply按钮默认是Disabled你什么都没改变,怎么设为TRUE
2.MSDN上是这么说" the framework keeps track of which pages are “dirty”"是实际上,当你改变控件状态时,Apply并不变成Enable!所以有此有一问
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设计的角度讲,即使他愿意这么做,他也不能保证成功。既然如此,何不让使用者(也就是程序员)控制这个当然说到底,产品为什么这么设计不一定有“为什么”的,有可能是微软开发进度赶不上,也许他认为没有那么大的需求,也许他认为不合理,这天知道。所以别问为什么,就是没有原因。
无法在OnInitDialog中隐藏对话框,是因为打开一个无模对话框的顺序是:
PreSubclassWindow()--> OnCreate() --> OnSize() --> OnMove() --> OnSetFont() --> OnInitDialog() --> OnShowWindow() -->OnCtlColor() --> OnChildNotify()
在OnInitDialog()后Framework自动为你调用了OnShowWindow()函数,所以无法在OnInitDialog()中隐藏对话框。
我在想原因是不是因为后面这个OnChildNotify造成的?
2.谢谢你的回答。
加上SetModified(true),可以实现CPropertyPage中的Apply按钮默认是Enable。不过细想这样实际上用处不大。另外,还是希望有一种可以自动Track控件变化的PropertyPage,因为对于动态生成的PropertyPage,你需要为每一个控件去添加一个事件来设置Apply按钮的状态,这是相当麻烦的!
希望在这个方面可以继续讨论一下。
其次,不是所有的控件的更新都应该apply
举个简单的例子,有些程序设置项很多,在propertypage之外,可能会使用combobox来作为一个多重选择项。例如,对于编辑控制的颜色控制,我在combobox中写入前景色、背景色和文字色,然后再在旁边放三个编辑框分别设置RGB。当我设置前景色,我会先选择combobox中的前景色,然后在编辑框中修改。考虑我在检查三个颜色的时候,我可能轮选combobox,然后在combobox的selchange事件中,我可能会用代码设置RGB的编辑框值。在这种情况下,四个控件都改变了,但是实际不需要apply
另外一种情况是:我如果在界面上轮流的显示不同图片你是不是也不应该apply所以你认为必须的功能可能对别人是一个烦恼。如果一定要做,重载一个CPropertyPage,在他上面映射ON_COMMAND_RANGE, 批量检查子控件的通知消息也许是个方向