复习复习和总结总结-关于模式与非模式对话框
复习复习和总结总结-关于模式与非模式对话框
对话框有两种创建方式:DoModal和Creat。其中DoModal创建的是模态的对话框,而Creat创建的是非模态的对话框下面总结下他们的不同。
对于模态的对话框,在该对话框被关闭前,用户将不能在同一应用程序的其他地方进行工作(例如open file对话框),而对于非模态的对话框,在它留在屏幕上的同时可以在其他的地方进行工作,(例如find file对话框)
Create的Dialog一般是modalless,如果你的程序本身就是只有一个Dialog,就无所谓了,看不出modalless的效果。modalless本来就是让有机会切换到本程序的其他窗口。
下面摘抄一部分,很基础,很全面
非模态对话框的特点
与模态对话框不同,非模态对话框不垄断用户的输入,用户打开非模态对话框后,仍然可以与其它界面进行交互。
非模态对话框的设计与模态对话框基本类似,也包括设计对话框模板和设计CDialog类的派生类两部分。但是,在对话框的创建和删除过程中,非模态对话框与模态对话框相比有下列不同之处:
?非模态对话框的模板必须具有Visible风格,否则对话框将不可见,而模态对话框则无需设置该项风格。更保险的办法是调用
CWnd::ShowWindow(SW_SHOW)来显示对话框,而不管对话框是否具有
Visible风格。
?非模态对话框对象是用new操作符在堆中动态创建的,而不是以成员变量的形式嵌入到别的对象中或以局部变量的形式构建在堆栈上。通常应在对话框的拥有者窗口类内声明一个指向对话框类的指针成员变量,通过该指针可访问对话框对象。
?通过调用CDialog::Create函数来启动对话框,而不是
CDialog::DoModal,这是模态对话框的关键所在。由于Create函数不会启
动新的消息循环,对话框与应用程序共用同一个消息循环,这样对话框就不会垄断用户的输入。Create在显示了对话框后就立即返回,而DoModal 是
在对话框被关闭后才返回的。众所周知,在MFC程序中,窗口对象的生存期应长于对应的窗口,也就是说,不能在未关闭屏幕上窗口的情况下先把对应的窗口对象删除掉。由于在Create返回后,不能确定对话框是否已关
闭,这样也就无法确定对话框对象的生存期,因此只好在堆中构建对话框对
象,而不能以局部变量的形式来构建之。
?必须调用CWnd::DestroyWindow而不是CDialog::EndDialog来关闭非模态对话框。调用CWnd:: DestroyWindow是直接删除窗口的一般方法。由于缺省的CDialog::OnOK和CDialog::OnCancel 函数均调用EndDialog,故程
序员必须编写自己的OnOK和OnCancel函数并且在函数中调用
DestroyWindow来关闭对话框。
?因为是用new操作符构建非模态对话框对象,因此必须在对话框关闭后,用delete操作符删除对话框对象。在屏幕上一个窗口被删除后,框架会调用CWnd::PostNcDestroy,这是一个虚拟函数,程序可以在该函数中完成删除窗口对象的工作,具体代码如下
void CModelessDialog::PostNcDestroy
{
delete this; //删除对象本身
}
这样,在删除屏幕上的对话框后,对话框对象将被自动删除。拥有者对象就不必显式的调用delete来删除对话框对象了。
?必须有一个标志表明非模态对话框是否是打开的。这样做的原因是用户有可能在打开一个模态对话框的情况下,又一次选择打开命令。程序根据标志来决定是打开一个新的对话框,还是仅仅把原来打开的对话框激活。通
常可以用拥有者窗口中的指向对话框对象的指针作为这种标志,当对话框关闭时,给该指针赋NULL值,以表明对话框对象已不存在了。
根据上面的分析,我们很容易把Register程序中的登录数据对话框改成非模态对话框。这样做的好处在于如果用户在输入数据时发现编辑视图中有错误的数据,那么不必关闭对话框,就可以在编辑视图中进行修改。
窗口对象的自动清除
一个MFC窗口对象包括两方面的内容:一是窗口对象封装的窗口,即存放在m_hWnd成员中的HWND(窗口句柄),二是窗口对象本身是一个C++对象。要删除一个MFC窗口对象,应该先删除窗口对象封装的窗口,然后删除窗口对象本身。
删除窗口最直接方法是调用CWnd::DestroyWindow或::DestroyWindow,前者封装了后者的功能。前者不仅会调用后者,而且会使成员m_hWnd保存的HWND 无效(NULL)。如果DestroyWindow删除的是一个父窗口或拥有者窗口,则该函数
会先自动删除所有的子窗口或被拥有者,然后再删除父窗口或拥有者。在一般情况下,在程序中不必直接调用DestroyWindow来删除窗口,因为MFC会自动调用DestroyWindow来删除窗口。例如,当用户退出应用程序时,会产生WM_CLOSE 消息,该消息会导致MFC自动调用CWnd:: DestroyWindow来删除主框架窗口,当用户在对话框内按了OK或Cancel按钮时,MFC会自动调用CWnd:: DestroyWindow来删除对话框及其控件。
窗口对象本身的删除则根据对象创建方式的不同,分为两种情况。在MFC编程中,会使用大量的窗口对象,有些窗口对象以变量的形式嵌入在别的对象内或以局部变量的形式创建在堆栈上,有些则用new操作符创建在堆中。对于一个以变量形式创建的窗口对象,程序员不必关心它的删除问题,因为该对象的生命期总是有限的,若该对象是某个对象的成员变量,它会随着父对象的消失而消失,若该对象是一个局部变量,那么它会在函数返回时被清除。
对于一个在堆中动态创建的窗口对象,其生命期却是任意长的。初学者在学习C++编程时,对new操作符的使用往往不太踏实,因为用new在堆中创建对象,就不能忘记用delete删除对象。读者在学习MFC的例程时,可能会产生这样的疑问,为什么有些程序用 new创建了一个窗口对象,却未显式的用delete来删除它呢?问题的答案就是有些MFC窗口对象具有自动清除的功能。
如前面讲述非模态对话框时所提到的,当调用CWnd::DestroyWindow或:: DestroyWindow删除一个窗口时,被删除窗口的PostNcDestroy成员函数会被调用。缺省的PostNcDestroy什么也不干,但有些MFC窗口类会覆盖该函数并在新版本的PostNcDestroy中调用delete this来删除对象,从而具有了自动清除的功能。此类窗口对象通常是用new操作符创建在堆中的,但程序员不必操心用delete 操作符去删除它们,因为一旦调用DestroyWindow删除窗口,对应的窗口对象也会紧接着被删除。
不具有自动清除功能的窗口类如下所示。这些窗口对象通常是以变量的形式创建的,无需自动清除功能。
所有标准的Windows控件类。
从CWnd类直接派生出来的子窗口对象(如用户定制的控件)。
切分窗口类CSplitterWnd。
缺省的控制条类(包括工具条、状态条和对话条)。
模态对话框类。
具有自动清除功能的窗口类如下所示,这些窗口对象通常是在堆中创建的。
主框架窗口类(直接或间接从CFrameWnd类派生)。
视图类(直接或间接从CView类派生)。
读者在设计自己的派生窗口类时,可根据窗口对象的创建方法来决定是否将窗口类设计成可以自动清除的。例如,对于一个非模态对话框来说,其对象是创建在堆中的,因此应该具有自动清除功能。
综上所述,对于MFC窗口类及其派生类来说,在程序中一般不必显式删除窗口对象。也就是说,既不必调用 DestroyWindow来删除窗口对象封装的窗口,也不必显式地用delete操作符来删除窗口对象本身。只要保证非自动清除的窗口对象是以变量的形式创建的,自动清除的窗口对象是在堆中创建的,MFC的运行机制就可以保证窗口对象的彻底删除。
如果需要手工删除窗口对象,则应该先调用相应的函数(如
CWnd::DestroyWindow)删除窗口,然后再删除窗口对象.对于以变量形式创建的窗口对象,窗口对象的删除是框架自动完成的.对于在堆中动态创建了的非自动清除的窗口对象,必须在窗口被删除后,显式地调用delete来删除对象(一般在拥有者或父窗口的析构函数中进行).对于具有自动清除功能的窗口对象,只需调用CWnd:: DestroyWindow即可删除窗口和窗口对象。注意,对于在堆中创建的窗口对象,不要在窗口还未关闭的情况下就用delete操作符来删除窗口对象.
以下是一点资料供参考,非模态对话框的销毁顺序:
MFC应用程序中处理消息的顺序
1.AfxWndProc() 该函数负责接收消息,找到消息所属的CWnd对象,然后调用AfxCallWndProc
2.AfxCallWndProc() 该函数负责保存消息(保存的内容主要是消息标识符和消息参数)供应用程序以后使用,
然后调用WindowProc()函数
3.WindowProc() 该函数负责发送消息到OnWndMsg()函数,如果未被处理,则调用DefWindowProc()函数
4.OnWndMsg() 该函数的功能首先按字节对消息进行排序,对于
WM_COMMAND消息,调用OnCommand()消息
响应函数,对于WM_NOTIFY消息
调用OnNotify()消息响应函数。任何被遗漏的消息将是一个窗口消息。OnWndMsg()函数搜
索类的消息映像,以找到一个
能处理任何窗口消息的处理函数。如果OnWndMsg()函数不能找到这样的处理函数的话,则
把消息返回到WindowProc()函数,由它将消息发送给DefWindowProc()函数
5.OnCommand() 该函数查看这是不是一个控件通知(lParam参数不为NULL,如果lParam参数为空的话,说明
该消息不是控件通知),如果它是,OnCommand()函数会试图将消息映射到制造通知的控件;
如果他不是一个控件通知(或者如果控件拒绝映射的消息)OnCommand()就会调用OnCmdMsg()函数
6.OnCmdMsg() 根据接收消息的类,OnCmdMsg()函数将在一个称为命令传递(Command Routing)的过程中潜在的
传递命令消息和控件通知。
例如:如果拥有该窗口的类是一个框架类,则命令和通知消息也被传递到视图和文档类,并为该
类寻找一个消息处理函数
MFC应用程序创建窗口的过程
1.PreCreateWindow() 该函数是一个重载函数,在窗口被创建前,可以在该重载函数中改变创建参数
(可以设置窗口风格等等)
2.PreSubclassWindow() 这也是一个重载函数,允许首先子分类一个窗口
3.OnGetMinMaxInfo() 该函数为消息响应函数,响应的是
WM_GETMINMAXINFO消息,允许设置窗口的最大或者
最小尺寸
4.OnNcCreate() 该函数也是一个消息响应函数,响应WM_NCCREATE消息,发送消息以告诉窗口的客户区
即将被创建
5.OnNcCalcSize() 该函数也是消息响应函数,响应WM_NCCALCSIZE消息,作用是允许改变窗口客户区大小
6.OnCreate() 该函数也是一个消息响应函数,响应WM_CREATE消息,发送消息告诉一个窗口已经被创建
7.OnSize() 该函数也是一个消息响应函数,响应WM_SIZE消息,发送该消息以告诉该窗口大小已经
发生变化
8.OnMove() 消息响应函数,响应WM_MOVE消息,发送此消息说明窗口在移动
9.OnChildNotify() 该函数为重载函数,作为部分消息映射被调用,告诉父窗口即将被告知一个窗口刚刚被
创建
MFC应用程序关闭窗口的顺序(非模态窗口)
1.OnClose() 消息响应函数,响应窗口的WM_CLOSE消息,当关闭按钮被单击的时候发送此消息
2.OnDestroy() 消息响应函数,响应窗口的WM_DESTROY消息,当一个窗口将被销毁时,发送此消息
3.OnNcDestroy() 消息响应函数,响应窗口的WM_NCDESTROY消息,当一个窗口被销毁后发送此消息
4.PostNcDestroy() 重载函数,作为处理OnNcDestroy()函数的最后动作,被CWnd 调用
MFC应用程序中打开模式对话框的函数调用顺序
1.DoModal() 重载函数,重载DoModal()成员函数
2.PreSubclassWindow() 重载函数,允许首先子分类一个窗口
3.OnCreate() 消息响应函数,响应WM_CREATE消息,发送此消息以告诉一个窗口已经被创建
4.OnSize() 消息响应函数,响应WM_SIZE消息,发送此消息以告诉窗口大小发生变化
5.OnMove() 消息响应函数,响应WM_MOVE消息,发送此消息,以告诉窗口正在移动
6.OnSetFont() 消息响应函数,响应WM_SETFONT消息,发送此消息,以允许改变对话框中控件的字体
7.OnInitDialog() 消息响应函数,响应WM_INITDIALOG消息,发送此消息以允许初始化对话框中的控件,
或者是创建新控件
8.OnShowWindow() 消息响应函数,响应WM_SHOWWINDOW消息,该函数被ShowWindow()函数调用
9.OnCtlColor() 消息响应函数,响应WM_CTLCOLOR消息,被父窗口发送已改变对话框或对话框上面控件
的颜色
10. OnChildNotify() 重载函数,作为WM_CTLCOLOR消息的结果发送
MFC应用程序中关闭模式对话框的顺序
1.OnClose() 消息响应函数,响应WM_CLOSE消息,当"关闭"按钮被单击的时候,该函数被调用
2.OnKillFocus() 消息响应函数,响应WM_KILLFOCUS消息,当一个窗口即将失去键盘输入焦点以前被发送
3.OnDestroy() 消息响应函数,响应WM_DESTROY消息,当一个窗口即将被销毁时,被发送
4.OnNcDestroy() 消息响应函数,响应WM_NCDESTROY消息,当一个窗口被销毁以后被发送
5.PostNcDestroy() 重载函数,作为处理OnNcDestroy()函数的最后动作被CWnd调用
打开无模式对话框的顺序
1.PreSubclassWindow() 重载函数,允许用户首先子分类一个窗口
2.OnCreate() 消息响应函数,响应WM_CREATE消息,发送此消息以告诉一个窗口已经被创建
3.OnSize() 消息响应函数,响应WM_SIZE消息,发送此消息以告诉窗口大小发生变化
4.OnMove() 消息响应函数,响应WM_MOVE消息,发送此消息以告诉窗口正在移动
5.OnSetFont() 消息响应函数,响应WM_SETFONT消息,发送此消息以允许改变对话框中控件的字体
以上这些的执行都是按给定的顺序执行!
复习复习和总结总结-关于模式与非模式对话框 复习复习和总结总结-关于模式与非模式对话框 对话框有两种创建方式:DoModal和Creat。其中DoModal创建的是模态的对话框,而Creat创建的是非模态的对话框下面总结下他们的不同。 对于模态的对话框,在该对话框被关闭前,用户将不能在同一应用程序的其他地方进行工作(例如open file对话框),而对于非模态的对话框,在它留在屏幕上的同时可以在其他的地方进行工作,(例如find file对话框) Create的Dialog一般是modalless,如果你的程序本身就是只有一个Dialog,就无所谓了,看不出modalless的效果。modalless本来就是让有机会切换到本程序的其他窗口。 下面摘抄一部分,很基础,很全面 非模态对话框的特点 与模态对话框不同,非模态对话框不垄断用户的输入,用户打开非模态对话框后,仍然可以与其它界面进行交互。 非模态对话框的设计与模态对话框基本类似,也包括设计对话框模板和设计CDialog类的派生类两部分。但是,在对话框的创建和删除过程中,非模态对话框与模态对话框相比有下列不同之处: ?非模态对话框的模板必须具有Visible风格,否则对话框将不可见,而模态对话框则无需设置该项风格。更保险的办法是调用 CWnd::ShowWindow(SW_SHOW)来显示对话框,而不管对话框是否具有 Visible风格。 ?非模态对话框对象是用new操作符在堆中动态创建的,而不是以成员变量的形式嵌入到别的对象中或以局部变量的形式构建在堆栈上。通常应在对话框的拥有者窗口类内声明一个指向对话框类的指针成员变量,通过该指针可访问对话框对象。 ?通过调用CDialog::Create函数来启动对话框,而不是 CDialog::DoModal,这是模态对话框的关键所在。由于Create函数不会启 动新的消息循环,对话框与应用程序共用同一个消息循环,这样对话框就不会垄断用户的输入。Create在显示了对话框后就立即返回,而DoModal 是 在对话框被关闭后才返回的。众所周知,在MFC程序中,窗口对象的生存期应长于对应的窗口,也就是说,不能在未关闭屏幕上窗口的情况下先把对应的窗口对象删除掉。由于在Create返回后,不能确定对话框是否已关 闭,这样也就无法确定对话框对象的生存期,因此只好在堆中构建对话框对
JavaScript自定义模式对话框 https://www.doczj.com/doc/002558500.html, 更新日期:2006-09-19 10:03 网页教学网 Response.Write(""); Response.Write("
");MFC中非模态对话框不响应PreTranslateMessage函数的解决方法 程序员真心不容易啊,为了一个好的用户体验真可谓是操碎了心。今天由于项目需要,需要在非模态对话框上,当鼠标处于某个位置的时候有提示框显示。实现这个功能本来很简单,但是却遇到了一个郁闷的问题:PreTranslateMessage函数没响应。于是各种度娘,可惜度娘非谷歌,找了一个小时终于在一个隐蔽的地方找到了解决方法。 首先我介绍下当鼠标处于特定位置的时候有提示信息显示的实现方法。 需要使用MFC的CToolTipCtrl控件。 1.首先在Dialog类中添加一个成员对象 [cpp]view plain copy 1.//消息提示框 2. CToolTipCtrl m_toolTip; 1.//创建消息提示框 2. EnableToolTips(TRUE);//enable use it 3.BOOL bRet = m_toolTip.Create(this, TTS_ALWAYSTIP | WS_CHILD | WS_VISIBLE ); 4. m_toolTip.AddTool(this); 5. m_toolTip.Activate(TRUE); 6. m_toolTip.SetDelayTime(150); 3.捕获鼠标的移动消息OnMouseMove,当鼠标处在某一特定区域的时候,弹出消息提示框。切换消息内容使用CToolTipCtrl::UpdateTipText函数。 [cpp]view plain copy
1.void CDisplayPicDlg::OnMouseMove(UINT nFlags, CPoint point) 2.{ 3.//如果鼠标在矩形所在区域,需要把箭头鼠标变成手型的 4.int iSel = GetSelectCameraNo(point); 5.if(-1 != iSel) 6. { 7. SetCursor(LoadCursor(NULL, IDC_HAND)); 8. m_toolTip.UpdateTipText(m_stMonitorCamera[iSel].szCamereName, this); 9. } 10.else//还原成箭头鼠标形式 11. { 12. SetCursor(LoadCursor(NULL, IDC_ARROW)); 13. m_toolTip.UpdateTipText("", this); 14. } 15.if(-1 != m_lCameraIdPre) 16. { 17. SetCursor(LoadCursor(NULL, IDC_ARROW) ); 18. } 19.//..................... 20.} 1.BOOL CDisplayPicDlg::PreTranslateMessage(MSG* pMsg) 2.{ 3. m_toolTip.RelayEvent(pMsg); 4.return CDialog::PreTranslateMessage(pMsg); 5.} 6. 好了,做到这四部就基本完成了。当自己满怀信息一运行发现根本没有弹出提示信息。经过调试发现,PreTranslateMessage函数并没有被调用,于是引出了重要的主题,非模态对话框如何响应PreTranslateMessage函数的问题。经过一番百度,终于找到了解决方法。 在MFC的App类中需要用Hook来勾取消息,需要注意的是GetMessageProc是个回调函数,所以我们需要将它设成类的静态成员函数。 即: [cpp]view plain copy
专业课程实验报告课程名称:windows程序设计 开课学期:2015至2016学年第1学期 专业:计算机科学与技术年级班级:2013级 学生姓名:刘敏学号:222013********* 实验教师:刘红俊 计算机与信息科学学院软件学院
wcex.lpszMenuName = MAKEINTRESOURCE(IDC_WIN32PROJECT2); 2.对话框资源及其应用: 1)模式对话框: ①定义对话框资源: 资源文件中如此定义对话框资源: 对话框名 DIALOGEX x,y,weight,hight STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "" FONT 9, "" BEGIN 对话框的控件定义 END ②调用函数DiaLogBox显示对话框; ③构造对话框消息处理函数; ④关闭对话框。 2)非模式对话框: ①定义非模式对话框: STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU|WS_VISIBLE ②创建对话框函数: HWND CreateDialog{hInst, MAKEINTRESOURCE(IDD_SHOWBOX),hWnd,(DLGPROC)DlgProc} ③消息循环: while (GetMessage(&msg, NULL, 0, 0)) { if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } } ④关闭对话框: DestroyWindow(hDlg); 3)程序加载图标: IDI_WIN32PROJECT2 ICON "Win32Project2.ico" IDI_SMALL ICON "small.ico"
详解 Qt 模态对话框和非模态对话框 2011-07-01 11:33 佚名互联网我要评论(0)字号:T | T 如果从线程角度来讲,模态对话框实际上是线程阻塞的,也就是子对话框是一个线程,但是在创建这个子线程之后,父窗口就阻塞了;模态对话框则不是阻塞型的线程模型,父子线程可以并行运行。 AD:Qt 模态对话框和非模态对话框是本文介绍的内容,本文认为本篇是一篇很有意思的文章,不多说,我们先来看内容。 模态对话框就是指在子对话框弹出时,焦点被强行集中于该子对话框,子对话框不关闭,用户将无法操作其他的窗口。非模态相反,用户仍然可以操作其他的窗口,包括该子对话框的父对话框。 如果从线程角度来讲,模态对话框实际上是线程阻塞的,也就是子对话框是一个线程,但是在创建这个子线程之后,父窗口就阻塞了;模态对话框则不是阻塞型的线程模型,父子线程可以并行运行。 和所有流行的图形类库一样,Qt也提供了创建模态和非模态对话框的机制。 在Qt中创建模态对话框,主要用到了QDialog的exec函数: 1.SonDialog dlg(this); 2.int res = dlg.exec(); 3.if (res == QDialog::Accepted) 4.{ 5. QMessageBox::information(this, "INFORMATION", "You clicked OK bu tton!"); 6.} 7.if (res == QDialog::Rejected) 8.{ 9. QMessageBox::information(this, "INFORMATION", "You clicked CANCE L button!"); 10.} 正如上面代码所显示的,可以通过exec函数的返回值来判断用户点击了哪个按钮使得模态对话框退出的,这可以使得我们能够根据用户的不同行为在推出退出模态对话框之后采
VC 模式对话框和非模式对话框的创建,销毁和区别在WIN32中,模式对话框的创建一般是使用DialogBox来进行创建的。而非模式对话框则是利用CreateWindow来创建的。在MFC或是WTL中,模式对话框一般是使用DoModal,而非模式对话框的创建则是使用Create。模式对话框创建后,程序的其他窗口便不能进行操作,必须将该窗口关闭后,其他窗口才能进行操作。而非模式对话框则无需这样,它不强制要求用户立即反应,而是与其他窗口同时接受用户操作。 Create的Dialog一般是modalless,如果你的程序本身就是只有一个Dialog, 就无所谓了,看不出modalless的效果。modalless本来就是让有机会切换到本程序的其他窗口。 非模态对话框的特点: 与模态对话框不同,非模态对话框不垄断用户的输入,用户打开非模态对话框后,仍然可以与其它界面进行交互。 非模态对话框的设计与模态对话框基本类似,也包括设计对话框模板和设计CDialog类的派生类两部分。但是,在对话框的创建和删除过程中,非模态对话框与模态对话框相比有下列不同之处: 非模态对话框的模板必须具有Visible风格,否则对话框将不可见,而模态对话框则无需设置该项风格。更保险的办法是调用CWnd::ShowWindow(SW_SHOW)来显示对话框,而不管对话框是否具有Visible风格。 非模态对话框对象是用new操作符在堆中动态创建的,而不是以成员变量的形式嵌入到别的对象中或以局部变量的形式构建在堆栈上。通常应在对话框的拥有者窗口类内声明一个指向对话框类的指针成员变量,通过该指针可访问对话框对象。通过调用CDialog::Create函数来启动对话框,而不是CDialog::DoModal,这 是模态对话框的关键所在。由于Create函数不会启动新的消息循环,对话框与应用程序共用同一个消息循环,这样对话框就不会垄断用户的输入。Create在 显示了对话框后就立即返回,而DoModal是在对话框被关闭后才返回的。众所周知,在MFC程序中,窗口对象的生存期应长于对应的窗口,也就是说,不能在未关闭屏幕上窗口的情况下先把对应的窗口对象删除掉。由于在Create返回后,不能确定对话框是否已关闭,这样也就无法确定对话框对象的生存期,因此只好在堆中构建对话框对象,而不能以局部变量的形式来构建之。 必须调用CWnd::DestroyWindow而不是CDialog::EndDialog来关闭非模态对话框。调用CWnd::DestroyWindow是直接删除窗口的一般方法。由于缺省的CDialog::OnOK和CDialog::OnCancel函数均调用EndDialog,故程序员必须编写自己的OnOK和OnCancel函数并且在函数中调用DestroyWindow来关闭对话框。因为是用new操作符构建非模态对话框对象,因此必须在对话框关闭后,用delete操作符删除对话框对象。在屏幕上一个窗口被删除后,框架会调用CWnd::PostNcDestroy,这是一个虚拟函数,程序可以在该函数中完成删除窗口对象的工作,具体代码如下 void CModelessDialog::PostNcDestroy { delete this; //删除对象本身 }
MFC 模态对话框的实现原理 1人收藏此文章, 发表于10个月前(2012-09-30 11:20) , 已有471次阅读,共1个评论 1. 模态对话框 在涉及GUI程序开发的过程中,常常有模态对话框以及非模态对话框的概念 模态对话框:在子界面活动期间,父窗口是无法进行消息响应。独占用户输入非模态对话框:各窗口之间不影响 主要区别:非模态对话框与APP共用消息循环,不会独占用户。 模态对话框独占用户输入,其他界面无法响应 在用户层的主要逻辑如下: TestDlg dlg; if (dlg.DoModal() == IDOK) { //处理完毕后的操作 } .......//后续处理 在具体实现中,有如下几个步骤: 1. 让父窗口失效EnableWindow(parentWindow, FALSE) 2. 建立模态对话框自己的消息循环(RunModalLoop) 3. 直至接收关闭消息,消息循环终止,并销毁窗口。 INT_PTR CDialog::DoModal() { //对话框资源加载 ...... //在创建模态窗口之前先让父窗口失效,不响应键盘、鼠标产生的消息 HWND hWndParent = PreModal(); AfxUnhookWindowCreate(); BOOL bEnableParent = FALSE; if (hWndParent && hWndParent != ::GetDesktopWindow() && ::IsWindowEnabled(hWndParent))
{ ::EnableWindow(hWndParent, FALSE); bEnableParent = TRUE; ....... } //创建模态窗口,并进行消息循环,若窗口不关闭,则循环不退出 AfxHookWindowCreate(this); VERIFY(RunModalLoop(dwFlags) == m_nModalResult); //窗口关闭,销毁窗口 DestroyWindow(); PostModal(); //释放资源,并让父窗口有效 pMainWnd->EnableWindow(TRUE); //返回 return m_nModalResult; } 2. 模态窗口中的消息循环 int CWnd::RunModalLoop(DWORD dwFlags) { //要检查窗口状态是否是模态窗口 //若状态一直为模态,则一直进行消息循环 for (;;) { ASSERT(ContinueModal()); // phase1: check to see if we can do idle work while (bIdle && !::PeekMessage(pMsg, NULL, NULL, NULL, PM_NOREMOVE)) { ASSERT(ContinueModal()); // show the dialog when the message queue goes idle if (bShowIdle) { ShowWindow(SW_SHOWNORMAL);
MFC模态和非模态对话框编程 1. CDialog是从CWnd派生的。对话框有两种类型:模态和非模态。 ★模态和非模态区别: 当我们显示一个模态对话框时,应用程序会暂停,即点击其他菜单或者别的不会执行,会出现警告的那种声音。直到关闭模态对话框,应用程序才会继续执行其他任务。 2. 在创建好一个新的对话框时,系统会已定义好2个方法。 ● 构造函数:调用父类的构造函数,传入自己的IDD ● DoDataExchange:完成对话框数据的交换和校验 3. 模态对话框的显示和关闭 CDialog::DoModal和CDialog::EndDialog 程序示例: void CMyboleView::OnDiadlog() { // TODO: Add your command handler code here CTestDlg dlg; dlg.DoModal(); }
4. 非模态对话框的创建 CDialog::Create BOOL Create( LPCTSTR lpszTemplateName, CWnd* pParentWnd = NULL ); BOOL Create( UINT nIDTemplate, CWnd* pParentWnd = NULL ); 默认参数为NULL,就是父窗口是框架类。 程序示例: void CMyboleView::OnDiadlog() { // TODO: Add your command handler code here CTestDlg dlg; dlg.Create(IDD_DIALOG1,this); dlg.ShowWindow(SW_SHOW); } PS:注意要用ShowWindow显示对话框。 问题:程序执行后,对话框还是没显示出来。为什么? 这里的CTestDlg dlg;我们是定义成局部变量的。但是当这个函数执行完了,就会销毁dlg 的。 那为什么模态可以呢? 这就是刚才我们说的创建模态对话框时,程序会暂停在那的原因导致的。
加法计算器对话框程序大家照着做一遍后,相信对基于对话框的程序有些了解了,有个好的开始对于以后的学习大有裨益。趁热打铁,鸡啄米这一节讲讲什么是模态对话框和非模态对话框,以及模态对话框怎样弹出。 一.模态对话框和非模态对话框 Windows对话框分为两类:模态对话框和非模态对话框。 模态对话框是这样的对话框,当它弹出后,本应用程序其他窗口将不再接受用户输入,只有该对话框响应用户输入,在对它进行相应操作退出后,其他窗口才能继续与用户交互。 非模态对话框则是,它弹出后,本程序其他窗口仍能响应用户输入。非模态对话框一般用来显示提示信息等。 大家对Windows系统很了解,相信这两种对话框应该都遇到过。之前的加法计算器对话框其实就是模态对话框。 二.模态对话框是怎样弹出的 毕竟加法计算器程序大部分都是MFC自动生成的,对话框怎么弹出来的大家可能还不是很清楚。鸡啄米下面简单说说它是在哪里弹出来的,再重新建一个新的对话框并弹出它,这样大家实践以后就能更灵活的使用模态对话框了。 大家打开Addition.cpp文件,可以看到CAdditionApp类有个InitInstance()函数,在M FC应用程序框架分析中提到过此函数,不过那是单文档应用程序App类中的,函数体不太相同,但都是进行App类实例的初始化工作。
InitInstance()函数的后半部分有一段代码就是定义对话框对象并弹出对话框的,鸡啄米下面给出这段代码并加以注释: 弹出对话框比较关键的一个函数,就是对话框类的DoModal()函数。CDialog::DoModa l()函数的原型为:
virtual INT_PTR DoModal(); 返回值:整数值,指定了传递给CDialog::EndDialog(该函数用于关闭对话框)的nR esult参数值。如果函数不能创建对话框,则返回-1;如果出现其它错误,则返回IDABOR T。 调用了它对话框就会弹出,返回值是退出对话框时所点的按钮的ID,比如,我们点了“退出”按钮,那么DoModal返回值为IDCANCEL。 三.添加一个新对话框并弹出它 鸡啄米再为加法计算器程序添加一个对话框,以在计算之前询问用户是否确定要进行计算。大家可以完整的看下对话框的添加和弹出过程。 1.根据“创建对话框模板和修改对话框属性”中所讲的方法,在Resource View中的“Di alog”上点右键选择“Insert Dialog”,创建一个新的对话框模板,修改其ID为IDD_TIP_DIA LOG,Caption改为“提示”,然后参考“为对话框添加控件”中所讲,在对话框模板上添加一个静态文本框(static text),Caption改为“您确定要进行加法计算吗?”,接下来修改OK 按钮的Caption为“确定”,Cancel按钮的Caption为“取消”,最后调整各个控件的位置和对话框的大小。最终的对话框模板如下图: 2.根据“创建对话框类和添加控件变量”中创建对话框类的方法,在对话框模板上点右键选择“Add Class...”,弹出添加类的对话框,设置“Class name”为CTipDlg,点“OK”。在S olution Explorer中可以看到生成了CTipDlg类的头文件TipDlg.h和源文件TipDlg.cpp。 3.我们要在点“计算”按钮之后弹出此提示对话框,那么就要在“计算”按钮的消息处理函数OnBnClickedAddButton()中访问提示对话框类,所以为了访问CTipDlg类,在Addition Dlg.cpp中包含CTipDlg的头文件:#include "TipDlg.h"。 4.修改OnBnClickedAddButton()的函数体,在所有代码前,构造CTipDlg类的对象tip Dlg,并通过语句tipDlg.DoModal();弹出对话框,最后判断DoModal()函数的返回值是IDO K还是IDCANCEL来确定是否继续进行计算。OnBnClickedAddButton()函数修改后如下: C++代码
如何使对话框 一个对话窗口,是一个独立的子窗口,这意味着,除了主要的Swing应用程序窗口进行临时通知。大多数对话框给出一个错误消息或警告用户,但对话框可以呈现影像,目录树,或几乎任何兼容主要的Swing应用程序管理。 为方便起见,一些Swing组件类可以直接实例化并显示对话框。创建简单的,标准的对话,您可以使用JOptionPane类。ProgressMonitor类,可以把一个对话框,显示操作的进度。其他两个班,JColorChooser和JFileChooser,还提供标准的对话。弹出一个打印对话框,您可以使用打印 API。要创建一个自定义对话框,直接使用JDialog类。 代码进行简单的对话,可以说是微乎其微。例如,这里是一个信息对话框: 下面是创建和显示它的代码: JOptionPane.showMessageDialog(架,“鸡蛋不应该是绿色的。”); 本节的其余部分包括以下主题: ?对话框概述 ?DialogDemo范例 ?JOptionPane的特点 ?创建和显示简单的对话框 ?自定义按钮文本 ?从对话框获取用户输入的 ?停止自动对话闭幕 ?对话框API ?使用对话框的例子, 对话框概述 每个对话是依赖于一个框架组件。当那架被破坏,所以其依赖的对话框。当框架被图标化,依赖于它的对话框也从屏幕上消失。当帧deiconified,依赖于它的对话框返回到屏幕上。摆动的JDialog类继承了这一行为从AWT的Dialog 类。
一个对话框可以是模式。当一个模态对话框是可见的,它会阻止用户输入到程序中的所有其他窗口。 JOptionPane的创建JDialog s的是模态。创建一个非模态对话框,你必须直接使用JDialog类。 与JDK 6日开始,您可以修改对话框窗口的方式使用的新模式API的行为。看到新形态的API细节。 JDialog类是AWT的一个子类java.awt.Dialog类。它增加了一个根窗格容器默认关闭操作和支持的Dialog对象。这些都是相同的功能JFrame有,使用JDialog直接使用JFrame是非常相似。如果你打算直接使用JDialog ,那么你应该明白,在材料使用的顶层容器和如何制作框架,特别是响应窗口关闭事件。 甚至当您使用JOptionPane ,以实现一个对话框,你还在使用JDialog幕后。其原因在于JOptionPane仅仅是一个容器,它可以自动创建JDialog和添加自己JDialog的内容窗格。 DialogDemo范例 这里是一个图片显示对话框的应用程序。 试试这个:: 1.单击“启动”按钮,以运行对话 框演示使用的Java?Web开始 (下载JDK 6或更高版本)。 另外,编译和运行自己的例子, 咨询,例如指数。
Windows编程基础 东软人才实训中心 Copyright 2010 By Neusoft Group. All rights reserved 1
本课程旨在向学员介绍: 1)对话框和对话框类2)模式对话框 3)无模式对话框 4)属性页对话框 5)通用对话框时间:学时6 教学方法:讲授+课上练习+课下作业 第四章对话框 2
3 ?Windows 应用程序的基本工作流程是从用户那里得到数据,经过相应的处理后,再把计算结果输出到屏幕或打印机。获取数据的方法会涉及很重要的界面对象-对话框。?首先学习对话框应用程序的好处: –它比基于文档/视图应用程序更易于理解 –涉及的类少,但与文档/视图应用程序有相同的威力。 学习对话框的重要性
4 ?主要有以下两种 –模态(Modal)对话框,必须首先响应这个对话框才可以进行其他动作。 –非模态(Modaless)对话框,用户可以操作该程序的其他窗口。 对话框的类型
CDialog类 ?CDialog类从CWnd类派生而来,所以它继承了CWnd类的成员函数,具有CWnd类的基本功能,可以编写代码移动、显示或隐藏对话框,并能根据对话框的特点增加新的成员函数,扩展它的功能。 CObject CmdTarget CWnd CDialog 5
6 对话框类相关成员函数 用于关闭对话框窗口 CDialog::EndDiaolg()响应WM_INITDIALOG 消息CDialog::OnInitDialog() 单击取消或Esc 调用该函数,内部调用EndDialog()CDialog::OnCancel() 单击OK 按钮调用该函数,内部调用EndDialog()CDialog::OnOK() 根据对话框模板资源创建非模态对话框CDialog::Create() 激活模态对话框,显示对话框窗口直到该窗口关闭返回CDialog::DoModal() 功能描述成员函数
显示HTML模式的对话框类 我总是想在我的应用程序“关于”对话框中加入更多的图像,动画与音乐。但它需要许多额外的工作,我没有胆量冒风险去做这些。幸运的是, Internet Explorer 4.0的到来,在新的技术介绍中我们能做所有的这些而不 需要写大量的代码。一个办法是用web browser控件,但不总是最好的解决方法,得别是对于模式对话框。这里另外的技术用在模式对话框-一种使用IE4 的 技术引进。模式对话框仅挂钩mshtml.dll(HTML描述与分析的动力)。因此许多重要的功能如能够点击一链接和在同样的窗口中显示链接,但收藏夹与历史管理是不起作用的(see Reusing the WebBrowser and MSHTML in Internet Client SDK)。 这是足够好的,几乎可放置在我们仅需要模式对话框的任何地方。 如何使用HTML模式的对话框 函数SHOWHTMLDIALOGFN在mshtml.dll库中,可以显示HTML对话框,但它通常需要COM stuff 。为简单的做到这些我开发了CHtmlDialog类。所有的COM stuff 被隐藏,这个类能容易的使用到几乎所有的应用程序中。 一个简单的使用CHtmlDialog类的案例。 在这个案例中你需要将它用作为一个“关于”对话框。所有的你必须做的是写一个HTML文件,并加入到资源文件中其ID为IDR_ABOUT_HTM。修改你的OnAppAbout函数如下: voidCHDDemoApp::OnAppAbout() { CHtmlDialogdlg(IDR_ABOUT_HTM, AfxGetMainWnd()); dlg.DoModal(); } 这个构造函数也允许你使用字符串或URLs地址。详细的请看示例工程。正是通过 这个代码你能够使用图像与声音。T 使用参数到对话框。
基本介绍: showModalDialog() (IE 4+ 支持) showModelessDialog() (IE 5+ 支持) window.showModalDialog() 方法用来创建一个显示HTML内容的模态对话框。 window.showModelessDialog() 方法用来创建一个显示HTML内容的非模态对话框。使用方法: vReturnValue = window.showModalDialog(sURL [, vArguments] [,sFeatures]) vReturnValue = window.showModelessDialog(sURL [, vArguments] [,sFeatures]) 参数说明: sURL -- 必选参数,类型:字符串。用来指定对话框要显示的文档的URL。 vArguments -- 可选参数,类型:变体。用来向对话框传递参数。传递的参数类型不限,包括数组等。对话框通过window.dialogArguments来取得传递进来的参数。 sFeatures -- 可选参数,类型:字符串。用来描述对话框的外观等信息,可以使用以下的一个或几个,用分号“;”隔开。 ---------------- 1. dialogHeight: 对话框高度,不小于100px 2. dialogWidth: 对话框宽度。 3. dialogLeft: 离屏幕左的距离。 4. dialogTop: 离屏幕上的距离。 5. center: { yes | no | 1 | 0 } :是否居中,默认yes,但仍可以指定高度和宽度。 6. help: {yes | no | 1 | 0 }:是否显示帮助按钮,默认yes。 7. resizable: {yes | no | 1 | 0 } [IE5+]:是否可被改变大小。默认no。 8. status: {yes | no | 1 | 0 } [IE5+]:是否显示状态栏。默认为yes[ Modeless]或no[Modal]。 9. scroll: { yes | no | 1 | 0 | on | off }:是否显示滚动条。默认为yes。 下面几个属性是用在HTA中的,在一般的网页中一般不使用。 10. dialogHide:{ yes | no | 1 | 0 | on | off }:在打印或者打印预览时对话框是否隐藏。默认为no。 11. edge:{ sunken | raised }:指明对话框的边框样式。默认为raised。 12. unadorned:{ yes | no | 1 | 0 | on | off }:默认为no。 参数传递: 1. 要想对话框传递参数,是通过vArguments来进行传递的。类型不限制,对于字符串类型,最大为4096个字符。也可以传递对象,例如: ------------------------------- parent.htm modal.htm
VC++9 创建模式对话框 1.创建一个单文档的项目:xx 2.“插入”/“资源”/“Dialog”。创建如下图的对话框。 3.修改对话框的属性。右击对话框,在属性对话框中,“标题”改为:录入成绩。 4.添加5个静态控件,输入5门课程名,添加5个编辑框控件。 5.设置各控件的属性,修改默认按钮的标题为:“确定”和“取消”。 6.组织安排控件,使之整齐排列。 7.设置Tab顺序 8.测试对话框,不满意处进行修改。(6、7、8步通过“编排”菜单来完成) 以上2~8步是对话框资源的设计。 9.创建对话框类。“查看”/“建立类向导”,添加新类,名称为:CScoreDlg。(观察变化: “类视图”中,添加了新类;“文件视图”中,增加了相应的.cpp文件和.h文件) 10.创建成员变量。为5个编辑框添加int型成员变量:m_Score1~m_Score5。(观察变化: “类视图”多了5个成员变量;双击类名,在类定义处,自动定义了5个变量;双击类的构造函数,可以看到5个成员变量的初始化值) 11.设置数据的有效性检验。在类向导中,为5个成员变量添加最小值和最大值。(观察变 化:类的成员函数DoDataExchange()中添加了相应的代码) 以上9~11步是设计对话框类。 12.在xxDoc类中,添加全局变量:int score[5]; 在该类的构造函数中为全局变量初始化, 初值设为:0。 13.在类视图中,为“xxView”类的成员函数OnDraw()添加下列代码,用于设定输出格式: pDC->TextOut(0,0,”高等数学大学物理大学英语哲学计算机基础”); CString str; str.Format(“%13d%13d%13d%13d%13d”,pDoc->score[0], pDoc->score[1], pDoc->score[2], pDoc->score[3], pDoc->score[4],); pDC->TextOut(0,20,str); 14.在“资源视图”窗口中,选中“Menu”,为“编辑”菜单添加新的菜单项“成绩录入”。 右击菜单项,在标题属性中输入“成绩录入”,在ID 项中添加ID为:ID_SCOREFILLING 15.为新添加的菜单项定义消息处理函数(只要选择了该菜单项,弹出上面的模式对话框)。 在类向导中,类名为:“xxDoc”,ID值为:ID_SCOREFILLING。Message项选择“COMMAND”。添加成员函数,函数名默认。函数代码如下:
1. 模态对话框 在涉及GUI程序开发的过程中,常常有模态对话框以及非模态对话框的概念 模态对话框:在子界面活动期间,父窗口是无法进行消息响应。独占用户输入 非模态对话框:各窗口之间不影响 主要区别:非模态对话框与APP共用消息循环,不会独占用户。 模态对话框独占用户输入,其他界面无法响应 在用户层的主要逻辑如下: 1 TestDlgdlg; 2 3 if (dlg.DoModal() == IDOK) 4 { 5 //处理完毕后的操作 6 } 7 .......//后续处理 在具体实现中,有如下几个步骤: 1. 让父窗口失效EnableWindow(parentWindow, FALSE) 2. 建立模态对话框自己的消息循环(RunModalLoop) 3. 直至接收关闭消息,消息循环终止,并销毁窗口。 01 INT_PTR CDialog::DoModal() 02 { 03 //对话框资源加载 04 ...... 05 06 //在创建模态窗口之前先让父窗口失效,不响应键盘、鼠标产生的消息
07 HWND hWndParent = PreModal(); 08 AfxUnhookWindowCreate(); 09 BOOL bEnableParent = FALSE; 10 11 if (hWndParent&&hWndParent != ::GetDesktopWindow() && ::IsWindowEnabled(hWndParent)) 12 { 13 ::EnableWindow(hWndParent, FALSE); 14 bEnableParent = TRUE; 15 ....... 16 } 17 18 //创建模态窗口,并进行消息循环,若窗口不关闭,则循环不退出 19 AfxHookWindowCreate(this); 20 VERIFY(RunModalLoop(dwFlags) == m_nModalResult); 21 22 //窗口关闭,销毁窗口 23 DestroyWindow(); 24 PostModal(); 25 26 //释放资源,并让父窗口有效 27 pMainWnd->EnableWindow(TRUE); 28 29 //返回 30 return m_nModalResult; 31 } 2. 模态窗口中的消息循环 01 int CWnd::RunModalLoop(DWORD dwFlags) 02 { 03 //要检查窗口状态是否是模态窗口 04 //若状态一直为模态,则一直进行消息循环 05 for (;;) 06 {
html5各种页面切换效果和模态对话框用法 总结 本文详细总结了html5各种页面切换效果和模态对话框用法。分享给大家供大家参考。具体分析如下: 页面动画: data-transition 属性可以定义页面切换是的动画效果。 例如:I'll pop data-transition 参数表: 参数说明 slide 从右侧向左滑入页面 slideup 从底部向上滑入 slidedown 从上向下滑入 pop 从中心渐显展开 fade 渐显 flip 翻转 备注:如果想要在目标页面中显示后退按钮,可以在链接中加入 data-direction="reverse"属性,这个属性和原来的 data-back="true"相同,不知道在正式版本中将会保留哪个属性。 模态对话框 模态对话框是一种带有圆角标题栏和关闭按钮的伪浮
动层,用于独占事件的应用。任何结构化的页面都可以用data-rel="dialog"链接的方式实现模态对话框应用。 例如:Open dialog 这个页面切换效果同样可以使用标准页面的data-transition 参数效果。建议使用"pop"、"slideup" 和"flip"参数以达到更好的效果。 这个模态对话框会默认生成关闭按钮,用于回到父级页面。在脚本能力较弱的设备上也可以添加一个带有data-rel="back"的链接来实现关闭按钮。 针对支持脚本的设备可以直接使用 href=”#”或者data-rel="back"来实现关闭。还可以使用内置的”close”方法来关闭模态对话框,例如:$('.ui-dialog').dialog('close')。 由于模态对话框是动态显示的临时页面,所以这个页面不会被保存在哈希表内,这就意味着我们讲无法后退到这个页面,例如你在 A 页面中点击一个链接打开 B 对话框,操作完成并关闭对话框,然后跳转到 C 页面,这时候你点击浏览器的后退按钮,这时候将回到 A 页面,而不是 B 页面。 工具条 工具条主要用于”header”,”footer”等区域,用来支撑和实现页面中业务功能的应用。jQuery Mobile 提供了一个相对完整的解决方案。