已知的CPropertysheet bug: 切换焦点导致无响应

来源:互联网 发布:阿里云免费邮箱 - 百度 编辑:程序博客网 时间:2024/04/29 04:29

当一个页面内容比较多时我们首先可能考虑用Tab Control,但如果有很多页面内容需要动态加载则用CPropertySheet比较好点~

CPropertySheet有两种不同的显示模式.一种就是向导页面,另一种就是跟Tab Control一样的效果.

 

假如这样一个简单的CPropertySheet (可以把它看成一个容器,里面装着很多个CPropertyPage)

public CSheet : public CPropertySheet{

//.....

}

 

CSheet sheet;

sheet.DoModal();

这样使用不管你怎么点来点去都不会有问题.

 

但如果你是把CPropertySheet放到一个Dialog中去,或者嵌套到另外一个CPropertySheet里.

CSheet* pSheet;

 

pSheet = new CSheet;

pSheet->Create(this,DS_CONTEXTHELP | DS_SETFONT | WS_CHILD | WS_VISIBLE|WS_CLIPCHILDREN|WS_CLIPSIBLINGS);

 

当你在CPropertySheet中点一下,然后切换到其他地方点下,现点回来时页面就卡住没反应了.而且不是只卡一会而是永远处是Not Responding的状态.这应该算是CPropertySheet的一个已知的bug

参见: http://support.microsoft.com/kb/149501/en-us

 

就是需要设置下一个属性

pSheet->Create(this,DS_CONTEXTHELP | DS_SETFONT | WS_CHILD | WS_VISIBLE|WS_CLIPCHILDREN|WS_CLIPSIBLINGS,

,WS_EX_CONTROLPARENT

);

 

 

这样一设置点来点去也不会卡死在那了.不过有些时候这样设置了还不行.还得在

OnInitDialog和PreCreateWindow中再设置下属性

参见: http://bbs.csdn.net/topics/80402533

 

特殊情况的处理

前面讲的只是两种情形:1.有一个CDialog,然后上面有个CPropertySheet . 2.在1中的CPropertySheet中再嵌套一个CPropertySheet.

但如果是更复杂的情况呢.

假如CDialog里面有一个动态创建的CWnd或CDialog,然后再嵌套两个CPropertySheet.此时会发现给外层的CPropertySheet这样更改属性

m_pSheet->ModifyStyleEx(0,WS_EX_CONTROLPARENT); 运行之后会出错. 那咋办呢?

要把动态创建的CWnd或CDialog的属性也更改下才行.m_pWnd->ModifyStyleEx(0,WS_EX_CONTROLPARENT);

 

原创粉丝点击