用MFC写一个程序,怎么知道已经打开的窗体是模态窗体还是非模态的

wziyx513225244 2012-09-10 01:26:59
一个MFC程序,怎样知道已经打开的窗体是模态窗体还是非模态的窗体?
看了UISPY这个软件,它能正确区分模态窗体和非模态窗体

另经被人测试,同一个窗体无论是模态还是非模态,其style 和ExStyle都是一样的。
请高人指点一二。
...全文
322 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
wziyx513225244 2012-09-13
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]

这种方法还是有局限性的。第一个对话框没有父窗口,那怎么判断呢?
【引用】
使用模态对话框,其上级窗体对话框的IsWindowEnable() == false 即不可用(不可以获得输入焦点)
使用非模态对话框,其上级窗体对话框的IswindowEnable() == true,即可用(可以获得输入焦点)
【/引用】
[/Quote]
m_nFlag & WF_MODALLOOP 这个可以判断,那个是模态对话框,不管是不是第一个对话框。
sumos 2012-09-13
  • 打赏
  • 举报
回复
这种方法还是有局限性的。第一个对话框没有父窗口,那怎么判断呢?
【引用】
使用模态对话框,其上级窗体对话框的IsWindowEnable() == false 即不可用(不可以获得输入焦点)
使用非模态对话框,其上级窗体对话框的IswindowEnable() == true,即可用(可以获得输入焦点)
【/引用】
schlafenhamster 2012-09-12
  • 打赏
  • 举报
回复
现在MFC都是用Create来模拟DoModel的。
xkxnq 2012-09-12
  • 打赏
  • 举报
回复
模式对话框的使用
1 写对话框窗口处理函数
BOOL CALLBACK DialogProc(
HWND hwndDlg, //窗口句柄
UINT uMsg, //消息ID
WPARAM wParam, //消息参数
LPARAM lParam //消息参数
);
返回TRUE,代表 处理函数已经处理,不需要 缺省处理函数再处理
返回FALSE,代表 处理函数未处理,需要 缺省处理函数再处理
主:窗口处理函数是 自定义处理函数 调用 缺省处理函数
对话框处理函数是 缺省处理函数调用 自定义处理函数
因此:自定义对话框处理函数时,不需要 调用缺省处理函数
2 用 对话框资源 免于 注册。
3 创建模式对话框
INT_PTR DialogBox(
HINSTANCE hInstance,//应用程序实例句柄
LPCTSTR lpTemplate, //对话框模板资源ID
HWND hWndParent, //对话框父窗口
DLGPROC lpDialogFunc //对话框窗口处理函数
);
DialogBox是一个阻塞函数,只有当对话框关闭后,才会返回,继续执行后续代码。
返回值是通过EndDialog设置。
4 关闭模式对话框
必须使用函数 EndDialog,不能使用DestroyWindow等函数。
BOOL EndDialog(
HWND hDlg,//关闭的对话框窗口句柄
INT_PTR nResult //关闭的返回值,就是DialogBox的返回值
);

对话框的消息:
WM_INITDIALOG - 对话框创建之后显示之前,通知对话框窗口处理函数,可以完成自己的初始化相关的操作,不是使用WM_CREATE消息

无模式对话框
无模式对话框的处理函数和消息 与 模式对话框是一样的。
创建无模式对话框用CreateDialog函数,参数和DialogBox一样,但返回不同,CreateDialog函数 返回 HWND句柄。
无模式对话框创建后 要使用ShowWindow函数显示。
销毁无模式对话框用DestroyWindow函数,而不是EndDialog函数
wziyx513225244 2012-09-10
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

1:
模态打开的一定要处理完自己对话框内容关闭后才能处理主窗体的
非模态则没这个问题。
(当然如果多线程的话,令当别论)

2:
模态关闭对话框是就真的关闭。非模态是隐藏

3:
PretanslateMessage,模态可以接收到
非模态的是主窗体接收。
[/Quote]
最终状态都是关闭的。
使用模态对话框,其上级窗体对话框的IsWindowEnable() == false 即不可用(不可以获得输入焦点)
使用非模态对话框,其上级窗体对话框的IswindowEnable() == true,即可用(可以获得输入焦点)
wziyx513225244 2012-09-10
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

我觉得非模态也是关闭了的,即DestroyWindow,但是对象没有删除(因为一般用的是成员变量)。如果说只是隐藏,那么你关闭后调用ShowWindow不会出错,可事实是会断言。
引用 3 楼 的回复:
1:
模态打开的一定要处理完自己对话框内容关闭后才能处理主窗体的
非模态则没这个问题。
(当然如果多线程的话,令当别论)

2:
模态关闭对话框是就真的关闭。非模态是隐藏

……
[/Quote]

使用m_nFlag & WF_MODALLOOP 进行判断,可以判断是不是模态对话框
sumos 2012-09-10
  • 打赏
  • 举报
回复
我觉得非模态也是关闭了的,即DestroyWindow,但是对象没有删除(因为一般用的是成员变量)。如果说只是隐藏,那么你关闭后调用ShowWindow不会出错,可事实是会断言。
[Quote=引用 3 楼 的回复:]
1:
模态打开的一定要处理完自己对话框内容关闭后才能处理主窗体的
非模态则没这个问题。
(当然如果多线程的话,令当别论)

2:
模态关闭对话框是就真的关闭。非模态是隐藏

3:
PretanslateMessage,模态可以接收到
非模态的是主窗体接收。
[/Quote]
wziyx513225244 2012-09-10
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

楼主可以通过测试窗体有没有消息循环来判断
有就是模态
没有就是非模态
[/Quote]
我正在测试这种方法
看不见的裂痕 2012-09-10
  • 打赏
  • 举报
回复
楼主可以通过测试窗体有没有消息循环来判断
有就是模态
没有就是非模态
看不见的裂痕 2012-09-10
  • 打赏
  • 举报
回复
1:
模态打开的一定要处理完自己对话框内容关闭后才能处理主窗体的
非模态则没这个问题。
(当然如果多线程的话,令当别论)

2:
模态关闭对话框是就真的关闭。非模态是隐藏

3:
PretanslateMessage,模态可以接收到
非模态的是主窗体接收。
wziyx513225244 2012-09-10
  • 打赏
  • 举报
回复
我的意思:可以使用代码判断。
你给的思路,也是一种办法,但不能解决根本问题啊
lgstudyvc 2012-09-10
  • 打赏
  • 举报
回复
不是你自己创建的?

点击其它背景看有啥反应(如果没有处理的话)

15,980

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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