文档库 最新最全的文档下载
当前位置:文档库 › VC++中模态对话框和非模态对话框的编程

VC++中模态对话框和非模态对话框的编程

VC++中模态对话框和非模态对话框的编程
VC++中模态对话框和非模态对话框的编程

MFC中非模态对话框不响应PreTranslateMessage函数的解决方法

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

Qt 模态对话框和非模态对话框

详解 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函数的返回值来判断用户点击了哪个按钮使得模态对话框退出的,这可以使得我们能够根据用户的不同行为在推出退出模态对话框之后采

模式对话框和非模式对话框

复习复习和总结总结-关于模式与非模式对话框 复习复习和总结总结-关于模式与非模式对话框 对话框有两种创建方式: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返回后,不能确定对话框是否已关 闭,这样也就无法确定对话框对象的生存期,因此只好在堆中构建对话框对

MFC模态和非模态对话框编程

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 的。 那为什么模态可以呢? 这就是刚才我们说的创建模态对话框时,程序会暂停在那的原因导致的。

JavaScript自定义模式对话框

JavaScript自定义模式对话框 https://www.wendangku.net/doc/4d4560508.html, 更新日期:2006-09-19 10:03 网页教学网 Response.Write(""); Response.Write("

");

bootstrap-modal 学习笔记 源码分析===

bootstrap-modal 学习笔记源码分析 ?css部分呢Bootstrap由动态CSS语言Less写成,在很多方面类似CSS框架Blueprint ?Bootstrap自带了13个jQuery插件,jquery这个东东,也是个版本帝,现在都10.1了… ?一直做移动app,都是用的自己的框架或者zepto,jquery就没正儿八经的用过,源码就看过1.42的后来改动太大了,具体慢慢分析看看源码吧 引入 1: 2: 查看演示案例 3: 4: 5:

从所周知,javascript 采用事件驱动(event-driven)。它是在用形界面的环境下,使得一切输入变化简单化。通常鼠标或热键的动作我们称之为事件(Event),而由鼠标或热键引发的一连串程序的动作,称之为事件驱动(Event Driver)。而对事件进行处理程序或函数,我们称之为事件处理程序(Event Handler) Bootstrap是13个jquery插件,自然事件也是基于jquery处理的 我们先看看Bootstrap插件源码中常用的绑定机制 on方法 jQuery1.7开始,jQuery引入了全新的事件绑定机制,on()和off()两个函数统一处理事件绑定,因为在此之前有bind(), live(), delegate()等方法来处理事件绑定,jQuery从性能优化以及方式统一方面考虑决定推出新的函数来统一事件绑定方法并且替换掉以前的方法,老版本还有live() 现在好像被废弃掉了,至于那个版本去掉的,我就没注意了简单的说下区别: ?bind 是一对一的 ?live 是指默认绑定到document,通过冒泡过滤 ?delegate 则是直接绑定指定的content,然后通过冒泡过滤 呵呵考虑下(′a′).live()==(document).delegate('a') ? live废弃的原因,估计也是效率,然后不够灵活吧,尤其要提出来zepto的移动事件默认就绑定到document上,给项目带来不便…… on的处理机制也很简单, 看官方给的API的一个demo 1: Click me! 2: 3: 4: