模态对话框和非模态对话框的区别
模态对话框和非模态对话框
模态对话框和⾮模态对话框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入门到精通教程(155全部)
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#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属性:窗体的所有者当⼀个窗体归另⼀窗体所有时,它便随着所有者窗体最⼩化和关闭。
MFC 模态对话框的实现原理
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:用于从消息队列读取消息。
VC++ 课件 第05章 对话框和常用控件
5.2控件的创建和使用方法
5.2.1控件的创建方法 控件的创建方式有以下两种: 一种是在对话框模板中用编辑器指定控件,也就是说,将控件的父窗口指 定为对话框,这样做的好处是明显的,因为当应用程序启动该对话框时, Windows系统就会为对话框创建控件;而当对话框消失时,控件也随之清 除。 另一种方式是将控件看作是任一窗口的子窗口,并通过调用相应的Create 函数来创建。 [例Ex_SDIHello] 在上例Ex_SDIHello的基础上用子窗口方式创建控件。 (1)打开CMyDlg的头文件MyDlg.h,添加一个按钮类CButton指针变量: class CMyDlg : public CDialog { // Construction public: CMyDlg(CWnd* pParent = NULL); // standard constructor CButton *m_btnWnd; … }
5.1对话框的使用
在程序中使用对话框 (1)利用项目工作区的ClassView标签项,将Ex_SDIHello.cpp源文件打开; (2)在Ex_SDIHello.cpp源文件的前面加上包含类CMyDlg的头文件: #include "MyDlg.h" (3)在InitInstance函数体中的“return TRUE;”语句之前添加下列代码: CMyDlg dlg; dlg.DoModal(); DoModal是模态对话框最常用的函数,它负责对话框的显示和终止。 (4)编译并运行。在程序的一开始就出现用户自己设计的对话框,单击 [Button1]按钮将弹出“欢迎进入对话框的设计!”的消息对话框来。
5.1对话框的使用
5.1.2使用对话框编辑器
打开对话框编辑器
将项目工作区窗口切换到ResourceView页面,双击Dialog目录下任意一个对 话框ID。或者,选择“Insert”“Resource”菜单命令(或按快捷键Ctrl+R), 选择Dialog项,单击New。
VC非模态对话框创建和销毁 模态对话和非模态话框识别
0x0001 // window is enabled for tooltips 0x0002 // window is temporarily hidden 0x0004 // window should stay disabled 0x0008 // currently in modal loop 0x0010 // modal loop should continue running 0x0100 // some descendant is an OLE control 0x0400 // window is enabled for tracking tooltips
如果拥有该窗口的类是一个框架类则命令和通知消息也被传递到视图和文档类并为该类寻找一个消息处理函数mfc应用程序创建窗口的过程1precreatewindow该函数是一个重载函数在窗口被创建前可以在该重载函数中改变创建参数可以设置窗口风格等等2presubclasswindow这也是一个重载函数允许首先子分类一个窗口3ongetminmaxinfo该函数为消息响应函数响应的是wmgetminmaxinfo消息允许设置窗口的最大或者最小尺寸4onnccreate该函数也是一个消息响应函数响应wmnccreate消息发送消息以告诉窗口的客户区即将被创建5onnccalcsize该函数也是消息响应函数响应wmnccalcsize消息作用是允许改变窗口客户区大小6oncreate该函数也是一个消息响应函数响应wmcreate消息发送消息告诉一个窗口已经被创建7onsize该函数也是一个消息响应函数响应wmsize消息发送该消息以告诉该窗口大小已经发生变化8onmove消息响应函数响应wmmove消息发送此消息说明窗口在移动9onchildnotify该函数为重载函数作为部分消息映射被调用告诉父窗口即将被告知一个窗口刚刚被创建mfc应用程序关闭窗口的顺序非模态窗口1onclose消息响应函数响应窗口的wmclose消息当关闭按钮被单击的时候发送此消息2ondestroy消息响应函数响应窗口的wmdestroy消息当一个窗口将被销毁时发送此消息3onncdestroy消息响应函数响应窗口的wmncdestroy消息当一个窗口被销毁后发送此消息4postncdestroy重载函数作为处理onncdestroy函数的最后动作被cwnd调用mfc应用程序中打开模式对话框的函数调用顺序1domodal重载函数重载domodal成员函数2presubclasswindow重载函数允许首先子分类一个窗口3oncreate消息响应函数响应wmcreate消息发送此消息以告诉一个窗口已经被创建4onsize消息响应函数响应wmsize消息发送此消息以告诉窗口大小发生变化5onmove消息响应函数响应wmmove消息发送此消息以告诉窗口正在移动6onsetfont消息响应函数响应wmsetfont消息发送此消息以允许改变对话框中控件的字体7oninitdialog消息响应函数响应wminitdialog消息发送此消息以允许初始化对话框中的控件或
模态窗口
对话框一般分为两种类型:模态类型(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'>。
模态对话框ModalDialogBox
简化操作步骤
通过模态对话框,将登录或注册表单直接展示在当前页面, 用户无需跳转页面即可完成操作,提高用户体验。
引导用户关注
模态对话框的弹出效果能够吸引用户的注意力,引导用户 关注登录或注册流程,提高转化率。
灵活定制界面
模态对话框允许开发者自定义界面样式和内容,可以根据实际需 求调整登录或注册表单的布局和元素,提高用户体验和可用性。
浏览器兼容性处理
针对不同浏览器及其版本,采用相应的CSS前缀、JavaScript兼容性方案等,确保模态对话框在 各浏览器中的正常显示和功能。
移动端适配
使用移动端开发框架或组件库,如React Native、Weex等,实现模态对话框在移动端设备上的 良好体验。
04
模态对话框在Web应用中实 践
登录注册流程优化
交互设计技巧
引导用户关注
通过动画效果、颜色变化等 手段引导用户关注模态对话
框中的重要信息。
提供撤销操作
在对话框中提供撤销操作选 项,以便用户在做出选择后 能够撤销操作,减少误操作
的风险。
考虑无障碍访问
确保模态对话框符合无障碍 访问标准,以便所有用户都 能轻松使用。例如,为对话 框添加适当的aria标签和键盘 导航支持等。
感谢您的观看
THANKS
03
模态对话框实现技术
前端开发技术栈
HTML/CSS/JavaScript
构建模态对话框的基本结构和样式,实现交互功能。
React/Vue/Angular等前端框架
提供组件化开发方式,方便快速构建模态对话框组件。
UI组件库
如Ant Design、Element UI等,提供现成的模态对话框组件,可快速集成到项目中。
MFC对话框几个对话框程序例子建立对话框与相应程序相关联
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 包括了来自菜单、加速键或工具栏按钮的消息。
对话框及常用控件
统一的视觉风格
对话框的视觉风格应与应 用程序的整体风格保持一 致。
合适的色彩搭配
对话框的颜色搭配应符合 应用程序的主题和风格, 同时也要考虑色彩的对比 度和舒适度。
精美的图标和插图
对话框中可以适当地使用 图标和插图,以提高视觉 效果和用户体验。
一致性
对话框布局一致
不同对话框的布局和组件应保持一致,以提高用户对 应用程序的熟悉度和使用效率。
提示对话框
总结词
提供简短信息或警告的对话框
详细描述
提示对话框通常用于向用户显示应用程序的状态或提 供简短的通知。它包含一个标题、一条消息和一个关 闭按钮。根据需要,提示对话框还可以包含图标以强 调其重要性。
感谢观看
THANKS
按钮
总结词
用于触发特定功能的控件
详细描述
按钮是常见的交互控件,用户点击按钮后可以触发特定的功能或操作。根据功 能,按钮可分为确认、取消、提交等类型。
列表框
总结词
用于显示和选择列表项的控件
详细描述
列表框可以显示一系列的列表项,用户可以通过鼠标或键盘选择所需的列表项。根据选择方式,列表 框可分为单选列表框和多选列表框。
对话框的分类
模态对话框
模态对话框会阻塞用户对其他界面的 操作,直到对话框关闭。这类对话框 常用于需要用户做出决策或输入的情 况。
非模态对话框
非模态对话框不会阻塞用户对其他界 面的操作,用户可以在对话框打开的 同时进行其他操作。这类对话框常用 于显示信息或提供简单的选项。
对话框的使用场景
确认操作
01
复选框
总结词
用于表示选项是否被选中的控件
详细描述
复选框是一种开关控件,用户可以通过点击来选中或取消选中某个选项。多个复选框可 以组合在一起,表示多个选项的组合。Fra bibliotek单选按钮
