MFC之模态与非模态对话框的创建与销毁
mfc模态对话框
mfc模态对话框Mfc模态对话框:创建模态对话框:【模态对话框:具有独占⾏为,必须由⽤户完成对当前对话框的响应,才能对本对话框所属的进程进⾏其他操作】例如:我们创建⼀个加法计算器。
点击计算之后,弹出⼀个对话框,当⽤户点击完确定之后。
才进⾏计算,如果点击取消,则不进⾏计算。
把上次那个反复敲⼏遍就会啦,我本⾝也是边做博客边在背。
写过⼀遍,就是⽐较有作⽤。
我懒了,就按照上⼀讲制作的东西接着往下写了。
以下正⽂:⼀、界⾯部分经常从下⾯这四个选项卡来回点点,要不每次我说的是啥你都不知道,,,开始我也不敢点。
笑哭。
右键Dialog点击插⼊2、发现两点变化:1、多出了⼀个东西,那必须是我们要求创建的对话框了2、主要操作界⾯⾥⾯也出了新的对话框界⾯。
/*bug2:继昨天的改名风波之后。
【不改名,就添加不了变量】这个作为⼀个提⽰对话框玲珑⼀些会⽐较好。
所以我们选中它把它变⼩。
从图像界⾯的右下⾓点击那个⼩⿊点⼉,往左上⽅拖拽。
发现确定没了,然后后来程序的运⾏就⽐较诡异了,各种东西的操作也不听使唤了。
所以跟紧我。
然后如果在看博客运⾏的同时发现了问题,欢迎评论讨论。
*/3、先把确定按钮,往左上⽅,放放省的被挤没了。
1)点击确定按钮,进⾏拖拽。
2)然后同时进⾏其他控件的调整。
3、添加⼀个静态⽂本进⾏提⽰:是否要进⾏计算呢?【这个上⼀讲说过啦,就不再写了】4、界⾯就好啦。
⼆、代码链接弹出对话框后,如此点击:给⼀个类名,这个名字的来源:c应该是取class的意思,tip提⽰嘛,dlg对话框的简写。
⼈品爆了。
笑哭之前创建之后,在这个IDD_DIALOG1下⾯都会报错误的。
也可能这次着急了没有改id导致没有报错。
总之这⾥报错与否都不影响我们继续往下进⾏。
有了对应的类,接下来,当我们按下按钮。
创建该对象的实例,然后得到当前对话框返回的按钮的值,从⽽决定是否进⾏操作。
所以,上⾯这句话就是就是算法了,【我眼中的算法,或许可以写点⼉什么,或许10年之后当我再次看到这个博⽂的时候可能感触⼜不⼀样了呢。
模态对话框和非模态对话框
模态对话框和⾮模态对话框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。
VC6.0 显示,关闭,销毁模态与非模态对话框技巧
VC6.0 显示,关闭,销毁模态与非模态对话框技巧一、显示对话框:1.显示模式对话框:CDialogDemo dlg;dlg.DoModal();2.显示非模式对话框:CDialogDemo *dlg=new CDialogDemo(this);dlg->Create(IDD_GENERAL_CONTROL);dlg->ShowWindow(SW_SHOW);二、关闭对话框:1.CDialog::OnOK();2.CDialog::DestoryWindow();3.CDialog::EndDialog(0);注:CDialog::CloseWindow(); 仅仅是最小化对话框PostMessage(WM_CLOSE)相关函数详解:CloseWindow函数功能:该函数最小化指定的窗口,但并不销毁该窗口。
函数原型:BOOL CloseWindow(HWND hWnd);参数:hWnd:将要最小化的窗口的句柄。
返回值:如果函数成功,返回值为非零;如果函数失败,返回值为零。
若想获得更多错误信息,请调用GetLastError函数。
备注:窗口尺寸被最小化成一个图标,并移动到屏幕的图标区域。
系统显示窗口的图标而不显示窗口,并在图标下显示窗口标题。
应用程序必须使用DestroyWindow函数销毁窗口。
DestroyWindow函数功能:销毁指定的窗口。
这个函数通过发送WM_DESTROY 消息和WM_NCDESTROY 消息使窗口无效并移除其键盘焦点。
这个函数还销毁窗口的菜单,清空线程的消息队列,销毁与窗口过程相关的定时器,解除窗口对剪贴板的拥有权,打断剪贴板器的查看链。
函数原型:BOOL DestroyWindow( HWND hWnd // handle to window to destroy);hWnd :将被销毁的窗口的句柄。
返回值:如果函数成功,返回值为非零:如果函数失败,返回值为零。
mfc创建对话框的基本步骤
mfc创建对话框的基本步骤创建MFC对话框的步骤如下:1. 新建MFC项目。
在创建项目时,选择visual c++选项卡,然后选择MFC。
在右侧选择MFC应用程序,并在下方填写项目名称。
2. 选择应用程序类型。
在创建项目的过程中,你需要选择应用程序类型。
你可以选择单文档或基于对话框的应用程序类型。
以基于对话框的应用程序为例。
3. 添加对话框。
右键点击“Resource Files”,然后选择“Add Resource”。
在弹出的对话框中,选择“Dialog”,然后点击“New”。
这将在资源视图中创建一个新的对话框。
4. 给新的对话框重写ID。
右键点击新创建的对话框,选择“属性”,在属性页中修改IDD为所需的ID,例如IDD_EXEC。
5. 为模态对话框添加类。
右键点击选中的对话框,然后选择“添加类”。
在弹出的对话框中,输入类的名称,然后点击“确定”。
这将为对话框创建一个新的类。
6. 添加控件。
在对话框编辑器中,你可以直接从工具箱里拖动控件到对话框上。
例如,你可以拖动按钮控件到对话框上。
7. 添加事件处理程序。
对于每个添加的控件,你都可以为其添加事件处理程序。
你可以通过右键点击控件,然后选择“添加事件处理程序”来添加事件处理程序。
在弹出的对话框中,选择相应的事件(例如单击事件),然后在右侧的代码编辑器中编写事件处理程序。
8. 运行对话框。
在完成对话框的编辑后,你可以运行对话框来测试其功能。
你可以通过点击工具栏上的“启动”按钮或按F5键来启动应用程序。
这些步骤可以帮助你创建一个基本的MFC对话框。
当然,具体的实现方式还需要根据你的需求进行调整和修改。
MFC中在一个对话框中弹出另一个对话框
在一个对话框中点按一个按钮弹出另外一个对话框。
弹出的对话框可以是模态和非模态两种,简单点讲,模态对话框就是在弹出的对话框没有关闭之前,是不能操作父对话框的。
非模态可以。
这里介绍建立模态对话框。
在建立的时候可以有两种形式,一种是直接新建,一种是将已有的对话框整合添加进来。
(我是在WinCE平台下。
也是类似MFC的)第一种方式:新建弹窗操作步骤首先按步骤建立一个简单的对话框,并添加按钮。
然后点击Dialog添加资源选择Dialog 新建此时会出现新建好的对话框,右击选择属性可以修改名称。
设计新建的对话框在对话框上右击选择添加类填写类名称,点击完成此时在解决方案资源管理器视图中就会有新建的类,源文件及头文件将这个头文件包含到主对话框的头文件中。
然后就是调用关系的产生,双击主窗口在中的按钮,添加相应的处理函数此时调试运行,点“刀”按钮,就会弹出设计好的刀的对话框。
当然,刀对话框中的设计就是走原来熟悉的路了。
另外一个键“剑” 也是同样的步骤。
这样弹出的对话框有个问题,就是感觉弹出的对话框缩放了,字体变小了。
在对话框上右击选择属性就可以看见设置字体的选项了,修改字体即可。
下来介绍第二种方式,添加现有的窗口。
第一步:同样按部就班的建立好基本工程。
编译一下(F7)第二步:拷贝文件首先在当前工程目录下新建一个文件夹用来存放原有工程源码需要拷贝下面选中的这几个文件。
拷贝到新建的这个文件夹下。
由于现有工程中有resource.h文件,所以需要提前改一下名称,相应的WifiConfig.rc文件中有调用到这个文件,所以也要修改。
用记事本打开.rc文件,将#include “Resource.h” 改为#include “Resource_2.h”(如果是准备新建文件夹来组织代码的话就可以不用改。
就像下面这样,其实可以不用改)将这几个文件拷贝到新建的文件夹下。
还需要将原有工程res目录下的图标拷贝到现在工程的res目录下第三步:添加文件到工程首先是资源文件添加现有项,找到WiFI2Uart目录下的.rc文件。
mfc对话框基础要点
第五章对话框对话框是一种用户界面,它的主要功能是输出信息和接收用户的输入。
对话框与控件是密不可分的,在每个对话框内一般都有一些控件,对话框依靠这些控件与用户进行交互。
一个典型的对话框例子是选择了File-Open命令后弹出的文件对话框。
5.1对话框和控件的基本概念5.1.1对话框的基本概念对话框(Dialog)实际上是一个窗口。
在MFC中,对话框的功能被封装在了CDialog类中,CDialog类是CWnd类的派生类。
对话框分为模态对话框和非模态对话框两种。
大部分读者都会有这样的经历,当你通过File-Open命令打开一个文件对话框后,再用鼠标去选择菜单将只会发出嘟嘟声,这是因为文件对话框是一个模态对话框。
模态对话框垄断了用户的输入,当一个模态对话框打开时,用户只能与该对话框进行交互,而其它用户界面对象收不到输入信息。
我们平时所遇到的大部分对话框都是模态对话框。
非模态对话框的典型例子是Windows95提供的写字板程序中的搜索对话框,搜索对话框不垄断用户的输入,打开搜索对话框后,仍可与其它用户界面对象进行交互,用户可以一边搜索,一边修改文章,这样就大大方便了使用。
本节主要介绍模态对话框,在第四节将介绍非模态对话框。
从MFC编程的角度来看,一个对话框由两部分组成:1.对话框模板资源。
对话框模板用于指定对话框的控件及其分布,Windows根据对话框模板来创建并显示对话框。
2.对话框类。
对话框类用来实现对话框的功能,由于对话框行使的功能各不相同,因此一般需要从CDialog类派生一个新类,以完成特定的功能。
5.1.2控件的基本概念图5.1对话框中的控件控件(Control)是独立的小部件,在对话框与用户的交互过程中,控件担任着主要角色。
控件的种类较多,图5.1显示了对话框中的一些基本的控件。
MFC的控件类封装了控件的功能,表5.1介绍了一些常用的控件及其对应的控件类。
表5.1控件实际上都是窗口,所有的控件类都是CWnd类的派生类。
模式对话框和非模式对话框
模式对话框和⾮模式对话框下是在百度空间中再录的内容:在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。
不需要再派发了。
注意:这个⽅法并不是很好⽤,因为当对话框过多的时候,处理起来就⽐较⿇烦了。
另⼀种处理的⽅法是利⽤⼦类化控件的⽅法,来处理控件间的交互。
三、销毁的区别模式对话框的销毁是使⽤EndDialog,⽽⾮模式对话框的销毁是使⽤DestroyWindow.。
所以我们在销毁对话框的时候,也要对其进⾏区别。
⾮模式对话框,⽤户关闭对话框时,对话框消息处理函数将收到WM_CLOSE消息,接到后调⽤DestroyWindow以销毁⾮模式对话框。
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 包括了来自菜单、加速键或工具栏按钮的消息。
VC显示关闭销毁模态与非模态对话框技巧
VC显示关闭销毁模态与非模态对话框技巧VC++是一种用于Windows平台开发应用程序的集成开发环境,用于构建图形用户界面和控制应用程序的行为。
在VC++中,对话框是一种常用的用户界面元素,可以用于显示和获取用户输入。
在使用对话框时,要注意对话框的显示、关闭和销毁。
1.显示对话框在VC++中,显示一个对话框可以通过以下几种方式实现:a. 使用DoModal函数DoModal函数是CDialog类的一个成员函数,用于显示对话框,并返回对话框的返回值。
例如,可以使用下面的代码显示一个对话框:CMyDialog dlg;dlg.DoModal(;b. 使用Create函数Create函数是CDialog类的另一个成员函数,用于创建对话框,并显示它。
使用Create函数时,需要先调用Create函数创建对话框,然后调用ShowWindow函数显示对话框。
以下是使用Create函数显示对话框的示例代码:CMyDialog dlg;dlg.Create(IDD_MYDIALOG);dlg.ShowWindow(SW_SHOW);c.使用模态对话框模态对话框是一种阻塞式对话框,显示模态对话框时,在对话框关闭之前,用户无法与其他应用程序进行交互。
要显示一个模态对话框,可以通过调用DoModal函数,并传递对话框的资源ID来实现。
以下是使用模态对话框的示例代码:CMyDialog dlg;INT_PTR nResponse = dlg.DoModal(;2.关闭对话框在VC++中,可以使用以下几种方式关闭对话框:a. 使用EndDialog函数EndDialog函数是CDialog类的一个成员函数,用于关闭对话框,并返回对话框的返回值。
以下是使用EndDialog函数关闭对话框的示例代码:OnOKEndDialog(IDOK);b.使用DestroyWindow函数DestroyWindow函数是CWnd类的一个成员函数,用于销毁窗口,并关闭对话框。
MFC 对话框编程 -- 总结
MFC 对话框编程 -- 总结一、创建对话框对象1.首先利用资源编辑器创建对话框资源,并针对该对话框资源定义一个对话框类:class CTestDlg : public CDialog2.创建话话框对象模态对话框的创建:如:CTestDlg dlg;dlg.DoModal();非模态对话框创建:如:CTestDlg dlg;dlg.Create(IDD_DIALOG, this);但这样是得不到一个正常显示的非模态对话框的。
因为模态与非模态对话框的实现方式并不相同,这里我们还要注意几点。
非模态对话框创建完成后是隐藏着的,必须调用ShowWindow来进行显示。
对于模态对话框,当执行到DoModal 函数以创建对话框时,程序会暂停执行,直至模态对话框关闭。
所以创建模态对话框可以采用局部对象。
但是,对于非模态对话框,当执行Create函数时并不会暂停执行,当执行到大括号"}后Dlg局部对象被销毁生命周期结束,于是异常出现了。
解决方法有两个:一、在View类中定义一个CTestDlg 成员变量。
二、动态创建一个CTestDlg 变量,并重写CTestDlg 类的 PostNcDestroy函数,在该函数里销毁对象 delete this;无论创建的是模态对话框,还是非模态对话框,当我们单击确定或取消按钮后对话框都会消失。
但这时低层的操作却是不同的。
对于模态对话框,此时对话框对象的确是被销毁了,但对于非模态对话框,这时只是隐藏起来不再显示。
这需要我们自己调用DestoryWindow函数来进行销毁工作。
这时我们必须重写 CTestDlg 的 OnOK 、 OnCancel 两个函数(这两个是基类CDialog的虚函数),在这两个函数内调用DestroyWindow函数,并注意不再调用基类CDialog相应的函数。
正确地创建非模态对话框的代码如下:CTestDlg *pDlg = new CTestDlg;pDlg->Create(IDD_DIALOG, this);pDlg->ShowWindow(SW_SHOW);同时,在CTestDlg 类的 PostNcDestroy函数中销毁对象:delete this;二、动态创建按钮1. 在对话框类CTestDlg 中定义一个 CButton 类对象,作为其成员变量。
MFC实验二 对话框程序设计
实验二对话框程序设计(一) 实验目的:1 学习如何创建对话框程序,并想其中添加控件。
2 学习如何使用对话框来打开和保存文件。
3 学习创建消息对话框。
在Windows程序中,对话框是最重要的显示信息和取得用户数据的单元;一个应用程序可以拥有几个对话框,这些对话框从用户那里接受特定类型的信息;可以使用资源编辑器创建对话框资源,向其中添加控件,调整对话框的布局,使对话框更加便于使用。
(二) 实验内容:应用实例创建一个基于对话框的应用程序,并添加文件菜单,用来打开和保存文件;建立消息对话框,用来提醒用户在退出前保存文件;同时建立一个属性页对话框,掌握其基本用法。
(三) 实验步骤:实验一:创建简单的对话框应用程序1.使用AppWizard创建一个基于对话框类型的程序Prog01。
在AppWizard的第一页选择“Dialog based” ,生成标准对话框模板。
2.可以设置对话框的属性,右键单击整个对话框的背景,选择“Properties”项,在弹出的对话框中修改此对话框ID为:IDD_PROG01_DIALOG,标题为:“简单计算器”。
当对话框资源完成以后,选择ctrl+w,打开ClassWizard,已经有一个类Prog01Dlg与新的对话框相联系。
3.在控件工作栏点击要添加的空间图标,选择所需的控件。
一共要添加三个静态文本框、三个编辑框、五个命令按钮。
可以改变空间的大小、位置、对齐方式等等。
4.添加控件结束后,设置各个控件的属性。
右键需要设置属性的控件,在弹出的菜单中选择Prperties,或选中控件按回车键。
各个控件的属性设置如下图。
下表列出了本题中所有控件的属性设置以及添加的成员变量:5.为控件添加相对应的成员变量。
执行xiew-class wizard命令或者Ctrl+w,选择member variables ,可以在对话框类中为控件添加关联的成员变量和删除变量。
以第一个编辑框为例,成员变量名为m_floatFirstNum,float型。
mfcdll显示非模态对话框问题(转)
mfcdll显示非模态对话框问题(转)
在mfc dll的InitInstance()方法中创建对话框实力并且进行显示,但是窗体会一闪而过,
CDLGTEST *dlg;
BOOL CTestApp::InitInstance()
{
dlg=new CDLGTEST;
dlg->Create(IDD_DIA_TEST);
dlg->ShowWindow(SW_SHOWNORMAL);
return CWinApp::InitInstance();
}
后来查阅资料说是得加入消息循环,代码如下:
CDLGTEST *dlg;
BOOL CTestApp::InitInstance()
{
dlg=new CDLGTEST;
dlg->Create(IDD_DIA_TEST);
dlg->ShowWindow(true);
while(::GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return CWinApp::InitInstance();
}
似乎问题还是解决不了,一闪而过的问题没了,但是这样下来被注入的程序(记事本无响应),注入程序也是无响应,有相应的只有IDD_DIA_TEST窗体,好像主线程进入了while后,一直在处理消息问题,后来用线程来处理消息循环,更是得不到消息信息,困扰几天的问题,实在解决不了了,还请师哥师姐们多多指点。
小弟万分感激。
谢谢。
模态、非模态 MFC 调用一个新的 对话框
调用一个新的对话框的方法注意:这里是插入窗体。
一、模态对话框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; // 这个记得放在析构函数里面}。
MFC模态对话框和非模态对话框
MFC模态对话框和非模态对话框
.
分类: MFC2011-08-31 15:5425518人阅读评论(17)收藏举报
mfcdialogdelete编程
MFC中对话框有两种形式,一个是模态对话框(model dialog box),一个是非模态对话框(modeless dialog box)。
若和上面一样的方式创建一个非模态对话框:
[cpp] view plaincopy
01. CTestDialog td;
02.td.Create(IDD_DIALOG1); //创建一个非模态对话框
03.td.ShowWindow(SW_SHOWNORMAL); //显示非模态对话框
最后在所在类的析构函数中收回pTD所指向的内存:
(2)采用成员变量创建一个非模态对话框
首先在你所要编写的类的头文件中声明一个指针变量:
[cpp] view plaincopy
01.private:
02. CTestDialog *pTD;
然后再在相应的CPP文件,在你要创建对话框的位置添加如下代码:
那么,在运行时,你会发现此对话框无法显示。这是因为你声明的对话框变量td是局部变量,但这个函数返回时,td也被析构了,所以无法显示此对话框。
创建非模态对话框,必须声明一个指向CTestDialog类的指针变量,且需要显示的调用ShowWindow()才能将对话框显示出来。有两种创建方法:
[cpp] view plaincopy
01.//创建一个模态对话框
02.CTestDialog td;
03.td.DoModal();
其中CTestDialog为我自己所新建和一个对话框资源相关联的对话框类。
mfc对话框使用
mfc对话框使用
MFC对话框是Windows编程中常用的GUI界面,它提供了一种方便快捷的方式来创建和
管理用户界面。
使用MFC对话框,可以轻松地添加控件、处理事件和响应用户操作。
创建MFC对话框的步骤很简单。
打开Visual Studio并创建一个新的MFC应用程序。
然后,选择“对话框”作为应用程序类型,并选择所需的对话框模板。
接下来,可以在对话框中添
加所需的控件,例如按钮、文本框、列表框等。
可以使用MFC框架提供的事件处理程序
来响应用户操作。
MFC对话框的优点在于它的易用性和灵活性。
通过使用MFC对话框,可以快速创建一个
功能完善的用户界面,同时还可以轻松地对其进行自定义和扩展。
MFC框架还提供了许
多有用的功能,例如自动布局、对话框管理和资源管理等。
MFC对话框是一种非常有用的工具,可以帮助Windows程序员快速创建和管理用户界面。
无论是初学者还是经验丰富的开发人员,都可以从MFC对话框的使用中受益。
[精华版]MFC中CWnd类及其派生类对话框、消息处理、窗口操作
MFC中CWnd类及其派生类对话框、消息处理、窗口操作CWnd类我们在屏幕上看到的所有对象都和窗口有关,它们或者派生于CWnd,属继承关系,如对话框、工具栏、状态栏、子控件;或者被CWnd合成,属服务员与服务对象关系,如图标、菜单、显示设备。
CWnd类封装的窗口操作主要包含窗口的创建和销毁、操作窗口风格、操作窗口状态、窗口子类化、获取指定窗口等。
当然,CWnd还实现了其他功能:1、绘制窗口GetDC()//取得客户区显示设备上下文GetWindowsDC()//取得整个窗口的显示设备上下文ReleaseDC()BeginPaint()EndPaint()PrintClient()RedrawWindow()//重绘客户区的某区域2、操作窗口子控件GetDlgItem():取得(临时的)控件对象指针SetDlgItemText()和GetDlgItemText():设置、取得控件标题SubclassDlgItem():将控件句柄与相应类相关联DlgDirList()和DlgDirListComboBox():以文件列表或目录列表填充(组合框)列表框CheckDlgButton()和CheckRadioButton():设置复选框(单选按钮)状态。
GetNextDlgTabItem():取得下一个WS_TABSTOP风格控件3、窗口定时器SetTimer():设置定时器KillTimer():销毁定时器4、窗口消息的相关函数GetCurrentMessage():取得当前被处理的消息PreTranslateMessage():可重载的虚函数。
被UI线程的消息循环调用,可以过滤窗口收到的消息,过滤出的消息得以分发SendMessage():向本窗口发送消息。
不通过消息循环,直接调用窗口函数处理消息。
窗口函数执行完毕,该函数才返回PostMessage():向本窗口寄送消息。
将消息放入消息队列,立即返回。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
的话,则把消息返回到WindowProc()函数,由它将消息发送给DefWindowProc()函数;
5、OnCommand() 该函数查看这是不是一个控件通知(lParam参数不为NULL,如果lParam参数为空的话,说明该消息不是控件通知),如果它是,OnCommand()函数会试图将消
======================================================================
MFC非模态窗口的创建过程:
1、PreCreateWindow() 该函数是一个重载函数,在窗口被创建前,可以在该重载函数中改变创建参数 (可以设置窗口风格等);
5、PostNcDestroy() 重载函数,作为处理OnNcDestroy()函数的最后动作被CWnd调用。
##############################################################################
附:MFC应用程序中处理消息的顺序
6、OnSetFont() 消息响应函数,响应WM_SETFONT消息,发送此消息,以允许改变对话框中控件的字体;
7、OnInitDialog() 源自 消息响应函数,响应WM_INITDIALOG消息,发送此消息以允许初始化对话框中的控件,或者是创建新控件;
8、OnShowWindow() 消息响应函数,响应WM_SHOWWINDOW消息,该函数被ShowWindow()函数调用;
8、OnMove() 消息响应函数,响应WM_MOVE消息,发送此消息说明窗口在移动;
9、OnChildNotify() 该函数为重载函数,作为部分消息映射被调用,告诉父窗口即将被告知一个窗口刚刚被创建。
MFC非模态窗口的关闭过程:
1、OnClose() 消息响应函数,响应窗口的WM_CLOSE消息,当关闭按钮被单击的时候发送此消息;
2、OnKillFocus() 消息响应函数,响应WM_KILLFOCUS消息,当一个窗口即将失去键盘输入焦点以前被发送;
3、OnDestroy() 消息响应函数,响应WM_DESTROY消息,当一个窗口即将被销毁时,被发送;
4、OnNcDestroy() 消息响应函数,响应WM_NCDESTROY消息,当一个窗口被销毁以后被发送;
4、OnWndMsg() 该函数的功能首先按字节对消息进行排序,对于WM_COMMAND消息,调用OnCommand()消息响应函数,对于WM_NOTIFY消息调用OnNotify()消息响应
函数。任何被遗漏的消息将是一个窗口消息。OnWndMsg()函数搜索类的消息映像,以找到一个能处理任何窗口消息的处理函数。如果OnWndMsg()函数不能找到这样的处理函数
一个框架类,则命令和通知消息也被传递到视图和文档类,并为该类寻找一个消息处理函数。
9、OnCtlColor() 消息响应函数,响应WM_CTLCOLOR消息,被父窗口发送已改变对话框或对话框上面控件的颜色;
10、OnChildNotify() 重载函数,作为WM_CTLCOLOR消息的结果发送。
MFC模态窗口的关闭过程:
1、OnClose() 消息响应函数,响应WM_CLOSE消息,当"关闭"按钮被单击的时候,该函数被调用;
2、OnDestroy() 消息响应函数,响应窗口的WM_DESTROY消息,当一个窗口将被销毁时,发送此消息;
3、OnNcDestroy() 消息响应函数,响应窗口的WM_NCDESTROY消息,当一个窗口被销毁后发送此消息;
4、PostNcDestroy() 重载函数,作为处理OnNcDestroy()函数的最后动作,被CWnd调用。
========================================================================
MFC模态窗口的创建过程:
1、DoModal() 重载函数,重载DoModal()成员函数;
2、PreSubclassWindow() 重载函数,允许首先子分类一个窗口;
息映射到制造通知的控件; 如果他不是一个控件通知(或者如果控件拒绝映射的消息)OnCommand()就会调用OnCmdMsg()函数;
6、OnCmdMsg() 根据接收消息的类,OnCmdMsg()函数将在一个称为命令传递(Command Routing)的过程中潜在的传递命令消息和控件通知。例如:如果拥有该窗口的类是
2、PreSubclassWindow() 这也是一个重载函数,允许首先子分类一个窗口;
3、OnGetMinMaxInfo() 该函数为消息响应函数,响应的是WM_GETMINMAXINFO消息,允许设置窗口的最大或者 最小尺寸;
4、OnNcCreate() 该函数也是一个消息响应函数,响应WM_NCCREATE消息,发送消息以告诉窗口的客户区即将被创建;
1、AfxWndProc() 该函数负责接收消息,找到消息所属的CWnd对象,然后调用AfxCallWndProc()函数;
2、AfxCallWndProc() 该函数负责保存消息(保存的内容主要是消息标识符和消息参数)供应用程序以后使用,然后调用WindowProc()函数;
3、WindowProc() 该函数负责发送消息到OnWndMsg()函数,如果未被处理,则调用DefWindowProc()函数;
5、OnNcCalcSize() 该函数也是消息响应函数,响应WM_NCCALCSIZE消息,作用是允许改变窗口客户区大小;
6、OnCreate() 该函数也是一个消息响应函数,响应WM_CREATE消息,发送消息告诉一个窗口已经被创建;
7、OnSize() 该函数也是一个消息响应函数,响应WM_SIZE消息,发送该消息以告诉该窗口大小已经发生变化;
微软指示:非模态对话框需要重载函数OnCanel,并且在这个函数中调用DestroyWindow,并且不能调用基类的OnCancel,因为基类的OnCancel调用了EndDialog这个函数,这个函数是针对模态对话框的。还有一个必须重载的函数就是PostNcDestroy,这也是一个虚函数,通常的非模态对话框是用类的指针,通过 new 动态创建的,这就需要在 PostNcDestroy 函数中 delete 掉这个指针!
3、OnCreate() 消息响应函数,响应WM_CREATE消息,发送此消息以告诉一个窗口已经被创建;
4、OnSize() 消息响应函数,响应WM_SIZE消息,发送此消息以告诉窗口大小发生变化;
5、OnMove() 消息响应函数,响应WM_MOVE消息,发送此消息,以告诉窗口正在移动;