社区
界面
帖子详情
用MFC写一个程序,怎么知道已经打开的窗体是模态窗体还是非模态的
wziyx513225244
2012-09-10 01:26:59
一个MFC程序,怎样知道已经打开的窗体是模态窗体还是非模态的窗体?
看了UISPY这个软件,它能正确区分模态窗体和非模态窗体
另经被人测试,同一个窗体无论是模态还是非模态,其style 和ExStyle都是一样的。
请高人指点一二。
...全文
322
12
打赏
收藏
用MFC写一个程序,怎么知道已经打开的窗体是模态窗体还是非模态的
一个MFC程序,怎样知道已经打开的窗体是模态窗体还是非模态的窗体? 看了UISPY这个软件,它能正确区分模态窗体和非模态窗体 另经被人测试,同一个窗体无论是模态还是非模态,其style 和ExStyle都是一样的。 请高人指点一二。
复制链接
扫一扫
分享
转发到动态
举报
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
打赏
举报
回复
不是你自己创建的?
点击其它背景看有啥反应(如果没有处理的话)
MFC
调用DLL文件中的对话框.非
模态
形式
调用DLL文件中的对话框_
一个
DLL的能成功_
一个
DLL不能成功DllDialogTest VS2010
写
的
一个
基于对话框的
MFC
程序
然后创建两个常规动态DLL文件 在DLL文件中分别添加对话框
一个
DLL的对话框能正常调用 另
一个
不行 均为非
模态
调用.... C++
MFC
模态
窗口、非
模态
窗口、树控件的使用
这是Visual Studio的
MFC
项目,展示了
模态
窗口、非
模态
窗口的使用。弹出
模态
窗口就会阻塞父窗口,并且展示了C++读取鼠标位置的方法。非
模态
窗口则不会阻塞父窗口。 主窗口展示了树控件的使用方法。
MFC
窗体
设计
MFC
窗体
设计,对于刚学习
MFC
的朋友很有用
MFC
窗体
小
程序
c++ 使用
MFC
编的
窗体
小
程序
,能够帮助加深对
MFC
架构的理解
模态
和非
模态
对话框创建示例
简单的
模态
和非
模态
对话框的示例,以便了解相关的基础操作,基于VC6.0。
界面
15,980
社区成员
115,868
社区内容
发帖
与我相关
我的任务
界面
VC/MFC 界面
复制链接
扫一扫
分享
社区描述
VC/MFC 界面
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章