1.CPropertyPage中的Apply按钮默认是Disabled的,如何让Apply按钮一开始就是Enabled,在OnInitDialog中调用SetModified无用!
2.为何MFC不能替我们监控控件状态的改变?每次改变控件的值以后,需要自己调用SetModified(true)才能使Apply按钮变为Enalbe?,当属性页中的控件很多时,这相当麻烦啊。有没有更好的解决办法

解决方案 »

  1.   

    The framework keeps track of which pages are “dirty”
    Apply按钮默认是Disabled你什么都没改变,怎么设为TRUE
      

  2.   

    1.我问的是如何能让Apply一开始就Enalbe,不要答非所问。SetModified是通过SendMessage PSM_CHANGED 来改变状态的。为何在OnInitDialog中调用无效。
    2.MSDN上是这么说" the framework keeps track of which pages are “dirty”"是实际上,当你改变控件状态时,Apply并不变成Enable!所以有此有一问
      

  3.   

    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设计的角度讲,即使他愿意这么做,他也不能保证成功。既然如此,何不让使用者(也就是程序员)控制这个当然说到底,产品为什么这么设计不一定有“为什么”的,有可能是微软开发进度赶不上,也许他认为没有那么大的需求,也许他认为不合理,这天知道。所以别问为什么,就是没有原因。
      

  4.   

    1.有些原因还是要深究的,不然一出问题就不知道怎么办了。
    无法在OnInitDialog中隐藏对话框,是因为打开一个无模对话框的顺序是:
    PreSubclassWindow()--> OnCreate() --> OnSize() --> OnMove() --> OnSetFont() --> OnInitDialog() --> OnShowWindow() -->OnCtlColor() --> OnChildNotify()
    在OnInitDialog()后Framework自动为你调用了OnShowWindow()函数,所以无法在OnInitDialog()中隐藏对话框。
    我在想原因是不是因为后面这个OnChildNotify造成的?
    2.谢谢你的回答。
      

  5.   

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

  6.   

    觉得你研究的方式还是不错,不过不要过于追求细节,需要学习的东西太多了,而你学习的时间是很宝贵的。如果未来需要,未来学好了。不要把未来可能的需求当作需求来学习,从而忽略了更重要的知识的学习。propertypage应该是没有这种功能的,首先这依赖控件的通知,而这个通知根本就没有实现过
    其次,不是所有的控件的更新都应该apply
    举个简单的例子,有些程序设置项很多,在propertypage之外,可能会使用combobox来作为一个多重选择项。例如,对于编辑控制的颜色控制,我在combobox中写入前景色、背景色和文字色,然后再在旁边放三个编辑框分别设置RGB。当我设置前景色,我会先选择combobox中的前景色,然后在编辑框中修改。考虑我在检查三个颜色的时候,我可能轮选combobox,然后在combobox的selchange事件中,我可能会用代码设置RGB的编辑框值。在这种情况下,四个控件都改变了,但是实际不需要apply
    另外一种情况是:我如果在界面上轮流的显示不同图片你是不是也不应该apply所以你认为必须的功能可能对别人是一个烦恼。如果一定要做,重载一个CPropertyPage,在他上面映射ON_COMMAND_RANGE, 批量检查子控件的通知消息也许是个方向