模态对话框和非模态对话框的区别
- 格式:pdf
- 大小:398.18 KB
- 文档页数:2
模态对话框和⾮模态对话框Windows对话框分为两类:模态对话框和⾮模态对话框。
模态对话框,当它弹出后,本应⽤程序其他窗⼝将不再接受⽤户输⼊,只有该对话框响应⽤户输⼊,在对它进⾏相应操作退出后,其他窗⼝才能继续与⽤户交互。
(⽐如:word中的“另存为”)⾮模态对话框,它弹出后,本程序其他窗⼝仍能响应⽤户输⼊。
⾮模态对话框⼀般⽤来显⽰提⽰信息等。
(⽐如:word中的“查找与替换)创建模态对话框弹出对话框⽐较关键的⼀个函数,CDialog::DoModal()函数的原型为:virtual INT_PTR DoModal(); 返回值:整数值,指定了传递给CDialog::EndDialog(该函数⽤于关闭对话框)的nResult参数值。
如果函数不能创建对话框,则返回-1;如果出现其它错误,则返回IDABORT。
调⽤了它对话框就会弹出,返回值是退出对话框时所点的按钮的ID,⽐如,我们点了“退出”按钮,那么DoModal返回值为IDCANCEL。
就是对话框类的DoModal()函数。
注:CAdditionDlg 为新建对话框的类。
CAdditionDlg dlg; // 定义对话框类CAdditionDlg的对象dlg INT_PTR nResponse = dlg.DoModal(); // 弹出对话框dlg,并将DoModal函数的返回值(退出时点击按钮的ID)赋值给nResponseif (nResponse == IDOK) // 判断返回值是否为OK按钮{MessageBox(“ ”,””,MB_OK);}else if (nResponse == IDCANCEL) // 判断返回值是否为Cancel按钮{MessageBox(“ ”,””,MB_OK);}步骤:1. 在资源视图添加Dialog的对话框,再给对话框添加类CAdditionDlg。
2. 定义对话框类的对象CAdditionDlg m_dlg。
VS2010/MFC编程入门教程之目录第一部分:VS2010/MFC开发环境第二部分:VS2010-MFC应用程序框架第三部分:对话框第四部分:常用控件第五部分:菜单、工具栏与状态栏第六部分:文档、视图和框架第七部分:MFC常用类第八部分:字体和文本输出第九部分:图形图像第十部分:Ribbon界面开发VS2010/MFC编程入门之前言鸡啄米的C++系列给大家讲了C++的编程入门知识,大家对C++语言在语法和设计思想上应该有了一定的了解了。
但是教程中讲的例子只是一个个简单的例程,并没有可视化窗口。
鸡啄米在这套VS2010/MFC编程入门教程中将会给大家讲解怎样使用VS2010进行可视化编程,也就是基于窗口的程序。
C++编程入门系列主要偏重于理论方面的知识,目的是让大家打好底子,练好内功,在使用VC++编程时不至于丈二和尚摸不着头脑。
本套教程也会涉及到VC++的原理性的东西,同样更重视实用性,让大家学完本套教程以后,基本的界面程序都能很容易编写出来。
VC++简介VC++全称是Visual C++,是由微软提供的C++开发工具,它与C++的根本区别就在于,C++是语言,而VC++是用C++语言编写程序的工具平台。
VC++不仅是一个编译器更是一个集成开发环境,包括编辑器、调试器和编译器等,一般它包含在Visual Studio中。
Visual Studio包含了VB、VC++、C#等编译环境。
当然我们在使用VC++ 6.0的时候为了轻便,总是只单独安装VC++ 6.0。
但自微软2002年发布Visual 以来,微软建立了在.NET框架上的代码托管机制,一个项目可以支持多种语言开发的组件,VC++同样被扩展为支持代码托管机制的开发环境,所以.NET Framework是必须的,也就不再有V C++的独立安装程序,不过可以在安装Visual Studio时只选择VC++进行安装。
VC++版本的选择:VS2010因为VC++ 6.0以后的版本不再有独立的安装程序,所以鸡啄米在教程中将不会称VC ++ 6.0以后的版本为VC++ 7.0等等,而是用VC++所属的Visual Studio的版本名称代替,比如VS2003。
C#show和showdialog区别在C#中窗⼝的显⽰有两种⽅式:模态显⽰(showdialog)和⾮模态显⽰(show)。
区别:模态与⾮模态窗体的主要区别是窗体显⽰的时候是否可以操作其他窗体。
模态窗体不允许操作其他窗体,⾮模态窗体可以操作其他窗体。
模态显⽰后,弹出窗⼝阻⽌调⽤窗⼝的所有消息响应。
只有在弹出窗⼝结束后调⽤窗⼝才能继续。
在模态窗⼝“关闭”后,可以读取模态窗⼝中信息,包括窗⼝的返回状态,窗⼝⼦控件的值。
在调⽤Form.ShowDialog⽅法后,直到关闭对话框后,才执⾏此⽅法后⾯的代码窗体显⽰为模式窗体时,单击“关闭”按钮会隐藏窗体,并将DialogResult属性设置为DialogResult.Cancel与⽆模式窗体不同,当⽤户单击对话框的关闭窗体按钮或设置DialogResult属性的值时,不调⽤窗体的Close⽅法实际上是把窗体的Visible属性赋值为false,隐藏窗体了这样隐藏的窗体是可以重新显⽰,⽽不⽤创建该对话框的新实例因为未关闭窗体,所以在应⽤程序不再需要该窗体时,请调⽤该窗体的Dispose⽅法所以模态窗⼝在关闭时,不会调⽤close⽅法,也不调⽤dispose⽅法,窗⼝仍然存在,占有资源,所以可以继续获得窗⼝相关信息,在窗⼝不再使⽤时,需要⼿动释testDialog.ShowDialog(); // 模态窗⼝关闭后,可以再次显⽰出来testDialog.Dispose(); // 当模态窗⼝不再使⽤时,应该调⽤dispose⽅法释放资源⾮模态显⽰后,可以在弹出窗⼝和调⽤窗⼝之间随意切换。
调⽤窗⼝调⽤show⽅法后,下⾯的代码可以⽴即执⾏。
在⾮模态窗⼝关闭后,窗⼝的所有资源被释放,窗⼝不存在,⽆法获取窗⼝的任何信息。
怎么判断⼀个窗体是模式窗体呢?利⽤Form.Modal属性,如果该窗体是模式显⽰,则为true,否则为false根据通过Show和ShowDialog⽽显⽰出来的窗体的Modal属性分别对应false和true特别注意:由于在窗体创建之前是⽆法得知显⽰⽅式的,所以在窗体构造函数中,Modal属性总是对应false,所以我们只能在Load事件中或者之后利⽤Modal属性值怎么确定窗体间的所有者关系?Form类的Owner属性:窗体的所有者当⼀个窗体归另⼀窗体所有时,它便随着所有者窗体最⼩化和关闭。
1. 模态对话框在涉及GUI程序开发的过程中,常常有模态对话框以及非模态对话框的概念模态对话框:在子界面活动期间,父窗口是无法进行消息响应。
独占用户输入非模态对话框:各窗口之间不影响主要区别:非模态对话框与APP共用消息循环,不会独占用户。
模态对话框独占用户输入,其他界面无法响应在用户层的主要逻辑如下:1 TestDlgdlg;23 if (dlg.DoModal() == IDOK)4 {5 //处理完毕后的操作6 }7 .......//后续处理在具体实现中,有如下几个步骤:1. 让父窗口失效EnableWindow(parentWindow, FALSE)2. 建立模态对话框自己的消息循环(RunModalLoop)3. 直至接收关闭消息,消息循环终止,并销毁窗口。
01 INT_PTR CDialog::DoModal()02 {03 //对话框资源加载04 ......0506 //在创建模态窗口之前先让父窗口失效,不响应键盘、鼠标产生的消息07 HWND hWndParent = PreModal();08 AfxUnhookWindowCreate();09 BOOL bEnableParent = FALSE;1011 if (hWndParent&&hWndParent != ::GetDesktopWindow() && ::IsWindowEnabled(hWndParent))12 {13 ::EnableWindow(hWndParent, FALSE);14 bEnableParent = TRUE;15 .......16 }1718 //创建模态窗口,并进行消息循环,若窗口不关闭,则循环不退出 19 AfxHookWindowCreate(this);20 VERIFY(RunModalLoop(dwFlags) == m_nModalResult);2122 //窗口关闭,销毁窗口23 DestroyWindow();24 PostModal();2526 //释放资源,并让父窗口有效27 pMainWnd->EnableWindow(TRUE);2829 //返回30 return m_nModalResult;31 }2. 模态窗口中的消息循环01 int CWnd::RunModalLoop(DWORD dwFlags)02 {03 //要检查窗口状态是否是模态窗口04 //若状态一直为模态,则一直进行消息循环05 for (;;)06 {07 ASSERT(ContinueModal());0809 // phase1: check to see if we can do idle work10 while (bIdle&&11 !::PeekMessage(pMsg, NULL, NULL, NULL, PM_NOREMOVE)) 12 {13 ASSERT(ContinueModal());1415 // show the dialog when the message queue goes idle 16 if (bShowIdle)17 {18 ShowWindow(SW_SHOWNORMAL);19 UpdateWindow();20 bShowIdle = FALSE;21 }2223 // call OnIdle while in bIdle state24 if (!(dwFlags& MLF_NOIDLEMSG) &&hWndParent != NULL &&lIdleCount == 0)25 {26 // send WM_ENTERIDLE to the parent27 ::SendMessage(hWndParent, WM_ENTERIDLE, MSGF_DIALOGBOX, (LPARAM)m_hWnd);28 }29 if ((dwFlags& MLF_NOKICKIDLE) ||30 !SendMessage(WM_KICKIDLE, MSGF_DIALOGBOX, lIdleCount++))31 {32 // stop idle processing next time33 bIdle = FALSE;34 }35 }3637 //在有消息的情况下取消息处理38 do39 {40 ASSERT(ContinueModal());4142 // pump message, but quit on WM_QUIT43 if (!AfxPumpMessage())44 {45 AfxPostQuitMessage(0);46 return -1;47 }4849 // show the window when certain special messages rec'd 50 if (bShowIdle&&51 (pMsg->message == 0x118 || pMsg->message == WM_SYSKEYDOWN))52 {53 ShowWindow(SW_SHOWNORMAL);54 UpdateWindow();55 bShowIdle = FALSE;56 }5758 if (!ContinueModal())59 goto ExitModal;6061 // reset "no idle" state after pumping "normal" message 62 if (AfxIsIdleMessage(pMsg))63 {64 bIdle = TRUE;65 lIdleCount = 0;66 }6768 } while (::PeekMessage(pMsg, NULL, NULL, NULL, PM_NOREMOVE));69 }7071 ExitModal:72 m_nFlags&= ~(WF_MODALLOOP|WF_CONTINUEMODAL);73 return m_nModalResult;74 } GetMessage 与PeekMessage 的区别:GetMessage:用于从消息队列读取消息。
对话框一般分为两种类型:模态类型(modal)与非模态类型(modeless)。
所谓模态对话框,就是指除非采取有效的关闭手段,用户的鼠标焦点或者输入光标将一直停留在其上的对话框。
非模态对话框则不会强制此种特性,用户可以在当前对话框以及其他窗口间进行切换。
本文介绍如何使用JavaScript语言来创建这两种类型的对话框、控制其大小和位置、改变其外观以及在对话框间的数据传递。
(引用)一、创建模态和非模态对话框创建模态对话框:(会缓存最近一次页面的值,通过一些设置可绕过系统的判断)vReturnValue = window.showModalDialog(sURL [, vFreeArgument] [, sOrnaments]);创建非模态对话框:(不会)vReturnValue = window.showModelessDialog(sURL [, vFreeArgument] [, sOrnaments]);· VReturnValue:对于showModalDialog(),它表示被打开的对话框窗口设置的returnValue 属性值。
对于showModelessDialog(),它表示新窗口对象。
· VFreeArgument:这个参数可用于传递某种类型的数据到打开的对话框,数据可以是一个数值、字符串、数组或者一个对象类型。
在新窗口中引用这个数值时,可通过新创建window 对象的dialogArguments 属性。
· SOrnaments:用这个参数指定新窗口的外观。
可选择的窗口属性有很多种,当有多种控制需求时,将相关内容用一个字符串连接起来,其间用分号隔开。
以下是可选择的属性种类:o dialogHeight: sHeighto dialogLeft: sXposo dialogTop: sYposo dialogWidth: sWidtho center: ( yes | no | 1 | 0 | on | off )o dialogHide: ( yes | no | 1 | 0 | on | off )o edge: ( sunken | raised )o help: ( yes | no | 1 | 0 | on | off )o resizable: ( yes | no | 1 | 0 | on | off )o scroll: ( yes | no | 1 | 0 | on | off )o status: ( yes | no | 1 | 0 | on | off )二、控制对话框大小和位置三、改变对话框外观四、从Noname1.html页面传递数据到Noname2.html页面传递对象类型数据<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><HTML><HEAD><TITLE>模态窗口和非模态窗口</TITLE><script language="javascript">var sColor="yyyy";var sName="xmddl369";function showModalWindow(){window.showModalDialog('Noname2.html',window,'dialogWidth:400px;dialogHeight:400p x');}function showModellessWindow(){window.showModelessDialog('Noname2.html',window,'dialogWidth:400px;dialogHeight:40 0px;edge:sunken');}function update(){oColor.innerText = sColor;}document.write("sColor="+sColor+"<br>");document.write("sName="+sName+"<br>");</script></HEAD><BODY><form><input type="button" name="button" value="打开一个模态窗口" onclick="showModalWindow ()"><input type="button" name="button" value="打开一个非模态窗口" onclick="showModelless Window()"><BR><P>输入你最喜欢的颜色: <SPAN ID="oColor" STYLE="color:red;font-size:24">Yellow</SPA N></P></form></BODY></HTML>-------------------<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><HTML><HEAD><TITLE> New Document </TITLE><script language="javascript">function getInfoAndUpdate() {var callerWindowObj = dialogArguments; //得到文档的引用callerWindowObj.sColor = document.all("oEnterColor").value;callerWindowObj.update();}function cancel() {var callerWindowObj = dialogArguments;callerWindowObj.sColor = "Yellow";callerWindowObj.update();}</script></HEAD><BODY><form>输入你最喜欢的颜色:<INPUT type="text" name="oEnterColor" ID="oEnterColor"><BR><B R><INPUT VALUE="Apply" TYPE=button onclick="getInfoAndUpdate();"><INPUT VALUE="Ok" TYPE=button onclick="getInfoAndUpdate();window.close();"><INPUT VALUE="Cancel" TYPE=button onclick="cancel();window.close();"></form></BODY></HTML>传递数组引用类型数据<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><HTML><HEAD><TITLE>模态窗口和非模态窗口</TITLE><script language="javascript">var fruit=new Array();fruit[0]="苹果";fruit[1]="桔子";fruit[2]="梨";fruit[3]="香蕉";function showModalWindow(){window.showModalDialog('Noname2.html',fruit,'dialogWidth:400px;dialogHeight:400px'); }function showModellessWindow(){window.showModelessDialog('Noname2.html',fruit,'dialogWidth:400px;dialogHeight:400px; edge:sunken');}</script></HEAD><BODY><form><input type="button" name="button" value="打开一个模态窗口" onclick="showModalWindow ()"><input type="button" name="button" value="打开一个非模态窗口" onclick="showModelless Window()"><BR></form></BODY></HTML>------------------<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><HTML><HEAD><TITLE> New Document </TITLE><SCRIPT LANGUAGE="JScript">function deWrite(){var myobject=document.getElementById("ifruit");var myfruit=dialogArguments;for(count=0;count<myfruit.length;count++){var oOption = document.createElement("OPTION");oOption.text=myfruit[count];oOption.value=/count;myobject.add(oOption);}}</SCRIPT></HEAD><BODY><form><input type="button" name="button" value="click me" onclick="deWrite()"><br>增加水果:<SELECT ID="ifruit" NAME="ifruit"></SELECT></form></BODY></HTML>传递值类型数据<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><HTML><HEAD><TITLE>模态窗口和非模态窗口</TITLE><script language="javascript">function showModalWindow(){window.showModalDialog('Noname2.html',"xmddl",'dialogWidth:400px;dialogHeight:400p x');}function showModellessWindow(){window.showModelessDialog('Noname2.html',"xmddl369",'dialogWidth:400px;dialogHeight: 400px;edge:sunken');}</script></HEAD><BODY><form><input type="button" name="button" value="打开一个模态窗口" onclick="showModalWindow ()"><input type="button" name="button" value="打开一个非模态窗口" onclick="showModelless Window()"><BR></form></BODY></HTML>------------------<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><HTML><HEAD><TITLE> New Document </TITLE><SCRIPT LANGUAGE="JScript">function deWrite(){var names=dialogArguments;//document.write(names);}</SCRIPT></HEAD><BODY><form><input type="button" name="button" value="click me" onclick="deWrite()"></form></BODY></HTML>其中window.Open(url,,)的一点体会<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><HTML><HEAD><TITLE> New Document </TITLE><script language="javascript">function showOpenWindow(){window.open('','xmddl','height=600px,width=800px,toolbar=no,menub ar=no,resizable=yes, scrollbars=yes, location=no, status=no');}</script></HEAD><BODY><form><input type="button" name="button" value="click me" onclick="showOpenWindow()"></form></BODY></HTML>//在Url的地方可以跟上一个.do的请求,基于struts架构时可以链接到某一个具体的页面,体现了窗口作为显示的作用//在模态窗口打开新窗口在模态窗口的head部分添加如下代码<base targat='_self'>。
MFC对话框和对话框类几个对话框程序例子建立对话框与相应的程序相关联如何建立对话框与相应的程序相关联:在MFC中,对资源的操作都是建立相关的类来完成的;所以我门先NEW 一个对话框资源然后建立他的类与相应的应用程序相关联就可以;步骤:1 NEW 一个对话框资源2 在资源上选择 Classwarrzd上创建一个新的类(或在资源上双击左键)3 起名字!(注意文件名将会去掉C 例如我门的名字叫 CDaiDlg那么文件名是 DaiDlg);对话框的俩种类型:1 模态对话框(特性:当建立模态对话框时,将不允许用户点击对话框以外的控件后应用程序本身,也就是说当模态对话框建立时应用程序停止运行而只运行对话框,所以模态对话框是可以使用局部变量的定义方法的!)模态对话框是比较方便的一种对话框~建立函数:int CDialog::DoMadol() //注意他是CDialog类成员也就是说想使用先建立一个 CDialog 对象吧如果我门想要在View类中建立一个 CDialog对象不要忘了要在View的Cpp 文件中包含 CDialog.h2 非模态对话框(特性与模态的相反)使用成员函数 BOOL CDialog::Create( UINT nIDTemplate, CWnd* pParentWnd = NULL );nIDTemplate 为对话框的ID号pParentWnd 拥有这个对话框的对象指针,如果是NULL 为默认的主应用窗口也就是 Frame应用窗口注意如果我门在使用Create创建非模态对话框时要调用一个函数来显示这个对话框CWnd::ShowWindow(SW_SHOW);不仅这样非模态对话框时不能是局部变量!完整代码: CDialog dlg;dlg.Create(ID,this);dlg.ShowWindow(SW_SHOW):对ShowWindow的发现: ShowWindow是CWnd的成员函数是改变窗口的显示属性(包括Hide Show等)ShowWindow这一函数是改变属性同样在创建一个窗口时(窗口包括很多,CButton也是一个窗口!)可以直接给他赋予属性 WS_VISIBLE (可见的)等属性也可以解决改变窗口之后更新窗口的问题显示出新窗口的问题~!对于俩种对话框的销毁;模态对话框中OnOK的成员函数中有对模态对话框的 EndDialog();来销毁而非模态的对话框时 OnOK不能销毁对话框而我门需要对OnOK函数进行覆盖调用DestryWindow;做一个对话框的小程序,在对话框上动态增加一个按钮:在这要强调一下动态的增加某种资源是需要把资源对象声明成类的成员这样才可以(不然被析构了建立了也就没有效果了)而资源对象是对象资源是资源只有吧资源和对象联系起来这个的东西才有实际的意义,我门才能对他进行操作,而把资源和对象联系起来有俩个函数 LoadMenu 和CreateMenu (当然有些类是不存在 Load函数的例:Button类) Load函数是将一个已经被我门在资源视图中创建好的东西与对象联系而Create函数是直接创立一个新的东西(而直接创立时我门还需要给他一些这样东西的属性所以使用Create函数时总是件另人讨厌的事情~)更重要的事情是:一个对象只能与一个资源相联系如果你想把这个已与资源联系的对象与另一个资源联系起来那必须先调用DestoryWindow()这个资源然后在做新的联系;静态文本框的操作:刚刚建立的静态文本框是不可以做消息响应的(一般也不需要这么去做)而我门想要去用静态文本框的消息就要改边文本框的 ID (因为一般不给文本框添加消息响应文本框的的ID都是一样的)并且要把属性->样式(Styles)->通告(Notify)打上对号!!几个有用的函数:获得窗口的文本CWnd::int GetWindowText(CString &str);CWnd::int GetWindowText( LPTSTR lpszStringBuf, int nMaxCount ) const; 参数str是放置文本的对象!lpszStringBuf是一个字符串的指针,nMaxCount 到大的最大字符数同样使用 SetWindowText(CString str)SetWindowText(LPCTSTR lpszString);来设置文本获得对话框上控件的指针(控件包括了Button,静态文本等等!)CWnd::CWnd* GetDlgItem( nID )使用ID号来获取控件的指针!从而进行操作!从编辑框得到数据的几种操作1 使用GetDlgItem( nID )->GetWindowText( )然后把字符转换为我门所要的东西(使用 atoi,itoa 的转换函数)这几个函数所要注意的问题使用函数前一定要确定这个函数是对谁操作!对谁操作要获取谁的指针!!GetWindowText(LPTSTR lpszStringBuf, int nMaxCount )这个函数参数lpszStringBuf所要存储的指针 nMaxCount 是最大得到多少个字符~使用代码例子:char str[10];GetDlgItem( nID )->GetWindowText(str,10 );//注意第一个参数使用的是指针aoti itoa 函数介绍:(介绍前的感想,做ACM时看到程序就要将程序分成一个一个功能函数,然后将功能函数做好,从来没有想过使用他人做好的函数,而现在学习了MFC这套教程,养成的第一个习惯就是寻找自己想要的函数在MSDN中,然后再自己编写算是一种偷懒的行为吧,估计在以后的编程中,也要养成先寻找和想要的类模型差不多的类然后在通过继承派生来得到想要的类模型,这可能就是代码重用的本质吧 ~ MS就是一大堆会偷懒的编程员 ~呵呵)double atof( const char *string );int atoi( const char *string );__int64 _atoi64( const char *string );long atol( const char *string );这四个函数不用多说了,要注意的就是参数的问题,不要看参数名字叫 string 就是一个CString 成员而是 char*(指针) 也就是数组的名字返回型是相应转化的数据类型;(这是一个不错的函数)不过要注意他是需要包含头文件Routine Required Header Compatibilityatof <math.h> and <stdlib.h> ANSI, Win 95, Win NTatoi <stdlib.h> ANSI, Win 95,Win NT_atoi64 <stdlib.h> Win 95, Win NTatol <stdlib.h> ANSI, Win 95, Win NT还可以反过来 itoa, ftoa等等做一个介绍char *_itoa( int value, char *string, int radix );value要转换的数char *string 一个buffer 接受转换后的字符串int radix 十进制啊二进制 ...==(还有这里的 atoi 的 a 是ASCII的 A 这就解释了为什么不是ctoi~)2 使用函数GetDlgItemText( nID,LP... ),SetDlgItemText(nID,LP...)(这函数不仅长的象 GetDlgItem 和 GetWindowText 的混合体功能更是相同...又个偷懒的杰作!)int GetDlgItemText( int nID, LPTSTR lpStr, int nMaxCount ) const;int GetDlgItemText( int nID, CString& rString ) const;void SetDlgItemText( int nID, LPCTSTR lpszString ); 使用也是一样的!比那个能方便点~!3 又一个混合体函数 GetDlgItemInt();; SetDlgItemInt()在2的基础上来atoi都不用了!UINT CWnd:: GetDlgItemInt( int nID, BOOL* lpTrans = NULL, BOOL bSigned = TRUE ) const;nID ID号lpTrans 如果NULL 那么不会给出错误的提示bSigned 是否是有符号的数字(就是是否去转化符号“-”) TRUE就是有符号啦!!void SetDlgItemInt( int nID, UINT nValue, BOOL bSigned = TRUE ); nValue 是你想要在DlgItem输出的数字;4 使用资源来关联变量的方式来控制数据交换(这才是重点,因为他不只提供了对数据错误的提示功能还增加了控件与资源的联系当然我门需要了解框架所带给我门的东西;)在控件上使用ClassWarrzd 选择第2个选项卡!(Member Variables)对相应的 ID 号进行资源与数据的联系:观察一下ClassWarrzd给我门在代码里家了些什么:1 在头文件中加了// Dialog Data//{{AFX_DATA(CTextDlg)enum { IDD = IDD_DIALOG1 };int m_num1;int m_num2;int m_num3;//}}AFX_DATA这是数据交换的宏2 在构造函数里给这几个成员变量初始化://{{AFX_DATA_INIT(CTextDlg)m_num1 = 0;m_num2 = 0;m_num3 = 0;//}}AFX_DATA_INIT3 在void CTextDlg::DoDataExchange(CDataExchange* pDX)函数中增加了数据交换声明{CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(CTextDlg)DDX_Text(pDX, IDC_EDIT1, m_num1);DDX_Text(pDX, IDC_EDIT2, m_num2);DDX_Text(pDX, IDC_EDIT3, m_num3);//}}AFX_DATA_MAP}对与 void CTextDlg::DoDataExchange(CDataExchange* pDX) 的使用用来数据交换!!这个函数是被框架调用,用来交换和验证数据的函数!这个函数从来不被直接掉用而是通过调用UpdateData()函数来调用这个函数来交换和验证数据的(这句的意思是DoDataExchange 接口是不对我门开放的我门想要掉用 DoDataExchange这个函数必须用UpdateData()来间接调用)BOOL UpdateData( BOOL bSaveAndValidate = TRUE );介绍:参数问题:bSaveAndValidate=TRUE 时数据开始交换(也就是说我门对该变量的操作是生效的)而当他是 FALSE 时数据不再交换而是初始化这个函数(也就是把这个变量的操作失效不过可以在屏幕上进行显示!)通过改变这个参数的值我门可以控制数据的交换或是数据的显示~这是很重要的;!错误的数字使得我门的操作成为无效;~还要说的一点是当创建的是模态对话框时(DoModal)时系统会自动把这个参数变成 FALSE 也就是说我门初始时是不能改变变量的例子代码: UpdateData();m_num3=m_num1+m_num2;UpdateData(FALSE);//我门也可以让控件关联一个控件变量然后在调用他的成员函数进行操作(教程里有讲不过觉得有些多余,也许在其他类型的程序中可能要有用,注意这种方法ClassWarrzd的使用方法)函数 SendMessage( );(注意是SendMessage 而不是SetMessage)是一个发送消息的函数使用....不详,查查SDK API什么的吧~ 功能很强大static LRESULT SendMessage( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam )关于SendMessage()函数的说明发送一个响应的消息message,然后用wParam,lParam来接受我门想要的东西(当然这个要取决于我门发的是什么消息现在已知的消息是:WM_SETTEXT,WM_GETTEXT去MSDN 看看)而SendMessage 在API 和 MFC 中都有要注意是谁调用他的原始问题;SendMessage()的变种(向对话框中的子控件发送消息):LRESULT SendDlgItemMessage( int nID, UINT message, WPARAM wParam = 0, LPARAM lParam = 0 ); 用法基本相同对于获取编辑框复选的操作:向编辑框发送一个 EM_GETSEL (同样也是 EM_SETSEL) 要使用SendMessage()来发送//还要注意的是我门已经把复选设置好了有的时候也是看不见效果的,因为我门在操作时点击了按钮或者其他的操作使得焦点没有在我门所设置那个Item上所以我门是看不见结果的我门还要增加一个操作是用函数改变焦点:CWnd* CWnd::SetFocus( );没有参数返回值是以前那个带有焦点的指针;(对与复选最常用的是复选所有的东西,这样我门要把 SendMessage 的wParam =0,lParam =-1)总结:怎么样改变对话框的大小用来增加新的功能?对话框的矩形坐标可以利用一个图形控件和 SetWindowPos 来改变先要知道对话框的矩形坐标通过控件得到(GetWindowRect())矩形坐标 ...这样我门就能知道需要改变什么矩形坐标了void GetWindowRect( LPRECT lpRect ) const; 函数参数 lpRect 用来储存矩形坐标BOOL SetWindowPos( const CWnd* pWndInsertAfter, int x, int y, int cx, int cy, UINT nFlags ); 本来是用来改变Window Z-order 的(什么是 Z-order简单说就是显示窗口的顺序)在 79 710 俩课中使用的SDK 函数不再介绍(因为不明白!!)使用default按钮的特性来增加对话框对回车(0x0d)按键响应的操作我门用一个设置输入焦点随回车变化的例子来说明;因为在重载OnOK函数时 OnOK还是会调用基类的 OnOK函数(OnOK函数会自动关闭对话框)而我门不希望我门在输入回车时关闭对话框所以我门将它转化为注释!然后使用函数获取当前焦点的句并 Wnd* GetFocus( )来选择GetNextWindow(UINT nFlag = GW_HWNDNEXT )然后在使用SetFocus( );完整代码:(在Dialog中的 OnOK 函数中)GetFocus()->GetNextWindow()->SetFocus();这个代码逻辑上是可以的,不过执行起来会发生错误,如果一直回车下去回造成程序崩溃;(哪有那么都 GetNext呀?)我门要使用Tab功能的函数来完成这个功能就不会出错了~CWnd* GetNextDlgTabItem( CWnd* pWndCtl, BOOL bPrevious = FALSE ) const;pWndCtl开始时的窗口bPrevious = FALSE 向下走;如何查看 Tab 顺序:布局(layout)-> Tab顺序(Tab Order)OK按钮不管存在不存在都会执行 OnOK函数他的ID 号是IDOK(不是ID_OK 哦)孙鑫MFC教程笔记(菜单.对话框)2007-08-11 20:03对话框先要对消息的传送进行分析:消息分为三类标准消息,命令消息,通告消息;标准消息:是除WM_COMMAND以外的所有以WM_开头的消息(WM_Char,WM_Move 等)命令消息:WM_COMMAND 包括了来自菜单、加速键或工具栏按钮的消息。
非模态对话框名词解释
嘿,你知道非模态对话框吗?这玩意儿啊,就好像是你生活中的一
个随时可以出现又不会强行打断你的朋友!比如说,你正在聚精会神
地看电影呢,突然手机来了个推送消息的小窗口,这就有点像非模态
对话框啦!它不会让你非得马上处理它,你可以先不理会,继续看你
的电影,等你想看了再去瞅瞅它。
非模态对话框不会霸占你的全部注意力,而是在旁边静静地待着。
就好比你在和朋友聊天,旁边有人跟你说了句话,你可以选择先回应
朋友,一会儿再去搭理旁边那个人。
它不会像模态对话框那样,非得
等你处理完了它才让你继续做其他事情。
想象一下,你正在玩游戏玩得正嗨呢,突然弹出个模态对话框,你
是不是会很烦躁,觉得游戏都被打断了呀!但如果是个非模态对话框,那就不一样啦,它就像个懂事的小伙伴,不吵不闹。
在我们使用各种软件的时候,非模态对话框可是很常见的呢!比如
一些提示信息、实时更新的状态显示等等。
它给我们提供了方便,让
我们可以在不中断当前任务的情况下获取一些额外的信息。
非模态对话框真的是很贴心的存在呀!它既能给我们必要的提示,
又不会过分打扰我们。
难道你不这么认为吗?它就像是生活中的小惊喜,时不时地出现一下,给我们的使用体验增添了一份别样的乐趣。
我觉得非模态对话框是现代软件设计中非常重要的一部分,它让我们的操作更加流畅和自然,让我们能更好地享受科技带来的便利。
GUI 实践问题第一章1.什么对话框在没有关闭的情况下不允许用户操作应用程序? 答:Modal2.说明下面的陈述是对还是错. 答:错的系统模态对话框允许偶然性切换到调用此对话框的应用程序的另一下区域.3.系统模态对话框和非模态对话框之间有哪些不同?答:系统模式对话框显示在屏幕上时,用户不能切换到其他Windows应用程序,也不能与其他Windows应用程序交互,直到系统模式对话框关闭后,用户才能执行这类操作。
但是。
无模式对话框允许用户在对话框显示的情况下,切换到调用该对话框的应用程序的其他部分或其他Windows应用程序。
4..dll扩展名代表什么?答:动态链接库5.说明下面的陈述是对还是错。
在动态链接中,如果更新了库,程序并不需要重新编译。
答:对的第二章1.JIT的展开式是什么? Just-in-time2.使用New Project对话框的项目类型窗格中的哪个模板来创建可以添加到用户界面的定制控件?Windows控件库3.需要从Debug菜单中选择开始调试选项来执行在Visual Studio 2005 中开发的应用程序。
4.Visual Studio。
NET IDE提供的三种导航特性的名称是什么?1.Docking 2.Tabbed navigation 3.Auto hide5.下面的陈述是对还是错。
在JIT编译过程中,检查代码的类型安全性。
对第三章1、继承Form类将会涉及哪个命名空间?a、System.Windowsb、Systen.Text C、System.Windows.Forms d、System.Drawing2、典型的拖放操作的第三步是什么?A、处理控件的(DragDrop)事件B、设置控件的AllowDrop的属性C、处理拖动事件D、调用DoDragDrop评选方法3、用户在TextBox控件中可以输入的文本的默认最大尺寸是多少?a、2Kb、4Kc、8Kd、12K4、ListBox控件的SelectionMode属性的默认值是:a、Noneb、Onec、MultiSimpled、MultiExtemded5、在设计时ListBox控件的啊种属性不可用?a、Sortedb、Itemsc、SelectionModed、SelectedTtem第五章1.下面的哪个类不能直接实例化?(c)A、olorDialog类B、FontDialog类C、FileDialog类D、OpenfileDialo类2. 下面的哪个方法将由commonDialog类的继承覆写?(c)a. Show()b. ShowDialog()c. Runiaiog()d. FileDialog()3. 下面的哪个通用对话框可以用于获取文件夹的路径?(b)a . FileDialog() b. FoldeBrowserDialog() c. OpenFileDialog() d. SaveFileDialog()4.创建定制的对话框时,你需要将窗体的哪个属性设置为FixedDialog?(a)a. FormBorderStyleb. RightToLeftLayoutc. AutoScaleModed. WindowState5.ToolStripMenuITem控件的MergeAction 属性的默认值是什么?(a)a. Appendb. Insertc. Replaced.Remove第六章1.哪个属性用于跟踪用户在打印对话框中点击的按钮?DialogResult 属性Document属性 Filter属性 Tag属性2.用于显示对话框的方法名是什么? ShowDialog()方法3.PrintPreviewControl的哪个属性值用于获取或指定页面设置?Document DefaultPageSettings StartPage Zoom4.使用哪种模式时,开发者无需为报表与数据源编写代码,就可以实现它们之间的连接与数据的提取? 拉模式5.哪个属性用于指定水晶报表的访问路径? ReportSource属性第七章1.件的 A 属性用于指定无障碍帮助识别控件使用的名称。
调用一个新的对话框的方法注意:这里是插入窗体。
一、模态对话框1) 首先,新建的一个对话框,假如为test2) 在刚才插入的子窗口添加消息映射函数void C***Dll::PostNcDestroy() ,在次函数里面添加:delete this;3) 在需要调用新建对话框的CPP 文件添加头文件#include "test.h"4) 然后在需要调用新建对话框的按钮的成员函数里写上:AFX_MANAGE_STATE(AfxGetStaticModuleState());test testDlg;testDlg.DoModal();二、非模态对话框1) 首先,插入一个窗体,假如为CFrmDl ;2) 在刚才插入的子窗口添加消息映射函数void C***Dll::PostNcDestroy() ,在次函数里面添加:delete this;3) 在需要调用新建对话框的CPP 文件添加头文件#include "FrmDll.h" ;4) 然后在需要调用新建对话框的按钮的成员函数里写上:AFX_MANAGE_STATE(AfxGetStaticModuleState());CFrmDll *dlg = new CFrmDll; // 在内存中new 出来dlg->Create(IDD_FRMDLLDlg); // 创建对话框,dlg->CenterWindow(); // 窗口居中dlg->ShowWindow(SW_SHOW); // 显示窗口非模态Dll 调用例子:typedef void ( * P_show)();HINSTANCE hinstance =NULL;void CTestDlgDlg::OnButton1(){if (hinstance ==NULL){hinstance = LoadLibrary ("dllPro.dll");}if(hinstance ==NULL){AfxMessageBox("Fail");return;}P_show show = (P_show)::GetProcAddress (hinstance,"showdlg");show();// FreeLibrary(hinstance); // 这个记得放在析构函数里面// hinstance = NULL; // 这个记得放在析构函数里面}。
模态对话框与非模态对话框的区别使用非模态对话框与使用模态对话框相似,但是也有一些重要的区别:首先,非模态对话框通常包含一个标题列和一个系统菜单按钮。
当您在Developer Studio中建立对话框时,这些是内定选项。
用于非模态对话框的对话框模板中的STYLE叙述形如:STYLE WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE标题列和系统菜单允许使用者,使用鼠标或者键盘将非模态对话框移动到另一个显示区域。
对于模态对话框,您通常无须提供标题列和系统菜单,因为使用者不能在其下面的窗口中做任何其它的事情。
第二项重要的区别是:注意,在我们的范例STYLE叙述中包含有WS_VISIBLE样式。
在 Developer Studio中,从「Dialog Properties」对话框的「More Styles」页面卷标中选择此选项。
如果省略了WS_VISIBLE,那么您必须在CreateDialog呼叫之后呼叫ShowWindow:(这一个是对于非模态的对话框而言的)hDlgModeless = CreateDialog ( . . . ) ; ShowWindow (hDlgModeless, SW_SHOW) ;如果您既没有包含WS_VISIBLE样式,又没有呼叫ShowWindow,那么非模态对话框将不会被显示。
如果忽略这个事实,那么习惯于模态对话框的程序写作者在第一次试图建立非模态对话框时,经常会出现问题。
第三项区别:与模态对话框和消息框的消息不同,非模态对话框的消息要经过程序式的消息队列。
要将这些消息传送给对话框窗口消息处理程序,则必须改变消息队列。
方法如下:当您使用CreateDialog建立非模态对话框时,应该将从呼叫中传回的对话框句柄储存在一个整体变量(如hDlgModeless)中,并将消息循环改变为:while (GetMessage (&msg, NULL, 0, 0)){if (hDlgModeless == 0 ||!IsDialogMessage (hDlgModeless, &msg)){TranslateMessage (&msg) ;DispatchMessage (&msg) ;}}如果消息是发送给非模态对话框的,那么IsDialogMessage将它发送给对话框中窗口消息处理程序,并传回TRUE(非0);否则,它将传回FALSE(0)。
C#⾮模式窗体show()和模式窗体showdialog()的区别对话框不是模式就是⽆模式的。
模式对话框,在可以继续操作应⽤程序的其他部分之前,必须被关闭(隐藏或卸载)。
例如,如果⼀个对话框,在可以切换到其它窗体或对话框之前要求先单击“确定”或“取消”,则它就是模式的。
⼀、如何调⽤任何窗体(派⽣于基类Form的类),都可以以两种⽅式进⾏显⽰。
//⾮模式窗体From qform=new Form();qform.Show();//模式窗体Form qform=new Form();qform.ShowDialog();⼀、控制权上的区别Form.Show创建新窗体后(⾮模式),⽴即返回,且没有在当前活动窗体和新窗体间建⽴任何关系,即在保持新窗⼝的情况下关闭(或最⼩化)现有窗体或在保留现有窗体情况下关闭(或最⼩化)新窗⼝,都是可以的。
Form.ShowDialog创建模式窗体,即只有当建⽴的新窗⼝关闭之后,原有窗体才能重新获得控制权。
即如果不关闭新窗⼝,将⽆法对原活动窗⼝进⾏任何操作。
对新窗⼝进⾏的最⼩化、还原将会和原窗⼝⼀起进⾏,但是新窗⼝的关闭对原窗⼝没有影响。
需要注意的是,不管是何种情况,只要主窗体被关闭了,或主程序结束了,那么Application.Run将会关闭所有窗体,不管它是模式还是⾮模式。
⼆、Owner属性带来了什么上⾯所讲的是不建⽴拥有关系时的窗体。
当为窗体间建⽴了拥有关系,情况就会有所变化。
1、⾸先看⾮模式的情况。
为⾮模式新窗⼝建⽴拥有关系的⽅法是修改其Owner属性。
(默认情况下,⾮模式窗⼝不存在拥有者)form.Owner=this; //假设当前窗⼝是新窗⼝的拥有者form.Show();很显然,新建的⾮模式窗体已经被认为是原活动窗体的⼦窗体,原窗⼝的⾏为将会影响新窗⼝,所以我们姑且把它们称作⽗窗⼝和⼦窗⼝之间的关系。
那么,改动后会有什么显著的变化呢?主要有两点:第⼀,⽗窗⼝最⼩化、还原或关闭,⼦窗⼝也将随之最⼩化、还原或关闭。
模态指令和非模态指令一、模态指令和非模态指令的概念模态指令和非模态指令是计算机操作系统中常用的两种指令。
模态指令是一种需要在特定状态下执行的指令,而非模态指令则可以在任何状态下执行。
在操作系统中,模态指令通常用于控制设备或更改系统状态,而非模态指令则用于数据传输或算术运算等。
二、模态指令的分类1. 保护模式和实地址模式保护模式是一种特殊的处理器状态,它提供了对硬件资源的保护和管理。
在保护模式下执行的程序只能访问其分配给它的内存区域,从而避免了程序对其他进程或操作系统造成的干扰。
保护模式下运行的程序可以使用所有可用内存,并且可以直接访问硬件资源。
实地址模式是一种基本的处理器状态,它不提供任何保护机制。
在实地址模式下运行的程序可以访问整个物理内存空间,并且可以直接访问硬件资源。
这种状态通常被用于早期计算机系统中。
2. 内核态和用户态内核态是操作系统运行时所处的权限最高级别,它拥有对系统所有资源的完全控制权。
在内核态下运行的程序可以直接访问所有硬件资源,并且可以执行任何指令。
内核态通常被用于操作系统内部的任务,如设备驱动程序、中断处理程序等。
用户态是操作系统运行时所处的权限较低级别,它只能访问分配给它的资源。
在用户态下运行的程序不能直接访问硬件资源,必须通过操作系统提供的接口来进行访问。
用户态通常被用于应用程序和用户进程中。
三、非模态指令非模态指令是一种可以在任何状态下执行的指令。
它们通常用于数据传输或算术运算等操作。
以下是一些常见的非模态指令:1. MOV:将数据从一个位置复制到另一个位置。
2. ADD:将两个数相加,并将结果存储到一个目标位置。
3. SUB:将两个数相减,并将结果存储到一个目标位置。
4. AND:对两个二进制数进行逻辑与操作,并将结果存储到一个目标位置。
5. OR:对两个二进制数进行逻辑或操作,并将结果存储到一个目标位置。
6. XOR:对两个二进制数进行异或操作,并将结果存储到一个目标位置。
模式对话框就是不处理它就没法处理父窗口,而非模式对话框就是不用先处理此对话框也可以处理父窗口.例子:在桌面上右击我的电脑,选择属性,弹出系统属性窗口,点击下面的技术支持,弹出技术支持信息,现在再对系统属性窗口进行操作就操作不了,这种叫做模式对话框;关闭技术支持信息,在系统属性里选择硬件,点击设备管理器,弹出设备管理器窗口,现在再对系统属性窗口进行操作仍然可以操作,这种就叫做非模式对话框。
在WIN32中,模式对话框的创建一般是使用DialogBox来进行创建的。
而非模式对话框则是利用CreateWindow来创建的。
在MFC或是WTL中,模式对话框一般是使用DoModal,而非模式对话框的创建则是使用Create。
一、使用中的区别模式对话框创建后,程序的其他窗口便不能进行操作,必须将该窗口关闭后,其他窗口才能进行操作。
而非模式对话框则无需这样,它不强制要求用户立即反应,而是与其他窗口同时接受用户操作。
二、消息响应的区别在消息响应方面,模式对话框和非模式对话框之间又有着很大的区别。
模式对话框工作的时候,它有内部的消息泵机制,控件之间的交互不用我们人为的去控制,系统会帮助我们去处理。
非模式对话框则像普通窗口一样,则由WinMain中书写的消息循环驱动。
但由于是对话框,它对一些消息有特殊的处理。
因此,在消息循环中,需要先对对话框提供截获消息的机会。
While (GetMessage(&msg, NULL, 0, 0)){if (hDlgModeless == 0 || !IsDialogMessage(hDlgModeless, &msg)){TranslateMessage(&msg);DispatchMessage( &msg);}}如果当前取得的消息是对话框的消息,IsDialogMessage 将它交由对话消息处理函数处理,并返回TRUE。
不需要再派发了。
注意:这个方法并不是很好用,因为当对话框过多的时候,处理起来就比较麻烦了。