模态对话框的实现原理

模态对话框的实现原理
模态对话框的实现原理

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);

UpdateWindow();

bShowIdle = FALSE;

}

// call OnIdle while in bIdle state

if (!(dwFlags & MLF_NOIDLEMSG) && hWndParent != NULL && lIdleCount == 0)

{

// send WM_ENTERIDLE to the parent

::SendMessage(hWndParent,

WM_ENTERIDLE, MSGF_DIALOGBOX, (LPARAM)m_hWnd);

}

if ((dwFlags & MLF_NOKICKIDLE) ||

!SendMessage(WM_KICKIDLE,

MSGF_DIALOGBOX, lIdleCount++))

{

// stop idle processing next time

bIdle = FALSE;

}

}

//在有消息的情况下取消息处理

do

{

ASSERT(ContinueModal());

// pump message, but quit on WM_QUIT

if (!AfxPumpMessage())

{

AfxPostQuitMessage(0);

return -1;

}

// show the window when certain special messages rec'd

if (bShowIdle &&

(pMsg->message == 0x118 || pMsg->message == WM_SYSKEYDOWN))

{

ShowWindow(SW_SHOWNORMAL);

UpdateWindow();

bShowIdle = FALSE;

}

if (!ContinueModal())

goto ExitModal;

// reset "no idle" state after pumping "normal" message

if (AfxIsIdleMessage(pMsg))

{

bIdle = TRUE;

lIdleCount = 0;

}

} while (::PeekMessage(pMsg, NULL, NULL, NULL,

PM_NOREMOVE));

}

ExitModal:

m_nFlags &= ~(WF_MODALLOOP|WF_CONTINUEMODAL);

return m_nModalResult;

}

GetMessage与PeekMessage的区别:

GetMessage:用于从消息队列读取消息。若队列中没有消息,GetMessage将导致线程阻塞。

PeekMessage:检测队列中是否有消息,并立即返回,不会导致阻塞。

3. APP中的消息循环

//thrdcore.cpp

// main running routine until thread exits

int CWinThread::Run()

{

// for tracking the idle time state

BOOL bIdle = TRUE;

LONG lIdleCount = 0;

//消息读取乃至分发当为WM_QUIT时,退出循环

for (;;)

{

//检查是否为空闲时刻

while (bIdle &&

!::PeekMessage(&m_msgCur, NULL, NULL, NULL,

PM_NOREMOVE))

{

// call OnIdle while in bIdle state

if (!OnIdle(lIdleCount++))

bIdle = FALSE; // assume "no idle" state

}

//有消息,读消息并分发

do

{

// pump message, but quit on WM_QUIT

if (!PumpMessage())

return ExitInstance();

// reset "no idle" state after pumping "normal" message

if (IsIdleMessage(&m_msgCur))

{

bIdle = TRUE;

lIdleCount = 0;

}

}

while (::PeekMessage(&m_msgCur, NULL, NULL, NULL,

PM_NOREMOVE));

}

}

4. 模态对话框中局部消息循环和APP全局消息循环的关系

4.1 APP消息循环和模态对话框中局部消息循环的关系

根据上图可以看出,在APP的消息循环再派发ONOK消息后,调用ModalDlg

的响应函数,pWnd->OnOk();在该消息中,

会进入模态对话框的消息循环,除非将模态对话框关闭,否则APP的DispatchMessage函数一直出不来。

一旦创建了模态对话框,进行局部消息循环,那么APP的消息循环就被阻断。

整个程序的消息循环有模态对话框中得消息循环取代。所以给父窗口发送的非窗口消息,一样可以响应。

由于局部消息循环只在对话框中的一个响应函数中,而全局的消息循环也被阻断,局部循环一直运行,如果用户不进行处理并关闭模态对话框,该循环会一直不退出。其他对话框也得不到处理。

4.2 局部消息循环存在的必要性

我之前一直有这样一个疑问,觉得模态对话框中的局部消息循环没有必要,可以通过如下方式达到模态对话框的效果:

pParentWnd->EnableWindow(FALSE);

CDialog *pDlg;

pDlg = new CDialog();

pDlg->Create();

pDlg->Show();

pParentWnd->EnableWindow(TRUE);

并且做了个实验,貌似OK。但是这边有个疏漏的是,模态对话框的作用有两个:1. 使父窗口失效,无法响应用户的输入

2. 在当前窗口为处理完毕时,禁止进入后续操作。

上述例子只达到了要求1,没有达到要求二

所以模态对话框中有如下代码:

if (dlg.DoModal() == IDOK)

若对话框没有关闭,是无法进行后续操作的。

但是按照我先前的理解,如果代码是这样的:

void CAppDoModelTestApp::OnTestModaltest()

{

CWnd* pMainWnd = AfxGetMainWnd();

pMainWnd->EnableWindow(FALSE);

m_pTestDlg1 = new CModalDlg();

m_pTestDlg1->Create(IDD_DIALOG1);

m_pTestDlg1->ShowWindow(SW_SHOW);

m_pTestDlg2 = new CModalDlg();

m_pTestDlg2->Create(IDD_DIALOG1);

m_pTestDlg2->ShowWindow(SW_SHOW);

}

在对话框TestDlg1后产生后,TestDlg2一样会出现。但是我们模态对话框希望的效果是:在TestDlg1未关闭前,TestDlg2不创建。所以此处体现出了局部消息循环的优势,就是在当前窗口为处理完毕时,一直循环,拒绝进入后续代码中。

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

模态分析理论

模态分析理论 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)

ansys模态分析步骤

模态分析步骤 第1步:载入模型 Plot>Volumes 第2步:指定分析标题并设置分析范畴 1 设置标题等Utility Menu>File>Change Title Utility Menu>File> Change Jobname Utility Menu>File>Change Directory 2 选取菜单途径 Main Menu>Preference ,单击 Structure,单击OK 第3步:定义单元类型 Main Menu>Preprocessor>Element Type>Add/Edit/Delete,出现Element Types对话框,单击Add出现Library of Element Types 对话框,选择Structural Solid,再右滚动栏选择Brick 20node 95,然后单击OK,单击Element Types对话框中的Close按钮就完成这项设置了。 第4步:指定材料性能 选取菜单途径Main Menu>Preprocessor>Material Props>Material Models。出现Define Material Model Behavior对话框,在右侧Structural>Linear>Elastic>Isotropic,指定材料的弹性模量和泊松系数,Structural>Density指定材料的密度,完成后退出即可。 第5步:划分网格 选取菜单途径Main Menu>Preprocessor>Meshing>MeshTool,出

现MeshTool对话框,一般采用只能划分网格,点击SmartSize,下面可选择网格的相对大小(太小的计算比较复杂,不一定能产生好的效果,一般做两三组进行比较),保留其他选项,单击Mesh出现Mesh Volumes对话框,其他保持不变单击Pick All,完成网格划分。 第6步:进入求解器并指定分析类型和选项 选取菜单途径Main Menu>Solution>Analysis Type>New Analysis,将出现New Analysis对话框,选择Modal单击 OK。 选取Main Menu>Solution> Analysis Type>Analysis Options,将出现Modal Analysis 对话框,选中Subspace模态提取法,在 Number of modes to extract处输入相应的值(一般为5或10,如果想要看更多的可以选择相应的数字),单击OK,出现Subspace Model Analysis对话框,选择频率的起始值,其他保持不变,单击OK。 第7步:施加边界条件. 选取Main Menu>Solution>Define loads>Apply>Structural>Displacement,出现ApplyU,ROT on KPS对话框,选择在点、线或面上施加位移约束,单击OK会打开约束种类对话框,选择(All DOF,UX,UY,UZ)相应的约束,单击apply或OK即可。第8步:指定要扩展的模态数。选取菜单途径Main Menu>Solution>Load Step Opts>ExpansionPass>Expand Modes,出现Expand Modes对话框,在number of modes to expand 处输入第6步相应的数字,单击 OK即可。(当选取Main Menu>Solution> Analysis Type>Analysis Options,将出现Modal Analysis 对话框,选中Subspace模态提取法,在 Number of modes to extract处输入相应

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

复习复习和总结总结-关于模式与非模式对话框 复习复习和总结总结-关于模式与非模式对话框 对话框有两种创建方式: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自定义模式对话框

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

");

多模态话语分析

“蓝·创未来”广告是2010年北京国际车展上大众汽车倾力打造的一幅环保广告,当时从车展现场到北京大街小巷的候车亭里都贴满了这幅广告。选择该广告作为个案研究对象的原因有三:第一,这则广告尽管构图非常简单,却具备了语言、图形和颜色三个模态;第二,这幅广告的独特之处在于,颜色模态居于主导地位,而非语言或图像模态;第三,这幅广告具有鲜明的时代意义。从2009年底的哥本哈根世界气候峰会到国家战略性新兴产业规划①的出台,从“十二·五”规划到2011年9月6日胡锦涛主席在首届亚太经合组织林业部长级会议上发表的题为《加强区域合作实现绿色增长》的致辞,都反映了我国政府实现节能减排、低碳环保、绿色经济的强大决心和战略部署。而我国汽车业也进入了开发新能源、打造新能源汽车的历史阶段。所以这则广告非常契合目前中国大力倡导绿色经济的国家战略,是很有代表性的现代环保广告,内容洗练,留给人们很大的想象和思考空间。 大众汽车集团(中国)总裁兼CEO范安德博士向记者介绍大众汽车品牌“Think Blue (蓝·创未来)”的理念 一、多模态和多元识读概念的产生以及目前大学生多元识读能力现状的调查 随着科学技术的进步和社会生活的日益丰富多彩,人与人之间的交流方式正在发生着巨大变化。在公共交流的很多方面,我们可以深深感受到语言符号以及其他传统习惯中被人们认为是副语言的图像、音乐、颜色等,越来越多地处于突出、甚至是一种优势和中心的地位(韦琴红,2009)。作为单一模态的语言为主导的交流时代已经发展到了多模态交流的时代。然而,丰富多彩的符号资源是如何参与意义构建(meaning making)的、符号系统之间存在何种关系、人们如何解读充满多元符号系统的文本或其他载体,这些亟待解决的问题于20世纪90年代催生了一个新的研究领域——多模态话语分析(multimodal discourse analysis)。基于此,多元识读能力的概念也就应运而生。多元识读能力(multiliteracy),也称多模态识读能力,是新伦敦小组(New London Group)于2000年提出的概念,指具有能阅读所能接触到的各种媒体和模态的信息,并能循此产生相应的材料,如阅读互联网或互动的多媒体。Spiliotopoulos对多元识读有更宽广的视野,认为它指人们能从多种信息传递和信息网络理解各种模态的语篇,能发展批评性思维的技能,能与他人合作并帮助他们发展跨文化意识。根据现有材料,多元识读能力是多层次的,其中最高层次的能力要求参与者不仅能识读语篇信息,能解释符号和图像,利用多媒体和其他技术工具,如互联网,实现意义构建、学习和与他人互动(胡壮麟,2007;韦琴红,2009)。 多模态话语分析的概念和理论研究还处于初始阶段,国内外只有少数专家、学者从事该领域的研究。目前,人们多元识读的意识还几乎没有建立起来。然而,对于担当未来社会文化传播主力军的大学生而言,进行多元识读能力的培养有着非常重要的现实意义和时代意义。 为此,笔者选取了“2010北京国际车展”的大众汽车“蓝·创未来”环保广告为研究个案,以问卷调查和访谈的形式调查了北京部分高校不同年级的近200名本科生,尤其是英语专业本科生,了解其多元识读意识和能力。根据调查和访谈结果,笔者对大学生对该则广告解读的情况进行了总结: 1.大约92%的学生都能解读出蓝色代表海洋、天空,象征着清洁、环保的未来。这也说明颜色在这则广告中发挥的重要作用。 2.只有大约2%的学生,提及了广告把文字和颜色结合了起来,能够想到“Think”表示行动,广告要求大家用环保的思维方式去思考,然后行动,还世界一片蓝天。 3.大约3%的学生认为这则广告中的蓝色代表自由,目的是激起人们自由弛骋的想象,这是对广告的错误解读。 4.还有大约3%的学生提出,这则广告信息量太少,如果教师不提示是大众汽车的广告,

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

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

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

振动模态分析教程整理

/clear /title, Fatigue analysis of quqitong /PREP7 et,1,95 ! 定义单元类型 mp,ex,1,7e4 ! 定义材料5083的弹性模量mp,nuxy,1,0.34 ! 定义材料5083的泊松比MPTEMP,,,,,,,, ! 定义材料密度(吨/立方毫米)MPTEMP,1,0 MPDE,DENS,1 MPDATA,DENS,1,,2.7e-9 ! ********* 导入数模、粘接、划分网格 ********* /FACET,FINE !转换为实体显示 /solu ! 进入求解器 ! *********加载************* solve ! 求解 /POST1 /EFACET,1 PLNSOL, S,INT, 0,1.0 ! 显示应力云图 fini ! 退出求解器

选择分析类型 Main Menu>Solution>Analysis Type>New Analasis>Select Modal /SOL ANTYPE,2 分析设置 Main Menu>Solution>Analysis Type>New Analasis> Analasis Options 输入5阶,根据需要。 可以输入感兴趣频率范围,须包含分析振动频率,否则缺省 /STATUS,SOLU ! *********执行求解Main Menu>Solution>Solve>Current LS

SOLVE FINISH ! *********查看结果:************* /POST1 SET,LIST ! *********查看各阶振型结果或GUI方式操作如图 SET,FIRST ! *********读第一阶振型结果或GUI方式 ! *********查看动态结果:*************

多模态批评话语分析

多模态批评话语分析 随着互联网和多媒体的迅速发展和广泛应用,语言文本不再是交际的唯一手段,图像、手势、动作、颜色、声音等其他非语言符号也成为信息传递的重要方式。我们生活在一个由多种符号资源构成的社会中,意义的构建不再单纯依靠语言文本,而是越来越依赖各种符号资源的整合。人类交流所依赖的媒介和渠道被称之为“模态”(modality),例如:语言、声音、颜色、图像、手势等符号系统。作为人类的一种重要交际行为,话语自然具有多模态性。传统的话语分析以大于句子的语言单位作为研究对象,对实际使用中的语言进行观察和分析,研究语言的组织结构、使用特点、语法规律、语言中的制约因素等内容,忽略了能够传递大量重要信息的其他非语言符号。可见,传统的话语分析已经不能满足人们的实际交际需要,多模态话语分析符合当下信息时代发展的要求和趋势。多模态话语分析为人类理解丰富多彩的符号系统提供了新视角,目前已发展成为一种重要的话语分析方式。像语言一样,视觉符号和声音符号貌似正常或中立(平淡无奇),实则隐含着个人或社会团体的不公正、偏见和歧视。因此,在多模态话语分析中,我们应坚持批评的立场,给予非语言模态符号足够的重视,关注其中含而不露的意识形态意义,尤其是那些被人们习以为常的思想和观点。在多模态话语和批评话语分析互相影响

和借鉴的基础上,多模态批评话语分析应运而生。 20世纪90年代,多模态话语分析在西方开始兴起,引起越来越多语言学家的关注。传统意义上的话语分析注重分析语言符号系统和语义结构本身,忽略了对其他符号系统(例如:图像、声音、颜色、手势等)的研究。随着现代科学技术的发展,人类交际开始依靠多种模态共同完成,包括图像、音乐、声音、颜色等。而这种运用语言、图像、声音、动作等多种符号资源进行交际的现象就是“多模态话语”(multimod aldis-course)。学界对交际中出现的图像、手势、姿态以及空间的运用也产生了浓厚兴趣。学者们认识到,对于意义理解不仅需要对话语语言的分析,更要对独立或相互依赖的其他符号资源进行研究。法国语言学家BarthesRlando是最早从事多模态话语分析研究的学者之一。他在1977年发表的论文《形象的修辞》中探讨了图像在表达意义上与语言的相互作用[1]。Kress和VanLeuwene[2][3][4](P343-368)[5](P35-50)作为社会符号学的代表研究了模态与媒体的关系,在系统功能语言学的基础上,构建了视频话语的分析模式和多模态话语分析框架,探讨了多模态符号表达意义的现象,包括视觉图像、颜色语法以及报纸的版面设计和不同媒介的作用等方面。2007年,朱永生[6](P82-86)提出了两种多模态话语的识别标准:(1)同时使用两种模态的话语叫做“多模态话语”;(2)只涉及一种模态,但包含两个或更多符号系统的话语也是“多模态话语”,比如:视觉

AfxMessageBox()与MessageBox()的区别

AfxMessageBox()与MessageBox()的区别 AfxMessageBox的函数原型 int AfxMessageBox( LPCTSTR lpszText, UINT nType = MB_OK, UINT nIDHelp = 0 ); int AFXAPI AfxMessageBox( UINT nIDPrompt, UINT nType = MB_OK, UINT nIDHelp = (UINT) –1 ); 在第一种形式中,lpszText表示在消息框内部显示的文本,消息框的标题为应用程序的可执行文件名(如Hello)。在第二种形式中,nIDPrompt为要显示的文本字符串在字符串表中的ID。函数调用时会自动从字符串表中载入字符串并显示在消息框中。nType为消息框中显示的按钮风格和图标风格的组合,可以采用|(或)操作符组合各种风格。 按钮风格 MB_ABORTRETRYIGNORE 消息框中显示Abort、Retry、Ignore按钮 MB_OK 显示OK按钮 MB_OKCANCEL 显示OK、Cancel按钮 MB_RETRYCANCEL 显示Retry、Cancel按钮 MB_YESNO 显示Yes、No按钮 MB_YESNOCANCEL 示Yes、No、Cancel按钮 图标风格 MB_ICONINFORMATION 显示一个i图标,表示提示 MB_ICONEXCLAMATION 显示一个惊叹号,表示警告 MB_ICONSTOP 显示手形图标,表示警告或严重错误 MB_ICONQUESTION 显示问号图标,表示疑问 与AfxMessageBox类似的函数MessageBox,它是CWnd的类成员函数: int MessageBox( LPCTSTR lpszText,LPCTSTR lpszCaption = NULL,UINT nType = MB_OK ); 两个函数的区别:AfxMessageBox比MessageBox简单一些,因为它是一个全局函数所以不需要对应的一个窗口类,但是不能控制消息框标题,常用于调试程序时的内部数据输出或警告;MessageBox比较正式,常用在要提交的应用程序版本中,可以控制标题内容而不必采用含义不明的可执行文件名为标题。 举例: AfxMessageBox(“Are you sure?”,MB_YESNO|MB_ICONQUESTION); int a = MessageBox(TEXT( "是否确认删除?" ), TEXT("Warning!!"),4); if (a == 6) AfxMessageBox("Yes"); else AfxMessageBox("No"); (其中#define IDYES 6 #define IDNO 7) 他们的区别,我收集整理了下主要有: 1.MessageBox 如果在非CWnd类中使用则是API函数,使用起来非常不便,必须指定标题和样式 否则使用CWnd类的函数,只需一个内容参数就可以了,AfxMessageBox和CWnd类成员

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

_喜羊羊与灰太狼之虎虎生威_的多模态话语分析

20世纪90年代西方兴起了多模态话语分析,为 由多种符号组成的语篇分析提供了途径。此种分析方法能帮助读者了解不同模态作为社会符号如何共同作用构成意义,达到意义潜势,对提高人们多模式话语识读具有积极的意义。随着科技的不断进步,人们的生活越来越丰富多彩,各种多媒体充斥着人们的生活,多模态话语分析也越来越多地被应用于影视戏剧、电视广告、FLASH 、大型演出及舞台表演等等。本文拟以功能语言学理论和视觉语法为基础,结合声音系统,以电影语篇目前最为流行的《喜羊羊与灰太狼之虎虎生威》(下简称《虎虎生威》)为例进行多模态话语分析,旨在提高人们多模态话语识读能力及为观众赏析此电影提供一个新的视角。 一、理论背景 1.多模态语篇 朱永生提到了识别多模态语篇的两个判断标准。首先是看涉及的模态种类的多少。[1]模态指交流的渠道和媒介,包括语言、技术、图象、颜色、音乐等符号系统。准确地说,有视、听、嗅、触、味五个感官,五种交际渠道,即“五个模态”。例如看电视时,我们通过视觉模态观看电视画面,通过听觉模态收听声 音。其次,判断多模态语篇还可以看涉及符号系统的多少。例如小说中的插图,通常情况下只涉及一种视觉模态,但它还包含文字、图画、色彩的变化以及印刷体式的调整等。再如,电视广告,不仅包含视觉模态,还有听觉模态。简而言之,多模态语篇就是指涉及多种感知模态或由一种以上符号系统共同编码构建整体意义、传递信息的文本。 2.多模态话语分析 多模态话语分析的主要理论基础是Halliday 创立的系统功能语言学理论,其出发点是语言是社会符号。Halliday 认为语言系统中有三个用来表示功能意义的元功能,或称纯理功能:概念功能、人际功能和语篇功能。其中概念功能指语言对人们在现实世界(包括内心世界)中各种经历加以表达的功能,人际功能指讲话者运用语言参加社会活动的功能,语篇功能指语言用于组织信息的功能。Halliday 建构功能语法的目的是为语篇分析提供一个理论框架,这个框架可以用来分析英语中任何口头或书面语篇。 [2]32 Kress 和van Leeuwen 以halliday 的系统功能 语言学理论为基础,在将图像也看作社会符号的前提下,将Halliday 功能语言学中的纯理功能思想延 收稿日期:2010-12-17 作者简介:郭思斯(1986-),女,河北石家庄人,硕士研究生,主要从事英语语言学研究。 《喜羊羊与灰太狼之虎虎生威》的多模态话语分析 郭思斯 (南京师范大学外国语学院,江苏南京 210097) 摘 要:由于电影话语分析涉及到图像、音乐、语言、声音、文本等多种符号模态,以往人们常从 文学评论、电影评论、心理学、美学等宏观角度出发对其进行探讨,而较少使用以语言学为切入点的语篇分析方法。通过从再现意义、互动意义和构图意义上讨论电影《喜洋洋与灰太狼之虎虎生威》中虎威太岁拜年的图像意义表达方式,从电影的角度分析虎威太岁出场的场景、场面调度、画格,从动 画的独特特点分析该电影中各个动画人物色彩等各级阶符号,以及从图像、文字如何与听觉模态音乐等互动方面分析其背景音乐及片尾插曲,可以发现多模态话语分析理论在动画电影分析中具有可行性。 关键词:多模态话语分析;动画电影;图像符号系统;声音符号系统中图分类号:H0-06 文献标识码:A 文章编号:1673-1972(2011)02-0098-04 第13卷第2期石家庄学院学报 Vol.13,No.22011年3月 Journal of Shijiazhuang University Mar.2011

C# WinForm中Show与ShowDialog

C# WinForm中Show与ShowDialog Form.Show创建新窗体后(非模式),立即返回,且没有在当前活动窗体和新窗体间建立任何关系,即在保持新窗口的情况下关闭(或最小化)现有窗体或在保留现有窗体情况下关闭(或最小化)新窗口,都是可以的。 Form.ShowDialog创建模式窗体,即只有当建立的新窗口关闭之后,原有窗体才能重新获得控制权。即如果不关闭新窗口,将无法对原活动窗口进行任何操作。对新窗口进行的最小化、还原将会和原窗口一起进行,但是新窗口的关闭对原窗口没有影响。 对于winform来说,大家可能有一个惯性认识或者潜意识,Winform在关闭时(Close()方法被调用时),会自动调用Dispose。确实,对很多对象,Close()方法会调用Dispose。然而,对Winform,并不总是成立,只有当Winform以Show的方式,及无模式的方式弹出时,Close才会调用Dispose,也就是说用户在这种情况下关闭对话框,Dispose会马上被调用,资源会马上被释放。 但是对ShowDialog,及模式对话框的情况就不是这样了,你必须显示调用dispose 以下两种方式可以用show的方法打开新窗体,并且在关闭的时候不释放 (一) protected override void OnClosing(CancelEventArgs e) { e.Cancel = true; this.Hide(); } (二)

protected override void Dispose(bool disposing) { //if (disposing && (components != null)) //{ //components.Dispose(); //} //base.Dispose(disposing); Hide(); }

MFC-Windows应用程序的设计复习题2

第9章 MFC的文件处理机制 1) 文档负责将数据存储到磁盘中,存取过程称为(D) 。 A. 文件访问 B. 格式化 C. 文件读写 D. 串行化 2) 一个 CArchive 类对象必须与一个( C ) 对象相关联。 A. CObject B. CFileDialog C. CFile类 D. CDocument 3) 不能将 Newfile 文件的文件指针定位在文件头的方法是( B ) 。 A. Newfile.Open("MyFile.txt", CFile::modeCreate) B. NewFile::Seek( 0L, CFile::end) C. Newfile.SeekToBegin() D. Newfile.Seek(0L, CFile::begin) 4)( A )函数用于获取指定文件的文件名。 A. GetFileName() B. GetStatus() C. GetFilePath() D. GetFileTitle() 5) 当应用程序读取或写入文件时,文档对象的( )函数被调用,并将( )对象作为参数传递。 6) ( CArchive )类是一个对象数组类,它可以存放任何从 CObject 派生出的对象,还可以根据元素的数量动态地调整自己的大小。 7) 在 Visual C++中,数据文件的操作通常按照( 打开 ) 、( 操作 ) 、( 关闭 ) 的步骤进行。 8) 写出以读写方式打开文件 student.txt 的语句序列( File.Open(“student.txt”,CFile:modeReadWrite); ) 。 10)什么是序列化? 答:序列化是面向对象程序设计中应对象这种数据的存储和恢复的要求而产生的一种文件读写机制。 第11章对话框 1. 在对话框的编辑器中,最左边的按键的作用是( B )。 A. 激活对话框编辑功能 B. 测试对话框 C. 控件左对齐 D. 控件垂直居中

模态对话框的实现原理

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);

相关文档
最新文档