当前位置:文档之家› MFC中非模态对话框不响应PreTranslateMessage函数的解决方法

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

MFC中非模态对话框不响应PreTranslateMessage函数的解决方法
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

1.class CStaticMapGPSApp : public COleControlModule

2.{

3.public:

4.BOOL InitInstance();

5.int ExitInstance();

6.static LRESULT CALLBACK GetMessageProc(int nCode, WPARAM wParam, LPARAM

lParam);

7.

8.HHOOK m_hHook;

9.protected:

10.

11.};

1.LRESULT CALLBACK CStaticMapGPSApp::GetMessageProc(int nCode, WPARAM wParam,

LPARAM lParam)

2.{

3. AFX_MANAGE_STATE(AfxGetStaticModuleState( ));

4. LPMSG lpMsg = (LPMSG) lParam;

5.

6.if(AfxGetApp()->PreTranslateMessage(lpMsg))

7. {

8. lpMsg->message = WM_NULL;

9. lpMsg->lParam = 0L;

10. lpMsg->wParam = 0;

11. }

12.

13.// Passes the hook information to the next hook procedure in

14.// the current hook chain.

15.return ::CallNextHookEx(theApp.m_hHook, nCode, wParam, lParam);

16.}

17.

18.// CStaticMapGPSApp::InitInstance - DLL initialization

19.

20.BOOL CStaticMapGPSApp::InitInstance()

21.{

22.BOOL bInit = COleControlModule::InitInstance();

23.

24.if (bInit)

25. {

26.// TODO: Add your own module initialization code here.

27. m_hHook = ::SetWindowsHookEx(

28. WH_GETMESSAGE,

29. GetMessageProc,

30. AfxGetInstanceHandle(),

31. GetCurrentThreadId());

32.

33. ASSERT (hHook);

34.return CWinApp::InitInstance();

35. }

36.

37.return bInit;

38.}

39.

40.

41.

42.// CStaticMapGPSApp::ExitInstance - DLL termination

43.

44.int CStaticMapGPSApp::ExitInstance()

45.{

46.// TODO: Add your own module termination code here.

47. UnhookWindowsHookEx((HHOOK)m_hHook);

48.return COleControlModule::ExitInstance();

49.}

此时才算是打工告成,信息弹出框如愿以偿的弹出了。

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

模态分析理论

模态分析理论 Document number:WTWYT-WYWY-BTGTT-YTTYU-2018GT

模态分析指的是以振动理论为基础、以模态参数为目标的分析方法。首先建立结构的物理参数模型,即以质量、阻尼、刚度为参数的关于位移的振动微分方程;其次是研究其特征值问题,求得特征对(特征值和特征矢量),进而得到模态参数模型,即系统的模态频率、模态矢量、模态阻尼比、模态质量、模态刚度等参数。 特征根问题 以图3所示的三自由度无阻尼系统为例,设123m =m =m =m ,123k =k =k =k , 图三自由度系统 其齐次运动方程为: mz?+kz =0(8) 其中m ,k 分别为系统的质量矩阵和刚度矩阵, 12 3m 00m 00m=0m 0=0m 000m 00m ????????????????????,1 12 1222 1k -k 0k -k 0k=-k k +k -k =-k 2k -k 0 -k k 0-k k ???? ???????????????? ,则运动方程展开式为: ¨1 1¨22¨33z m 00k k 0z 00m 0z k 2k k z 000m 0k k z 0z ?? ??-???????? ??????????+--=????????????????????-???????????? (9) 定义主振型 由于是无阻尼系统,因此系统守恒,系统存在振动主振型。主振型意味着各物理坐标振动的相位角不是同相(相差0o )就是反相位(相差180o ),即同时达到平衡位置和最大位置。主振型定义如下: ()i i j ωt+i i sin ωt+=Im(e )φφi mi mi z =z z (10)

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

复习复习和总结总结-关于模式与非模式对话框 复习复习和总结总结-关于模式与非模式对话框 对话框有两种创建方式: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.doczj.com/doc/0a2265677.html, 更新日期:2006-09-19 10:03 网页教学网 Response.Write(""); Response.Write("

");

模态分析中的几个基本概念模态分析中的几个基本概念分析

模态分析中的几个基本概念 物体按照某一阶固有频率振动时,物体上各个点偏离平衡位置的位移是满足一定的比例关系的,可以用一个向量表示,这个就称之为模态。模态这个概念一般是在振动领域所用,你可以初步的理解为振动状态,我们都知道每个物体都具有自己的固有频率,在外力的激励作用下,物体会表现出不同的振动特性。一阶模态是外力的激励频率与物体固有频率相等的时候出现的,此时物体的振动形态叫做一阶振型或主振型;二阶模态是外力的激励频率是物体固有频率的两倍时候出现,此时的振动外形叫做二阶振型,以依次类推。一般来讲,外界激励的频率非常复杂,物体在这种复杂的外界激励下的振动反应是各阶振型的复合。模态是结构的固有振动特性,每一个模态具有特定的固有频率、阻尼比和模态振型。这些模态参数可以由计算或试验分析取得,这样一个计算或试验分析过程称为模态分析。有限元中模态分析的本质是求矩阵的特征值问题,所以“阶数”就是指特征值的个数。将特征值从小到大排列就是阶次。实际的分析对象是无限维的,所以其模态具有无穷阶。但是对于运动起主导作用的只是前面的几阶模态,所以计算时根据需要计算前几阶的。一个物体有很多个固有振动频率(理论上无穷多个),按照从小到大顺序,第一个就叫第一阶固有频率,依次类推。所以模态的阶数就是对应的固有频率的阶数。振型是指体系的一种固有的特性。它与固有频率相对应,即为对应固有频率体系自身振动的形态。每一阶固有频率都对应一种振型。振型与体系实际的振动形态不一定相同。振型对应于频率而言,一个固有频率对应于一个振型。按照频率从低到高的排列,来说第一振型,第二振型等等。此处的振型就是指在该固有频率下结构的振动形态,频率越高则振动周期越小。在实验中,我们就是通过用一定的频率对结构进行激振,观测相应点的位移状况,当观测点的位移达到最大时,此时频率即为固有频率。实际结构的振动形态并不是一个规则的形状,而是各阶振型相叠加的结果。 固有频率也称为自然频率( natural frequency)。物体做自由振动时,其位移随时间按正弦或余弦规律变化,振动的频率与初始条件无关,而仅与系统的固有特性有关(如质量、形状、材质等),称为固有频率,其对应周期称为固有周期。 物体做自由振动时,其位移随时间按正弦规律变化,又称为简谐振动。简谐振动的振幅及初相位与振动的初始条件有关,振动的周期或频率与初始条件无关,而与系统的固有特性有关,称为固有频率或者固有周期。 物体的频率与它的硬度、质量、外形尺寸有关,当其发生形变时,弹力使其恢复。弹力主要与尺寸和硬度有关,质量影响其加速度。同样外形时,硬度高的频率高,质量大的频率低。一个系统的质量分布,内部的弹性以及其他的力学性质决定 模态扩展是为了是结果在后处理器中观察而设置的,原因如下: 求解器的输出内容主要是固有频率,固有频率被写到输出文件Jobname.OUT 及振型文件Jobnmae.MODE 中,输出内容中也可以包含缩减的振型和参与因子表,这取决于对分析选项和输出控制的设置,由于振型现在还没有被写到数据库或结果文件中,因此不能对结果进行后处理,要进行后处理,必须对模态进行扩展。在模态分析中,我们用“扩展”这个词指将振型写入结果文件。也就是说,扩展模态不仅适用于Reduced 模态提取方法得到的缩减振型,而且也适用与其他模态提取方法得到的完整振型。因此,如果想在后处理器中观察振型,必须先扩展模态。谱分析中的模态合并是因为激励谱是其实是由一系列的激励组合成的一个谱,里面的频率不会是只有一个,而不同的激励频率对于结构产生的结果是不一样的,对于结果的贡献也是不一样的,所以要选择模态组合法对模态进行组合,得到最终的响应结果。

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: