发现微软的一个重大BUG,真TMD~~~~气死我了,谁能解决。。。。。。。

szmaimu 2003-08-23 09:58:31
新建一个基于对话框应用程序。

新建一个CMySheet类由CPropertySheet类派生。
新建一个对话框,设置其基类为CPropertyPage ;
将这个属性页添加到属性表中。

目的是产生一个非模式的属性表,其父窗口为主对话框。

继续--->

在主对话框添加一个按钮响应事
CMainDlg::OnButton1()
{
CPropertySheet *psheet;
psheet= new CPropertySheet("fsd");
psheet->Create(this,WS_CHILD|WS_VISIBLE); /*--->这句是关键设置WS_CHILD 属性*/
sheet->MoveWindow(0,0,400,300);
}

编译运行。。。成功,点击按钮 ,显示属性表,似乎没有什么问题,但是好戏在后面呢。

然后 ,切换一下窗口,在切换过来,靠,死了????怎么会死了???

我试过很多次,如果不切换就一直没事,只要一切换 就翘了。

各位朋友可以试试!!!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~气死人。




...全文
101 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
fengqinggao 2003-08-24
  • 打赏
  • 举报
回复
高手!pfpf!学习来了,从此不敢再胡言乱语,呵呵
whoo 2003-08-23
  • 打赏
  • 举报
回复
Faint, 我试着修改CPropertySheet 以处理这种情况的时候,发现MSDN中有关于这一Bug地说明!! 7456, 还我白费了半天劲。

MSDN说原因 是因为 CProperthSheet缺省没有 WS_EX_CONTROLPARENT属性,导致 Focus切换时(WM_ACTIVE),找不到 Dialog Control, 而一直尝试找 Dialog Control(WM_GETDLGCODE)。 我部分猜中了原因,却想不到结果如此简单。

解决的办法更简单,给CPropertySheet加上 WS_EX_CONTROLPARENT 属性。
BOOL CMySheet::OnInitDialog()
{
ModifyStyleEx (0, WS_EX_CONTROLPARENT);
return CPropertySheet::OnInitDialog();
}


MSDN Title:
PRB: Child CPropertySheet Hangs If Focus Is Switched
whoo 2003-08-23
  • 打赏
  • 举报
回复
呵呵,再现了一下楼主的代码,果然如此。

暂停程序可以发现 程序陷入了 消息死循环,相关的消息为 WM_ACTIVE (0x6) 和 WM_GETDLGCODE(135)。

跟踪发现消息分发无法找到处理WM_GETDLGCODE的dlg proc, 于是由default处理,返回0。

由此推测 判断CPropertySheet 和 CDialog冲突。发给CPropertySheet的WM_GETDLGCODE被CDialog处理,而CDialog无法知道CPropertySheet的内容,无法处理该消息,而WM_ACTIVE需要知道WM_GETDLGCODE值以进行进一步处理,于是重复尝试WM_GETDLGCODE, 造成死循环。

解决方案,用CWnd最为父窗口,而不是CDialog,应该可以避免这个问题。
fengqinggao 2003-08-23
  • 打赏
  • 举报
回复
如果你想那个CSheet完全附属于(就像文本框控件一样)一个对话框,是不是用CTabCtrl来得好些?
fengqinggao 2003-08-23
  • 打赏
  • 举报
回复
如楼主所说,你把他的那个 WS_CHILD 属性去掉就可以了,它只能是弹出窗口,不可能是像控件一样的完全附属的子窗口,所以不能有该属性
whoo 2003-08-23
  • 打赏
  • 举报
回复
晕,楼主的代码没有明显的错误啊。应该是其他方面的问题。

我用CPropertySheet的时候也碰到过类似的问题。但是我的情况比较复杂:dll + 进程注入;而且是xp没问题,2000容易死。原因不好找,所以我是不停的变换做法的。

改了N此才不出问题,都不知道改了哪儿了,也不知道原因在哪儿:)
西江残月 2003-08-23
  • 打赏
  • 举报
回复
好象不是这样的,我也遇到过最后也没解决,我把它设成成员变量的!
fengqinggao 2003-08-23
  • 打赏
  • 举报
回复
呵呵,这个只能说是代码错误,不能算Bug吧

这个非模式对话框的属性只能是Popup,不能是Child,虽然你传入了this指针,但他并不是你的this窗口的一部分,而是完完全全的另一个窗口,它不象那些CEdit等控件一样完全属于父窗口,那些控件,是必须是Child属性。

当然,楼上说的也很有道理,模态对话框可以用临时指针,因为在只要这个窗口消失,该函数执行完,该指针也就消失了,而非模态的不行,出了这个函数,窗口还存在,但是它的指针有可能已经失去了,也会出问题
firebolt2002 2003-08-23
  • 打赏
  • 举报
回复
CPropertySheet *psheet;申明为全局变量或成员变量,显示不出是应为这个指针的生命周期之是在函数体内,函数执行后,指针已经不起作用了,你可以用
CPropertySheet psheet("fsd");
sheet.DoModal();

16,471

社区成员

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

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

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