难题:DoModal的功能如果要让自己来实现有什么方法没有?

w_anthony 2007-09-26 11:27:18
问题是这样的,现在有一个继承自CWnd的类,当程序运行到“需要使用DoModal功能”的地方时,窗口早就已经通过CreateEx创建了,只是被隐藏着而已。
所以设想自己模拟一个类似DoModal的功能,原来DoModal的“确定”、“取消”并不销毁窗口,而只是隐藏窗口而已。
上面这些的实现基本上没有问题,就是在ShowWindow(SW_SHOW)后自己处理一下消息循环就OK了,但是现在遇到以下几个难题:
1、模拟DoModal,必定要使“AfxGetMainWnd()”EnableWindow(FALSE),如果将那个已经创建CWnd的窗口的父窗口设为“AfxGetMainWnd()”,结果连它一起被屏蔽了;而如果不设这个父窗口,那么无法保证这个弹出窗口永远在主窗口之上。
2、如果不对这个CWnd的窗口设置WS_EX_TOOLWINDOW属性,那么任务栏下面就有它的一个窗口按钮;而如果设置了这个属性,那么Alt+Tab里面就找不到这个进程的窗口了。
3、如果是要新建一个继承于CDialog的类,那么必须要在资源里面也新建一个对话框,而我这个类是要直接提供给别人用的,如果还要求别人去修改资源,显然是不合适的。

请教高人,有没有什么解决办法?
...全文
525 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
lyg_zy 2007-09-27
  • 打赏
  • 举报
回复
模拟CDialog::DoModal应该可以。
w_anthony 2007-09-27
  • 打赏
  • 举报
回复
弄错了,不是0xC0CB,是0xC0BB,以下是从非激活状态,点击任务栏按钮后,收到的一连串消息:
0x0000c0bb
0x0000c0c6
0x0000c0bb
0x0000c0c0
0x0000c0c0
0x0000c0c0
0x00000113
0x0000020a
0x00000113
0x00008002
0x00008002
0x0000000f
0x00000113
0x00008002
0x00008002
0x0000000f
0x00000113
0x00008002
0x00008002
0x0000000f
0x00000113
0x00008002
0x00008002
0x0000000f
0x00000113
0x00008002
0x00008002
0x0000000f
0x00000113
0x00008002
0x00008002
0x0000000f
0x00000113
0x00008002
0x00008002
0x0000000f
0x00000113
0x00008002
0x00008002
0x0000000f
0x00000113
0x00008002
0x00008002
0x0000000f
0x00000113
0x00008002
0x00008002
0x0000000f
0x00000113
0x00008002
0x00008002
0x0000000f
0x00000113
0x00008002
0x00008002
0x0000000f
0x0000c0bb
0x00000113
0x00008002
0x00008002
0x0000000f
0x00000113
0x00008002
0x00008002
0x0000000f
0x00000113
0x00008002
0x00008002
0x0000000f
0x00000113
0x00000113
0x00008002
0x00008002
0x0000000f
0x00000113
0x00008002
0x00008002
0x0000000f
0x00000113
0x00008002
0x00008002
0x0000000f
0x00000113
0x00008002
0x00008002
0x0000000f
0x00000113
0x00008002
0x00008002
0x0000000f
0x00000113
0x00008002
0x00008002
0x0000000f
0x00000113
0x00008002
0x00008002
0x0000000f
0x00000113
0x00008002
0x00008002
0x0000000f
0x00000113
0x00008002
0x00008002
0x0000000f
0x00000113
0x00008002
0x00008002
0x0000000f
0x00000113
0x00008002
0x00008002
0x0000000f
0x00000113
0x00008002
0x00008002
0x0000000f
0x00000113
0x00008002
0x00008002
0x0000000f
0x00000113
0x00008002
0x00008002
0x0000000f
0x00000113
0x00008002
0x00008002
0x0000000f
0x00000113
0x00008002
0x00008002
0x0000000f
0x00000113
0x00008002
0x00008002
0x0000000f
0x00000113
0x00008002
0x0000000f
0x00000113
0x00008002
0x00000113
0x00008002
0x00008002
0x0000000f
0x00008002
0x00008002
0x00008002
w_anthony 2007-09-27
  • 打赏
  • 举报
回复
LS这方法是行不通的,我只负责处理B窗口这个类的代码,A窗口的代码我不能改。
另外如果B的父窗口不是主窗口,那么任务栏会多一个按钮,如果加了WS_EX_TOOLWINDOW,Alt+Tab就会找不到。

现在功能方面基本上已经解决了,在就剩一个疑问和一个小问题了:
1、在CreateEx里设置父窗口和用SetParent设置父窗口为什么会有区别?区别见LS4层。
2、点任务栏按钮会有什么消息,我用PeekMessage可以发现第一个消息是0xC0CB,但是根本不知道这是什么消息。
龙凤呈祥焱 2007-09-27
  • 打赏
  • 举报
回复
另外,不要把主窗口设为自己的父窗口.
龙凤呈祥焱 2007-09-27
  • 打赏
  • 举报
回复
需要两个窗口之间配合一下就可以了.设A为普通窗口,B为需要显示为模态的窗口.
1.把A窗口Disable掉.
2.把B窗口提到最前.
3.处理A窗口的激活事件.当收到A激活消息时,把B提到最前.这样.不认ALT+TAB还是任务栏按钮都无法让A激活状态.
w_anthony 2007-09-27
  • 打赏
  • 举报
回复
自己顶起……
w_anthony 2007-09-26
  • 打赏
  • 举报
回复
DialogBox也需要对话框资源,并且也是新建一个窗口阿。
至于MessageBox也是不行的,因为我的模拟DoModal弹出窗口,是要自绘的。

其实只要解决两个问题就可以了:
1、模拟的弹出窗口必定在主窗口前,并且屏蔽主窗口不会导致自己也被屏蔽。
2、模拟的弹出窗口不能显示在任务栏上,而进程的主窗口应该可以被Alt+Tab找到。

真不知道CDialog::DoModal作了些什么关键步骤才可以达到那个效果。我拷贝CDialog::DoModal的代码,去掉一些CDialog特有成员变量的语句,就无法达到预期目的。
qeq2008 2007-09-26
  • 打赏
  • 举报
回复
自己不想建军对话框资源有点难办.......那你只在用
if(MessageBox("是否真的删除121212? ","删除",MB_YESNO|MB_ICONQUESTION) != IDYES)这一类的东西控件了,那样要跟踪事件,也要别人改代码同样不能直接用

关注!
oldn123 2007-09-26
  • 打赏
  • 举报
回复
试试DialogBox
w_anthony 2007-09-26
  • 打赏
  • 举报
回复
刚刚将父窗口设为AfxGetMainWnd,然后对父窗口EnableWindow(FALSE),再对自己EnableWindow(TRUE)就可以了-_-b。

不过还是有两个小问题,不算重要了:
1、设父窗口,必须在CreateEx创建窗口的时候直接传进去才可以,如果是之后使用SetParent设置,那么调用pParent->EnableWindow时会在访问m_pCtrlSite变量处出异常,如果用API只对父窗口本身EnableWindow(FALSE),但不知为何自己的弹出窗口会被父窗口盖住。
2、弹出窗口出来后,如果整个窗口被其他窗口覆盖,点任务栏按钮也不能显示出来,但用Alt+Tab可以显示。不知道任务栏按钮是什么消息,不然就可以手动将界面显示出来了。

请高人指点!

w_anthony 2007-09-26
  • 打赏
  • 举报
回复
有什么默认的“空白无标题无边框”的对话框资源没有?
因为是给别人用,我无法确保他的程序里面一定有什么……
Yofoo 2007-09-26
  • 打赏
  • 举报
回复
重新建立一个模式对话框(使用现成的资源)就可以了, 不用搞的那么复杂!

16,472

社区成员

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

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

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