新建一个基于对话框应用程序。
新建一个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);
}
编译运行。。。成功,点击按钮 ,显示属性表,似乎没有什么问题,但是好戏在后面呢。
然后 ,切换一下窗口,在切换过来,靠,死了????怎么会死了???
我试过很多次,如果不切换就一直没事,只要一切换 就翘了。
各位朋友可以试试!!!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~气死人。
如果你想那个CSheet完全附属于一个对话框,是不是用CTabCtrl来得好些?
呵呵,再现了一下楼主的代码,果然如此。
暂停程序可以发现 程序陷入了 消息死循环,相关的消息为 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,应该可以避免这个问题。