首页 新闻 会员 周边 捐助

多窗口,关于模态对话框的问题,求救

0
悬赏园豆:100 [待解决问题]

问题描述(C++,MFC):
      主线程打开:A(MainFrame),A打开B(NewFrame),B打开模态对话框C(Dialog)
      问题是:鼠标能激活A(MainFrame),但是不能对A(MainFrame)进行操作。此时该窗体的Enable状态是不可以用的。
求助:
      如果在B打开模态对话框之后,A不能响应激活消息。
      效果就像:OutLook(A)->新建邮件(B)->选择联系人(C)之后的工作效果;
求高人相助……
不胜感激。

sunlike的主页 sunlike | 初学一级 | 园豆:102
提问于:2012-09-18 16:52
< >
分享
所有回答(1)
0

没有OutLook,你能否截个图给看看。

Launcher | 园豆:45050 (高人七级) | 2012-09-18 17:18

我觉得上图也不能很好的描述:我给你解释一下,看看你能看懂不 ?

我现在点击A,A会显示为顶层,但不能进行操作,isEnable = false。
outlook,点击A的时候,会把C显示出来,从顶层往下一次是C->B->A.

支持(0) 反对(0) sunlike | 园豆:102 (初学一级) | 2012-09-18 17:20

@sunlike: 你是用MFC的模板创建的项目吗?你在ChildFrame中创建 Dialog 的代码是如何实现的?

支持(0) 反对(0) Launcher | 园豆:45050 (高人七级) | 2012-09-18 17:23

@Launcher: 

给你贴一段代码:

CDlgSelUser Dlg;

if (Dlg.DoModal() == IDCANCEL) {
return;
}

没什么问题的哦。

支持(0) 反对(0) sunlike | 园豆:102 (初学一级) | 2012-09-18 17:29

@sunlike: 我是想知道你这段代码放在哪里的?

支持(0) 反对(0) Launcher | 园豆:45050 (高人七级) | 2012-09-18 17:35

@Launcher: 

放在一个按钮的事件里啊,亲

支持(0) 反对(0) sunlike | 园豆:102 (初学一级) | 2012-09-18 17:41

@sunlike: 你能不能具体的把代码贴出来,到底是出现在NewFrame或MainFrame,或是XXXView里?

支持(0) 反对(0) Launcher | 园豆:45050 (高人七级) | 2012-09-18 17:43

@Launcher: 

我是这样搞的:

这个按钮在一个panel(P)中,P是NewFrame的一个成员。刚才贴的按钮的事件是在Panel(p)中。

支持(0) 反对(0) sunlike | 园豆:102 (初学一级) | 2012-09-18 17:58

@sunlike: 根据你的叙述,我终于还原了你的场景,首先NewFrame不是MainFrame的子窗体,MainFrame不是MDI容器,所以才会出现你描述的问题,下面是一种可能的实现方式:

你应该在Dialog中捕获鼠标事件:SetCapture和 ReleaseCapture,然后通过鼠标事件来判断鼠标是否点击了你的MainFrame窗体(通过MainFrame的GetWindowRect来获取矩形框,注意,需要将鼠标坐标转换为桌面坐标),如果鼠标Click在MainFrame窗体内,则激活当前窗口。

你可以参照在MFC中实现下拉显示树形控件的ComboBox的方式来理解该方法。

支持(1) 反对(0) Launcher | 园豆:45050 (高人七级) | 2012-09-18 18:16

@Launcher: 
谢谢你的分析。
但是我还有一个问题
1:我写的这样的对话框,有很多,大概有20-30个左右。改动较大。
3:如果我调用了通用对话框,指出了Dialog,还是不能从根本上解决问题。
请问还有别的好方法吗 ?

支持(0) 反对(0) sunlike | 园豆:102 (初学一级) | 2012-09-18 19:22

@sunlike: 

这很简单啊,b弹出的那个对话框具有topmost属性,就是这效果。

支持(0) 反对(0) hoodlum1980 | 园豆:573 (小虾三级) | 2012-09-19 03:38

@hoodlum1980: 

topmost恐怕不行吧 

支持(0) 反对(0) sunlike | 园豆:102 (初学一级) | 2012-09-19 08:36

@sunlike: 你可以写一个从CDialog继承的子类 CDialogEx,然后把这个逻辑写在 CDialogEx 中,这样你的其它对话框就可以继承它。

其它方法有,但是,其它的好方法没有了。

支持(0) 反对(0) Launcher | 园豆:45050 (高人七级) | 2012-09-19 09:03

@Launcher: 

这个方法我试过了,可行。

不过对通用对话框无能为力,对messagebox也没有办法。对于两者还会出现我描述的问题。

支持(0) 反对(0) sunlike | 园豆:102 (初学一级) | 2012-09-19 09:12

@sunlike: 你需要自己编写一个MessageBox,把通用对话框嵌入在你的CDialogEx中,正如我们在制作特殊的ComboBox的时候,会把通用控件嵌入在我们的Popup Window中一样。

如果你不想做这么大的改动,或者你想一劳永逸的解决此问,你可以使用MDI框架,这样弹出的模态对话框会禁止你点击你的MainFrame和NewFrame。

支持(0) 反对(0) Launcher | 园豆:45050 (高人七级) | 2012-09-19 09:28

@Launcher: 

Thanks anyway.

谢谢你给我指出那么多意见。

我试试看。

支持(0) 反对(0) sunlike | 园豆:102 (初学一级) | 2012-09-19 09:34
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册