VS2010MFC编程入门之十一(对话框:模态对话框及其弹出过程)
- 格式:docx
- 大小:60.25 KB
- 文档页数:4
mfc模态对话框Mfc模态对话框:创建模态对话框:【模态对话框:具有独占⾏为,必须由⽤户完成对当前对话框的响应,才能对本对话框所属的进程进⾏其他操作】例如:我们创建⼀个加法计算器。
点击计算之后,弹出⼀个对话框,当⽤户点击完确定之后。
才进⾏计算,如果点击取消,则不进⾏计算。
把上次那个反复敲⼏遍就会啦,我本⾝也是边做博客边在背。
写过⼀遍,就是⽐较有作⽤。
我懒了,就按照上⼀讲制作的东西接着往下写了。
以下正⽂:⼀、界⾯部分经常从下⾯这四个选项卡来回点点,要不每次我说的是啥你都不知道,,,开始我也不敢点。
笑哭。
右键Dialog点击插⼊2、发现两点变化:1、多出了⼀个东西,那必须是我们要求创建的对话框了2、主要操作界⾯⾥⾯也出了新的对话框界⾯。
/*bug2:继昨天的改名风波之后。
【不改名,就添加不了变量】这个作为⼀个提⽰对话框玲珑⼀些会⽐较好。
所以我们选中它把它变⼩。
从图像界⾯的右下⾓点击那个⼩⿊点⼉,往左上⽅拖拽。
发现确定没了,然后后来程序的运⾏就⽐较诡异了,各种东西的操作也不听使唤了。
所以跟紧我。
然后如果在看博客运⾏的同时发现了问题,欢迎评论讨论。
*/3、先把确定按钮,往左上⽅,放放省的被挤没了。
1)点击确定按钮,进⾏拖拽。
2)然后同时进⾏其他控件的调整。
3、添加⼀个静态⽂本进⾏提⽰:是否要进⾏计算呢?【这个上⼀讲说过啦,就不再写了】4、界⾯就好啦。
⼆、代码链接弹出对话框后,如此点击:给⼀个类名,这个名字的来源:c应该是取class的意思,tip提⽰嘛,dlg对话框的简写。
⼈品爆了。
笑哭之前创建之后,在这个IDD_DIALOG1下⾯都会报错误的。
也可能这次着急了没有改id导致没有报错。
总之这⾥报错与否都不影响我们继续往下进⾏。
有了对应的类,接下来,当我们按下按钮。
创建该对象的实例,然后得到当前对话框返回的按钮的值,从⽽决定是否进⾏操作。
所以,上⾯这句话就是就是算法了,【我眼中的算法,或许可以写点⼉什么,或许10年之后当我再次看到这个博⽂的时候可能感触⼜不⼀样了呢。
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:用于从消息队列读取消息。
MFC入门--对话框实例(注意:例子程序使用Vc6.0开发实验时请用VS2010实现)实例1目的:设计一个基于对话框的程序,界面上有一个“延迟6秒”的按钮,点击后,程序主窗口在6秒内无法拖动。
关键点:MFC程序入门、线程与进程、消息机制操作过程:1-新建项目,选择MFC AppWizard (exe),命名项目为“SingleThread”。
如图:(注:关于各项目类型的说明,请参见文件“VC功能简介.ppt”的第8页)2-选择“Dialog based”,点击Finish,仔细观察项目信息。
3-在资源视图内对主对话框添加静态文本:“我的第一个MFC程序”和“演示耗时的单线程”,继而添加一个按钮,按钮现实文字“延迟6秒”,如图:4-在资源视图内,双击“延时6秒”按钮,为其添加BN_CLICKED消息(按下按钮时发出的消息)的响应函数OnButton1()。
在其中添加代码:Sleep(6000);请根据老师对程序的讲解,思考如下问题:1.类的继承:三个的类(CAboutDlg、CSingleThreadApp、CStringThreadDlg)的继承轨迹是怎样的?2.程序的入口在哪里?有没有类似Win32 Application中对于WM_CREATE的处理?3.三个类的对象的关系。
4.消息如何映射?实例2设计一个基于对话框的程序,开始运行后,每两秒弹出一个消息框。
关键点:MFC程序入门;定时器的建立、使用与删除;消息映射操作过程:1-新建项目,选择MFC AppWizard (exe),命名项目为“Test”。
2-选择“Dialog based”。
3-在BOOL CTestDlg::OnInitDialog()函数中添加SetTimer(1,2000,NULL); // 启动定时器4-通过ClassWizard给对话框添加WM_DESTROY的响应函数。
如图:在其中添加代码:KillTimer(1);5-通过ClassWizard给对话框添加WM_TIMER的响应函数。
在一个对话框中点按一个按钮弹出另外一个对话框。
弹出的对话框可以是模态和非模态两种,简单点讲,模态对话框就是在弹出的对话框没有关闭之前,是不能操作父对话框的。
非模态可以。
这里介绍建立模态对话框。
在建立的时候可以有两种形式,一种是直接新建,一种是将已有的对话框整合添加进来。
(我是在WinCE平台下。
也是类似MFC的)第一种方式:新建弹窗操作步骤首先按步骤建立一个简单的对话框,并添加按钮。
然后点击Dialog添加资源选择Dialog 新建此时会出现新建好的对话框,右击选择属性可以修改名称。
设计新建的对话框在对话框上右击选择添加类填写类名称,点击完成此时在解决方案资源管理器视图中就会有新建的类,源文件及头文件将这个头文件包含到主对话框的头文件中。
然后就是调用关系的产生,双击主窗口在中的按钮,添加相应的处理函数此时调试运行,点“刀”按钮,就会弹出设计好的刀的对话框。
当然,刀对话框中的设计就是走原来熟悉的路了。
另外一个键“剑” 也是同样的步骤。
这样弹出的对话框有个问题,就是感觉弹出的对话框缩放了,字体变小了。
在对话框上右击选择属性就可以看见设置字体的选项了,修改字体即可。
下来介绍第二种方式,添加现有的窗口。
第一步:同样按部就班的建立好基本工程。
编译一下(F7)第二步:拷贝文件首先在当前工程目录下新建一个文件夹用来存放原有工程源码需要拷贝下面选中的这几个文件。
拷贝到新建的这个文件夹下。
由于现有工程中有resource.h文件,所以需要提前改一下名称,相应的WifiConfig.rc文件中有调用到这个文件,所以也要修改。
用记事本打开.rc文件,将#include “Resource.h” 改为#include “Resource_2.h”(如果是准备新建文件夹来组织代码的话就可以不用改。
就像下面这样,其实可以不用改)将这几个文件拷贝到新建的文件夹下。
还需要将原有工程res目录下的图标拷贝到现在工程的res目录下第三步:添加文件到工程首先是资源文件添加现有项,找到WiFI2Uart目录下的.rc文件。
VS2010/MFC编程入门教程之目录第一部分:VS2010/MFC开发环境VS2010/MFC编程入门之前言VS2010/MFC编程入门之一(VS2010与MSDN安装过程图解)第二部分:VS2010-MFC应用程序框架VS2010/MFC编程入门之二(利用MFC向导生成单文档应用程序框架)VS2010/MFC编程入门之三(VS2010应用程序工程中文件的组成结构)VS2010/MFC编程入门之四(MFC应用程序框架分析)VS2010/MFC编程入门之五(MFC消息映射机制概述)第三部分:对话框VS2010/MFC编程入门之六(对话框:创建对话框模板和修改对话框属性)VS2010/MFC编程入门之七(对话框:为对话框添加控件)VS2010/MFC编程入门之八(对话框:创建对话框类和添加控件变量)VS2010/MFC编程入门之九(对话框:为控件添加消息处理函数)VS2010/MFC编程入门之十(对话框:设置对话框控件的Tab顺序)VS2010/MFC编程入门之十一(对话框:模态对话框及其弹出过程)VS2010/MFC编程入门之十二(对话框:非模态对话框的创建及显示)VS2010/MFC编程入门之十三(对话框:属性页对话框及相关类的介绍)VS2010/MFC编程入门之十四(对话框:向导对话框的创建及显示)VS2010/MFC编程入门之十五(对话框:一般属性页对话框的创建及显示)VS2010/MFC编程入门之十六(对话框:消息对话框)VS2010/MFC编程入门之十七(对话框:文件对话框)VS2010/MFC编程入门之十八(对话框:字体对话框)VS2010/MFC编程入门之十九(对话框:颜色对话框)第四部分:常用控件VS2010/MFC编程入门之二十(常用控件:静态文本框)VS2010/MFC编程入门之二十一(常用控件:编辑框Edit Control)VS2010/MFC编程入门之二十二(常用控件:按钮控件Button、Radio Button和Check Box)VS2010/MFC编程入门之二十三(常用控件:按钮控件的编程实例)VS2010/MFC编程入门之二十四(常用控件:列表框控件ListBox)VS2010/MFC编程入门之二十五(常用控件:组合框控件Combo Box)VS2010/MFC编程入门之二十六(常用控件:滚动条控件Scroll Bar)VS2010/MFC编程入门之二十七(常用控件:图片控件Picture Control)VS2010/MFC编程入门之二十八(常用控件:列表视图控件List Control 上)VS2010/MFC编程入门之二十九(常用控件:列表视图控件List Control 下)VS2010/MFC编程入门之三十(常用控件:树形控件Tree Control 上)VS2010/MFC编程入门之三十一(常用控件:树形控件Tree Control 下)VS2010/MFC编程入门之三十二(常用控件:标签控件Tab Control 上)VS2010/MFC编程入门之三十三(常用控件:标签控件Tab Control 下)第五部分:菜单、工具栏与状态栏VS2010/MFC编程入门之三十四(菜单:VS2010菜单资源详解)VS2010/MFC编程入门之三十五(菜单:菜单及CMenu类的使用)VS2010/MFC编程入门之三十六(工具栏:工具栏资源及CToolBar类)VS2010/MFC编程入门之三十七(工具栏:工具栏的创建、停靠与使用)VS2010/MFC编程入门之三十八(状态栏的使用详解)第六部分:文档、视图和框架VS2010/MFC编程入门之三十九(文档、视图和框架:概述)VS2010/MFC编程入门之四十(文档、视图和框架:各对象之间的关系)VS2010/MFC编程入门之四十一(文档、视图和框架:分割窗口)第七部分:MFC常用类VS2010/MFC编程入门之四十二(MFC常用类:CString类)VS2010/MFC编程入门之四十三(MFC常用类:CTime类和CTimeSpan类)VS2010/MFC编程入门之四十四(MFC常用类:定时器Timer)VS2010/MFC编程入门之四十五(MFC常用类:CFile文件操作类)VS2010/MFC编程入门之四十六(MFC常用类:MFC异常处理)第八部分:字体和文本输出VS2010/MFC编程入门之四十七(字体和文本输出:CFont字体类)VS2010/MFC编程入门之四十八(字体和文本输出:文本输出)第九部分:图形图像VS2010/MFC编程入门之四十九(图形图像:CDC类及其屏幕绘图函数)VS2010/MFC编程入门之五十(图形图像:GDI对象之画笔CPen)VS2010/MFC编程入门之五十一(图形图像:GDI对象之画刷CBrush)第十部分:Ribbon界面开发VS2010/MFC编程入门之五十二(Ribbon界面开发:创建Ribbon样式的应用程序框架)VS2010/MFC编程入门之五十三(Ribbon界面开发:为Ribbon Bar添加控件)VS2010/MFC编程入门之五十四(Ribbon界面开发:使用更多控件并为控件添加消息处理函数)VS2010/MFC编程入门之前言鸡啄米的C++编程入门系列给大家讲了C++的编程入门知识,大家对C++语言在语法和设计思想上应该有了一定的了解了。
MFC对话框的建立1.对话框在应用程序中的工作方式前已述及,文档类是应用程序存储数据的地方,而对话框是用户与应用程序之间信息交互的桥梁,那么,文档数据是怎样传递到对话框中,用户输入到对话框中的数据又是怎样反映到文档的呢?实际上,用户看到的对话框是一个读入或写出数据的图形界面对象,这一对象由集成开发环境中的对话框模板提供。
可以向模板添加各种控件(controls,如按钮,编辑框,单选复选按钮等),构成程序的对话框资源;应用程序要使用对话框还需定义一个CDialog派生类的对话框类与资源相连接,并在这个对话框类中定义一些成员变量与对话框中的控件相对应,提供对话框控件的缺省数据值,对话框类的函数成员负责对话框的打开与关闭、数据的传递等;程序运行时需要用到对话框时依据对话框资源激活对话框,接收用户输入后通过对话框类的成员函数更新文档类数据成员,如图3.17示。
MFC中,各种控件都有相应的类,如CEdit,CStatic,CButton,CListBox,CComboBox,它们都派生自CWnd类,因此,都继承了窗口类的所有函数;在对话框中,它们是对话框的子窗口。
2.对话框的种类Windows中有两种对话框,模态对话框和非模态对话框,构造两种对话框的大多数工作都相同,只是两者的显示和数据处理有些不同。
模态对话框(Modal Dialog Boxes)工作时使其父类窗口无效,直到对话框结束,也就是说,该对话框打开后,程序等待用户输入并关闭对话框后才执行其它任务。
例如Windows中常见的File|Open对话框,需用户选择一个文件打开或按取消按钮关闭对话框后程序才继续执行。
对系统而言,打开一个模态对话框相当于函数调用,只有当函数运行结束,从被调函数返回时,主调函数才能执行下一步。
调用DoModal函数可以显示模态对话框。
如:CMyDialog dlg;dlg.DoModal();DoModal返回用户按下的按钮ID值(如IDOK或IDCANCEL),按下OK或CANCEL按钮后,自动调用CDialog:EndDialog关闭对话框。
一、对话框1、对话框就是一个窗口,它不仅可以接收消息,还可以被移动或关闭,在它上面可以放置各种各样的标准控件和扩展控件。
提示:在MFC中,所有的控件类都是由CWnd类派生来的,因此,控件实际上也是窗口,控件通常是作为对话框的子窗口而创建的。
2、对话框的类型:(1)、模态对话框模态对话框是指当其显示时,程序会暂停执行,知道关闭这个模态对话框后,才能继续执行程序中其他任务。
(2)、非模态对话框非模态对话框显示时,允许转而执行程序中其他任务,而不用关闭这个对话框。
注意:单击OK按钮时,模态对话框和非模态对话框都会消失。
对于模态对话框而言,该对话框窗口对象被销毁,而对非模态对话框而言,对话框窗口对象并未被销毁,只是被隐藏了。
二、对话框的创建和显示1、新建一个MFC单文档工程Dlg2、新建对话框资源IDD_DIALOG1:Insert->Resource->选择”Dialog” ->单击”New”按钮3、为新建资源添加对应的类:View->ClassWizard->将类名取为”CTestDlg”,Base class选择CDialog->OK按钮提示:在MFC中,对资源的操作通常都是通过一个与资源相关的类来完成的。
对话框资源有一个相应的基类:CDialog。
4、在菜单栏中添加菜单项Dialog,其ID设置为IDM_DIALOG。
利用ClassWizard为该菜单项添加COMMAND命令消息响应函数。
其中Class name选择CDlgView。
5、上步会在DlgView源文件中生成void CDlgView::OnDialog()函数,在此函数中创建不同的对话框:(1)、创建模态对话框CTestDlg dlg; //记得添加#include "TestDlg.h"dlg.DoModal();//DoModal函数本身有显示模态对话框的作用(2)、创建非模态对话框,由于生命周期的原因,不能将对话框对象定义为局部变量,可以:ⅰ将dlg定义为全局变量dlg.Create(IDD_DIALOG1,this);dlg.ShowWindow(SW_SHOW);注意:此时必须重写ID为IDOK按钮的OnOK虚函数且不要再调用基类的OnOK函数,以免出错。
VS2010(MFC)编程--几种对话框VS2010/MFC编程:模态对话框及其弹出过程加法计算器对话框程序大家照着做一遍后,相信对基于对话框的程序有些了解了,有个好的开始对于以后的学习大有裨益。
趁热打铁,这一节讲讲什么是模态对话框和非模态对话框,以及模态对话框怎样弹出。
一.模态对话框和非模态对话框Windows对话框分为两类:模态对话框和非模态对话框。
模态对话框是这样的对话框,当它弹出后,本应用程序其他窗口将不再接受用户输入,只有该对话框响应用户输入,在对它进行相应操作退出后,其他窗口才能继续与用户交互。
非模态对话框则是,它弹出后,本程序其他窗口仍能响应用户输入。
非模态对话框一般用来显示提示信息等。
大家对Windows系统很了解,相信这两种对话框应该都遇到过。
之前的加法计算器对话框其实就是模态对话框。
二.模态对话框是怎样弹出的毕竟加法计算器程序大部分都是MFC自动生成的,对话框怎么弹出来的大家可能还不是很清楚。
下面简单说说它是在哪里弹出来的,再重新建一个新的对话框并弹出它,这样大家实践以后就能更灵活的使用模态对话框了。
大家打开Addition.cpp文件,可以看到CAdditionApp类有个InitInstance()函数,在MFC应用程序框架分析中提到过此函数,不过那是单文档应用程序App类中的,函数体不太相同,但都是进行App类实例的初始化工作。
InitInstance()函数的后半部分有一段代码就是定义对话框对象并弹出对话框的,下面给出这段代码并加以注释:C++代码弹出对话框比较关键的一个函数,就是对话框类的DoModal()函数。
CDialog::DoModal()函数的原型为:virtual INT_PTR DoModal();返回值:整数值,指定了传递给CDialog::EndDialog(该函数用于关闭对话框)的nResult 参数值。
如果函数不能创建对话框,则返回-1;如果出现其它错误,则返回IDABORT。
目录:目录: (1)一:字体对话框 (2)1:在点字体对话框的时候 (2)2:在On_Paint消息下 (3)二:颜色对话框 (3)1:在点颜色对话框的时候 (3)2:在On_Paint消息下 (3)三:文件对话框 (3)1:在点文件对话框(打开)的时候 (3)2:在On_Paint消息下 (4)3:在点文件对话框(保存)的时候 (4)四:List Control (5)1:初始化和删除(得到前台操ListControl的视图指针) (5)1)初始化 (5)2)删除 (5)2:数据库读取 (5)3:ListControl加载图标 (6)4:删除数据库的选定内容 (7)5:添加数据库的内容(以及自动排序ID) (7)6:更改数据库信息 (8)五:非模态弹出对话框 (9)六:MFC控件—打开网页/播放FLASH (9)1:打开网页或弹出一个任意的新程序 (9)2:播放FLASH (9)七:实现可扩大可变小的对话框 (10)八:菜单加载位图和状态栏显示时间 (11)九:目录树TreeControl (11)1:目录树属性 (11)2:常用函数(目录树前台操作指针) (11)十:属性表单 (12)十一:滚动条 (12)1:SliderControl (12)2:Horizontal Scroll Bar和Vertical Scroll Bar (13)十二:DLL连接库 (13)1:静态连接 (13)2:动态连接 (14)十三:读出/写入INI配置文件 (15)1:写入 (15)2:读出 (15)十四:对话框可大可小”>>”和“<<” (16)十五:windows窗口下显示对话框 (17)一百:常用方法 (17)1:右键弹出菜单 (17)2:获得控件信息(文本内容,选择哪一个...) (17)1) ListBox (17)2) ConboBox (18)3) Edit (18)3:获得鼠标位置 (18)4:加载图片 (18)5:对话框刷新回刷 (18)6:获取列表(ListControl)行数 (18)7:MessBox (19)8:隐藏对话框 (19)9:改变窗口位置/大小 (19)10:获取窗口大小/位置CRect存储 (19)11:记录系统时间 (19)12:关闭对话框 (19)13:加载音乐(仅支持.wav格式音乐) (20)14:非模态弹出对话框在别的类中定义的类指针需强转 (20)15:格式化字符串 (20)16:释放句柄/DC (20)17:退出单文档对话框 (20)18:通过对话框的ID号获得所对应的句柄 (20)一:字体对话框:1:在点字体对话框的时候void CMess::On32781(){//弹出字体对话框CFontDialog dlg;if(IDOK==dlg.DoModal()){LOGFONT Font ;//定义存储字体的结构体//获得当前设置的字体信息dlg.GetCurrentFont(&Font);//通过字体信息来创建字体句柄m_hFont=CreateFontIndirect(&Font);}this->Invalidate();}2:在On_Paint消息下dc.SelectObject(m_hFont);二:颜色对话框1:在点颜色对话框的时候void CnewDialog2::On32774(){// 当点文件----颜色对话框的时候CColorDialog dlg;if(IDOK==dlg.DoModal()){m_Color=dlg.GetColor();//获取笔的颜色 m_Color为COLORREF类型,用来记录画笔颜色}this->Invalidate();}2:在On_Paint消息下dc.SetTextColor(m_Color);//改变文本颜色三:文件对话框1:在点文件对话框(打开)的时候void CnewDialog2::On32776(){// 当点文件----文件对话框打开的时候CFileDialog dlg(TRUE,NULL,NULL,OFN_READONLY,"图片文件(*.bmp)|*.bmp||");//一参:true为读入,二参文件扩展名,三参文件名,四参文件属性可写/可读,五参过滤器if(IDOK==dlg.DoModal()){CString strImage;//用来储存读入图片的名字strImage.Empty();//清空字符串strImage=dlg.GetFileName();//获取读入文件的名字if(m_Bitmap!=NULL){//当存储读入图片的文图句柄不为空,先删除DeleteObject(m_Bitmap);//删除已有的位图}m_Bitmap=(HBITMAP)LoadImage(NULL,strImage,IMAGE_BITMAP,0,0,LR_LOADFROMFILE) ;//加载位图}this->Invalidate();}2:在On_Paint消息下((CStatic*)GetDlgItem(IDC_TuPian))->ModifyStyle(1,SS_BITMAP);//改变风格,1可以移除;0不可以移除IDC_TuPian为Static Text的ID 因为它为静态工具,ID必须更改((CStatic*)GetDlgItem(IDC_TuPian))->SetBitmap(m_Bitmap);//在Static Text中加载图片3:在点文件对话框(保存)的时候void CnewDialog2::On32777(){// 当点文件----文件对话框保存的时候CFileDialog dlg(FALSE,"BMP",NULL,OFN_OVERWRITEPROMPT,"ALLFiles(.bmp)|*.bmp||");//一参:true为读入,二参文件扩展名,三参文件名,四参文件属性可写/可读,五参过滤器if(IDOK==dlg.DoModal()){CString str=dlg.GetFileName();//用来储存保存时打进的文件名m_Image.Save(str);//储存文件}}注:CImage是储存图片的类,它包含在头文件"atlimage.h"下Cimage m_Image;而且在用m_Image储存文件之前,必须先给m_Image.Load(文件名),读入要储存的文件!四:List Control1:初始化和删除(得到前台操ListControl的视图指针)1)初始化建一个---基于对话框的项目---然后再建一个ListControl工具----定义一个变量m_ListCtr m_ListCtr.InsertColumn(0,"名字");//插入列m_ListCtr.InsertColumn(1,"大小");m_ListCtr.InsertColumn(2,"内存");m_ListCtr.InsertColumn(3,"备注");for(int i=0;i<6;i++){m_ListCtr.SetColumnWidth(i,80);//改变列之间的宽度}m_ListCtr.InsertItem(0,"");//插入行m_ListCtr.SetItemText(0,0,"C盘");//改变行的内容m_ListCtr.SetItemText(0,1,"1G");m_ListCtr.SetItemText(0,2,"22G");m_ListCtr.SetItemText(0,3,"哦拉拉");//改变属性View为Report(详细列表)时的扩展属性LVS_EX_FULLROWSELECT使点取时全行选中,LVS_EX_GRIDLINES使列表中带有灰色的线m_ListCtr.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);2)删除// 当双击内容信息的时候LPNMLISTVIEW pNMLV=(NMLISTVIEW*)pNMHDR; //得到前台操作ListCantrol的视图指针if(pNMLV->iItem!=-1){//当点取正确的信息的时候if(IDOK==MessageBox("是否删除?","信息",MB_OKCANCEL)){m_ListCtr.DeleteItem(pNMLV->iItem);//删除你点选的内容//m_ListCtr.DeleteAllItems();//删除所有的内容}}2:数据库读取1)连接接口头文件:#include “afxdao.h”2)创建两个类变量,用来开启数据库,保存数据库记录(内容)CDaoDatabase * m_pData;//数据库对象指针CDaoRecordset * m_pRec;//记录集指针char m_path[255];//存数数据库名字的缓冲区3)在初始化中加载数据库//1给数据库对象指针分配空间m_pData = new CDaoDatabase();//2获得数据库的路径GetCurrentDirectory(255,m_path);strcat(m_path,"\\db1.mdb");//3打开数据库m_pData->Open(m_path);//4创建记录集指针m_pRec =new CDaoRecordset(m_pData);//5打开数据库中的表,select *from 后面接的是要打开的表的名字m_pRec->Open(dbOpenDynaset,"select * from 信息");//6获得记录集中的字段(列)个数int col=m_pRec->GetFieldCount();//7获取记录集中的字段内容以及给ListControl增加列CDaoFieldInfo info;//存储字段信息的类for(int i=0;i<col;i++){m_pRec->GetFieldInfo(i,info);//获取记录集中的列内容m_ListCtr.InsertColumn(i,info.m_strName);//往ListControl中添加列m_ListCtr.SetColumnWidth(i,80);//改变列宽度}//8获取记录集中的内容以及给ListControl添加内容int Item=0;//用来代表行号COleVariant var;//储存记录集中的内容的类while(!m_pRec->IsEOF()){//判断表中指向的一行是否为空//只要表不为空就增加一行从而添加内容,三参代表从图片列表中选图片m_ListCtr.InsertItem(Item,"",Item%4);for(int i=0;i<col;i++){m_pRec->GetFieldValue(i,var);//获取记录集指针指向的内容m_ListCtr.SetItemText(Item,i,(char *)var.pbstrVal);//改变ListControl的行内容}m_pRec->MoveNext();//把记录集指针指向下一行内容Item++;}m_ListCtr.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);//改变ListControl的风格--全行选中和带有灰色的格3:ListControl加载图标1)先定义图片列表CImageList m_BigImage;//存储大图片列表CImageList m_SmallImage;//存储小图片列表2)再在初始化的时候构造图片列表//一二参每块图片大小,三参图片颜色ILC_COLOR24为真彩色,ILC_MASK为过滤颜色,四五参代表图片分几块m_BigImage.Create(32,32,ILC_COLOR24|ILC_MASK,4,4);//创建一个大图片列表CBitmap hBigBit;//位图句柄,用来加载图片再存入大图片列表中hBigBit.LoadBitmap(IDB_BITMAP1);//加载大图片到位图中m_BigImage.Add(&hBigBit,RGB(0,255,0));//把加载好的位图加载到图片列表中m_ListCtr.SetImageList(&m_BigImage,LVSIL_NORMAL);//把图片列表与ListControl绑定m_SmallImage.Create(16,16,ILC_COLOR24|ILC_MASK,4,4);//创建一个小图片列表CBitmap hSmallBit;//位图句柄,用来加载图片再存入小图片列表中hSmallBit.LoadBitmap(IDB_BITMAP2);//加载小图片到位图中m_SmallImage.Add(&hSmallBit,RGB(0,255,0));//把加载好的位图加载到图片列表中m_ListCtr.SetImageList(&m_SmallImage,LVSIL_SMALL);//把图片列表与ListControl绑定注:在使用图标的时候只要插入行的时候添加三参为图片索引号,从0开始,最大数必须小于图片列表图片数m_ListCtr.InsertItem(0,"",0);4:删除数据库的选定内容m_pRec->MoveFirst();//把记录集指针指向头部m_pRec->Move(m_Item);//移动到想删除的记录那里,m_Item为鼠标点取的行数m_pRec->Delete();//删除数据库中的这条记录m_ListCtr.DeleteItem(m_Item);//删除你点选的内容5:添加数据库的内容(以及自动排序ID)CnewDialog dlg;int Items;//存储行数char buf[30];//用来存储IDif(IDOK==dlg.DoModal()){//当点添加的时候Items=m_ListCtr.GetItemCount();//获取行数m_ListCtr.InsertItem(Items,"",Items%4);//增加行CString str=m_ListCtr.GetItemText(Items-1,0);//获取信息最后一行的IDstr=str.Right(4);//获取ID的右面四个字符int num=atoi(str)+1;//把ID的右面的四个字符强转为int型sprintf(buf,"BL%d",num); //以上为自动排序ID号m_ListCtr.SetItemText(Items,0,buf);m_ListCtr.SetItemText(Items,1,dlg.m_ZhongZu);m_ListCtr.SetItemText(Items,2,dlg.m_EditDengJi);if(dlg.m_RaXingBie==0){m_ListCtr.SetItemText(Items,3,"男");}else if(dlg.m_RaXingBie==1){m_ListCtr.SetItemText(Items,3,"女");}m_ListCtr.SetItemText(Items,4,dlg.m_EditAiHao);//添加ListConntrol信息m_pRec->MoveFirst();//把记录集指针移到头部m_pRec->MoveLast();//把记录集指针移到尾部m_pRec->AddNew();//添加一条新数据m_pRec->SetFieldValue(0,buf); //改变数据信息m_pRec->SetFieldValue(1,(LPCTSTR)dlg.m_ZhongZu); //需强转m_pRec->SetFieldValue(2,(LPCTSTR)dlg.m_EditDengJi);if(dlg.m_RaXingBie==0){m_pRec->SetFieldValue(3,"男");}else if(dlg.m_RaXingBie==1){m_pRec->SetFieldValue(3,"女");}m_pRec->SetFieldValue(4,(LPCTSTR)dlg.m_EditAiHao);m_pRec->Update();//更新6:更改数据库信息CnewDialog2 dlg;if(m_Item!=-1){CString DengJi=m_ListCtr.GetItemText(m_Item,2);dlg.m_EditDengJi=DengJi;CString XingBie=m_ListCtr.GetItemText(m_Item,3);if(XingBie=="男"){dlg.m_RaXingBie=0;}else if(XingBie=="女"){dlg.m_RaXingBie=1;}CString AiHao=m_ListCtr.GetItemText(m_Item,4);dlg.m_EditAiHao=AiHao;if(IDOK==dlg.DoModal()){m_ListCtr.SetItemText(m_Item,1,dlg.m_ZhongZu);m_ListCtr.SetItemText(m_Item,2,dlg.m_EditDengJi);if(dlg.m_RaXingBie==0){m_ListCtr.SetItemText(m_Item,3,"男");}else if(dlg.m_RaXingBie==1){m_ListCtr.SetItemText(m_Item,3,"女");}m_ListCtr.SetItemText(m_Item,4,dlg.m_EditAiHao);//添加ListConntrol信息m_pRec->MoveFirst();m_pRec->Move(m_Item);m_pRec->Edit();//该条数据可以编辑m_pRec->SetFieldValue(1,(LPCTSTR)dlg.m_ZhongZu);m_pRec->SetFieldValue(2,(LPCTSTR)dlg.m_EditDengJi);if(dlg.m_RaXingBie==0){m_pRec->SetFieldValue(3,"男");}else if(dlg.m_RaXingBie==1){m_pRec->SetFieldValue(3,"女");}m_pRec->SetFieldValue(4,(LPCTSTR)dlg.m_EditAiHao);m_pRec->Update();//更新}}else{MessageBox("请选择正确信息");}五:非模态弹出对话框CDialog * m_dlg;//非模态对话框//建立非模态对话框m_dlg = new CnewDialog2;m_dlg->Create(IDD_DIALOG2);m_dlg->ShowWindow(SW_SHOW);//this->EndDialog(1);关闭本类中的对话框六:MFC控件—打开网页/播放FLASH1:打开网页或弹出一个任意的新程序在对话框中,插入ActiveX控件Microsoft Web浏览器控件1)基于对话框打开添加变量m_Webm_Wed.Navigate("",NULL,NULL,NULL,NULL);//加载网站m_Wed.Navigate("C:\\Documents and Settings\\Administrator\\桌面\\MFC函数----对话框.doc",NULL,NULL,NULL,NULL);//加载文档2)新弹出一个程序ShellExecute(this->m_hWnd,"open","C:\\Documents and Settings\\Administrator\\桌面\\新建文本文档.txt","","",SW_SHOW);//弹出一个新程序2:播放FLASHShockwava Flash Object 控件在播放FLASH中,关于按钮有事件处理On(release){Fsconmand(“名字”,“功能标示”);}在Shockwava Flash Object事件处理中,PsCommand下If(strcmp(command,”名字”)==0){If(strcmp(args,”功能标示”)==0){}}七:实现可扩大可变小的对话框1:在对话框初始化的时候得到窗口小的时候大小和大的时候的大小,用CRect m_BigRec t和Crect SmallRect存放, Picture Control的变量 m_Pcthis->GetWindowRect(m_BigRect);//获取对话框最大化时的大小CRect m_Fen;//用来存放分割线的位置m_Pc.GetWindowRect(m_Fen);//获取分割线的位置m_SmallRect.left=m_BigRect.left; //得到小窗口时的大小m_SmallRect.right=m_BigRect.right;m_SmallRect.top=m_BigRect.top;m_SmallRect.bottom=m_Fen.bottom;this->SetWindowPos(NULL,0,0,m_SmallRect.Width(),m_SmallRect.Height(), SWP_NOZORDER |SWP_NOMOVE ); //改变窗口的大小//SWP_NOZORDER为第一个参数无效SWP_NOMOVE 为二三参数无效2:当点一个Cbutton的时候来改变窗口大小void CnewDialog::OnBnClickedCancel2(){// 当点>>的时候CString str; //用来存放点取Botton时它的名字((CButton*)GetDlgItem(IDCANCEL2))->GetWindowText(str);if(str==">>"){this->SetWindowPos(NULL,0,0,m_BigRect.Width(),m_BigRect.Height(), SWP_NOZORDER |SWP_NOMOVE ); //改变窗口的大小//改变窗口的大小GetDlgItem获取ID所对应控件的句柄, SetWindowText改变该Button 的名字,GetWindowText获得该Button的名字((CButton*)GetDlgItem(IDCANCEL2))->SetWindowText("<<");}else if(str=="<<"){this->SetWindowPos(NULL,0,0,m_SmallRect.Width(),m_SmallRect.Height(),SWP_NOZORDER |SWP_NOMOVE );((CButton*)GetDlgItem(IDCANCEL2))->SetWindowText(">>");}}八:菜单加载位图和状态栏显示时间1:在框架类初始化的时候CMenu m_wndMenu;//菜单句柄m_wndMenu.LoadMenu(IDR_MENU1);//加载菜单SetMenu(&m_wndMenu);//改变菜单CBitmap bit;//位图句柄bit.LoadBitmap(IDB_BITMAP1);//加载位图m_wndMenu.GetSubMenu(0)->SetMenuItemBitmaps(0,MF_BYPOSITION,&bit,&bit);//改变菜单位图bit.Detach();//把位图变量和资源分开SetTimer(1,1000,NULL);//定义一个计数器,用来刷新窗口,为了更新状态栏时间变化2:在定时器发送的OnTimer消息下if(nIDEvent==1){CTime t=CTime::GetCurrentTime();//获取计算机时间CString str;//字符串str=t.Format("%H:%M:%S");//格式化m_wndStatusBar.SetPaneInfo(0,0,0,120);//改变状态栏1宽度m_wndStatusBar.SetPaneText(0,str);//改变状态栏文本内容}九:目录树TreeControl1:目录树属性Has Buttons //父级旁边是否显示+/-按钮Has Lines//是否显示行结构的虚线Lines At Root //根节点是否含有+/-按钮2:常用函数(目录树前台操作指针)1)消息中:TVN_SELCHANGED//当点击目录树内容的时候2)LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR); //前台操作指针pNMTreeView->itemNew存储了新点击的节点的所有信息itemNew为当前点击的目录树,itemOld为先前点的目录树3)str=m_TreeCtr.GetItemText(pNMTreeView->itemNew.hItem); //获取目录树文本4)HTREEITEM Root1 = m_TreeCtr.InsertItem("数据库",0,0,TVI_ROOT,TVI_LAST);m_TreeCtr.InsertItem("数据库1",1,1,Root1,TVI_LAST); //添加目录树文本TVI_ROOT为树的根,如果那个位置传入的是另一个树返回的HIREEITEM那么该节点为另一个树的字节点二三参传入的是图片,必须先定义好图片列表,二参为没选中时的图标,三参为选中后的图标,目录树选入的是小图标十:属性表单1)添加类---MFC---MFC类---基类:CpropertySheet(例如类名:CproSheet)新建对话框选Dialog---IDD_PROPPAGE_LARGE资源类型2)添加好属性表单后再添加属性页!新建两个资源类型为IDD_PROPPAGE_LARGE的对话框和对应的基类为CpropertyPage的类(例如类名:Cpage1,Cpage2)3)在总对话框中,声明三个类的指针(需包含对应类的头文件)CProSheet * m_pSheet;//属性表单CPage1 * m_pPage1;//属性页1CPage2 * m_pPage2;//属性页24)在初始化中建立属性表单,必须先添加页之后才能建立属性表单m_pPage1 = new CPage1; //建立属性页1m_pPage2 = new CPage2; //建立属性页2m_pSheet = new CProSheet("属性表单名称");m_pSheet->AddPage(m_pPage1); //添加属性页1到属性表单中m_pSheet->AddPage(m_pPage2); //添加属性页2到属性表单中m_pSheet->Create(this,WS_CHILD|WS_VISIBLE);//创建属性表单,传二参可以使属性表单负载在总对话框上WS_CHILD为子窗口,WS_VISIBLE为可见的注:m_pPage1->(可以调出关于属性页的相关变量和函数);为了实现属性页的其他功能十一:滚动条注:消息中,HSCROLL是滚动条水平移动时发出的消息,VSCROLL是滚动条垂直移动时发出的消息!void CSliderDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)在这两个消息中,CScrollBar* pScrollBar代表点取的哪个滚动条.UINT nSBCode存放着附加消息------SB_THUMBTRACK---响应滚动条拖动的消息;SB_LINEDOWN---向下;SB_LINEUP---向上;SB_LINERIGHT---向右; SB_LINELEFT---向左;SB_PAGEDOWN---按滚动条的中下位置;SB_PAGEUP---按滚动条的中上位置.UINT nPos存放滚动条所对应的值.1:SliderControlm_SliderCtr.SetRange(0,2000);//设置滚动条的范围m_SliderCtr.SetPos(0);//设置滚动条初始化位置//在滚动条移动时的函数下{void CSliderDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)}CScrollBar* bar= (CScrollBar*)&m_SliderCtr;if(bar==pScrollBar){ //当点的滚动条等于bar时int pos=m_SliderCtr.GetPos();//获取滚动条所对应的值char buf[20];sprintf(buf,"%d",pos);SetWindowText(buf);}2:Horizontal Scroll Bar和Vertical Scroll Barm_HScroll.SetScrollRange(0,2000);//设置滚动条的范围m_HScroll.SetScrollPos(0);//设置滚动条的初始化位置//在滚动条移动时的函数下{void CSliderDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)}if(&m_HScroll==pScrollBar){//当点的滚动条是m_HScroll的时候switch(nSBCode){case SB_THUMBTRACK://响应滚动条拖动的消息m_HScroll.SetScrollPos(nPos);//改变滚动条所对应的位置break;case SB_LINELEFT:nPos = m_HScroll.GetScrollPos();//每次都要先获得滚动条位置nPos--;//再改变滚动条位置m_HScroll.SetScrollPos(nPos);//改变滚动条所对应的位置break;}十二:DLL连接库解析:先创建win32控制台项目,选择DLL文件,空项目,创建!1:静态连接1)创建Dll.h头文件:#ifdef DLL_API //如果定义了DLL_API的话#else#define DLL_API extern "C" _declspec(dllimport) //导入库文件#endifDLL_API int add(int x,int y);//自己写的方法,格式:DLL_API + 方法2)创建Dll.cpp文件,实现定义的方法#define DLL_API extern "C" _declspec(dllexport)//导出库文件#include "Dll.h"DLL_API int add(int a,int b){return a+b;}3)把头文件拷贝到调用Dll文件的跟目录下然后引用#include "头文件名称.h"4)使用静态连接库,需把.dll文件和.lib文件全部拷贝到调用Dll文件中函数的跟目录下方法一:项目---属性---链接器---输入---附加依赖项---添加上Dll静态.lib文件方法二:#pragma comment (lib,"Dll静态.lib");5)直接调用.dll中的方法int ddd=add(20,10);2:动态连接1)创建Dll.h头文件:#ifdef DLL_API //如果定义了DLL_API的话#else#define DLL_API extern "C" _declspec(dllimport) //导入库文件#endifDLL_API int add(int x,int y);//自己写的方法,格式:DLL_API + 方法2)创建Dll.cpp文件,实现定义的方法#define DLL_API extern "C" _declspec(dllexport)//导出库文件#include "Dll.h"DLL_API int add(int a,int b){return a+b;}3)添加模块定义文件=>原文件---添加新项---代码---模块定义文件LIBRARY Dll动态//库文件名为Dll动态EXPORTS//导出多个函数add @1//导出函数add 标号可以自己定义从1开始前面加@ 下一个为 @2 或者系统默然可不加4)在调用该函数的地方,获取库文件的函数(需把库文件.Dll拷贝调用文件的根目录下)//1:加载DLL文件HINSTANCE hInst = LoadLibrary("Dll动态.dll");//2:为了得到dll中函数,要定义一个与dll文件中函数相同类型的函数指针//注:1)返回值为地址的函数称为指针函数 2)指向函数名字的一个指针称为函数指针typedef int (*Add) (int ,int);//定义一个函数指针Add aaa = (Add) GetProcAddress(hInst,"add");//获取库文件中名为add的函数,获取的add必须与Add类型相同,如果int (*Add) (int,int)这么定义函数指针,那么能获取库文件中的函数类型必须也为int 函数名(int a,int b){---};此类型int sun = aaa(20,10); //调用库文件中函数FreeLibrary(hInst);//释放动态连接库十三:读出/写入INI配置文件注:配置文件要自己先创建一个!1:写入CString StuKeyName,StuName;//用来储存Key值和存储名字int count=0;for(int i=0;i<6;i++){StuKeyName.Format("Name%d",i);StuName.Format("学生%d",i);::WritePrivateProfileString("StudentName",//总标示StuKeyName,//Key值StuName,//Key所对的具体内容".\\Student.ini");//文件名字count++;}CString strCount;strCount.Format("%d",count);//格式化::WritePrivateProfileString("StudentNum","Count",strCount,".\\Student.ini"); 2:读出int Count=::GetPrivateProfileInt(//从int文件中读取数量的信息"StudentNum",//总标示"Count",//Key值0,//默认为0".\\Student.ini");//文件名字//从Student.ini文件中读出标示为StudentNum中Key为Count所对应的数量信息CString StuKeyName,StuName;//用来储存Key值和存储名字的缓冲区for(int i=0;i<Count;i++){StuKeyName.Format("Name%d",i);::GetPrivateProfileString(//从int文件中读取字符串信息"StudengName",//总标示StuKeyName,//键值NULL,//默认为NULLStuName.GetBuffer(28),//存储具体字符串的缓冲区28,//缓冲区大小".\\Student.ini");//文件名字//从Student.ini文件中读出标示为StudengName中Key值为StuKeyName的所对应字符串信息m_ListBox1.AddString(StuName);//为了证明读出,把读出的东西写入ListBox控件中}十四:对话框可大可小”>>”和“<<”1步:添加对话框资源----分割线Picture Control (它支持图像:属性—Type—Image)制作分割线:把Color属性改为Etched2步:创建好对话框后添加类注:对话框类中DDX中存储变量、控件把菜单(关于对话框)与对话框结合---在点菜单消息处理中定义建好的对话框对象Dialog dlig;dlg.DoModal();弹出对话框3步:添加对话框的消息处理函数分析当点“>>”时窗口增大,应知道大窗口的大小和小窗口的大小解析:先定义存储对话框大小的变量CRect m_BigRect;CRect m_SmallRect;在对话框初始化的时候获得对话框的大小-----OnInitDialog();1)获得大窗口的大小this->GetWindowRect(&m_BigRect);//注:GetWindowRect为获取整个窗口的大小,GetClientRect为获取客户区大小2)获得小窗口大小分析---先应获得分割线的位置添加分割线变量----改ID---添加m_FenRect为分隔线变量CRect FRect;m_FenRect.GetWindowRect(&FRect);3)计算出小窗口区域的大小(对话框变小时的大小)m_SmallRect.left = m_BigRect.left;m_SmallRect.right = m_ BigRect.right;m_SmallRect.top = m_ BigRect.topm_SmallRect.bottom = m_FenRect.bottom4)设置对话框位置、大小SetWindowPos(NULL,0,0,m_SmallRect.Width(),SmallRect.High(),SWP_NOZORDER|SWP_NOMOVE);//显示为隐藏模式SWP_NOSIZE忽略三四参(宽高),SWP_NOZORDER忽略一参,2、3参为位置5)设置什么时候显示大窗口、什么时候显示小窗口//通过对话框上的ID号获得所对应的句柄----GetDlgItem(IDC_BUTTON1)(CButton*)GetDlgItem(IDC_BUTTON1)->GetWindowText(strBtn);----获取文本If(strBtn==”>>”){SetWindowPos(NULL,0,0,m_BigRect.Width(),BigRect.Hight(),SWP_NOZORDER|SWP_NOM OVE);(CButton*)GetDlgItem(IDC_BUTTON1)->SetWindowText(“<<”);----改变文本}else if(strBtn==”<<”){SetWindowPos(NULL,0,0,m_SmallRect.Width(),SmallRect.Hight(),SWP_NOZORDER|SWP_N OMOVE);(CButton*)GetDlgItem(IDC_BUTTON1)->SetWindowText(“>>”);----改变文本}十五:windows窗口下显示对话框1参当前进程句柄,2参对话框ID号,3参当前窗口句柄,4参对话框消息处理函数1://弹出模态对话框(点别的对话框不好用)DialogBox(g_hInst,(LPCTSTR)IDD_DIALOG1,g_hwnd, (DLGPROC)Dialog);2://弹出非模态对话框(可以点别的对话框)HWND g_hDialog; //对话框句柄g_hDialog = CreateDialog(g_hInst,(LPCTSTR)IDD_DIALOG1,g_hwnd, (DLGPROC)Dialog); ShowWindow(g_hDialog,_SW_SHOW); //显示对话框// “关于”框的消息处理程序。
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 类对象,作为其成员变量。
第五章对话框和常用控件对话框是Windows应用程序中最重要的用户界面元素之一,是与用户交互的重要手段,在程序运行过程中,对话框可用于扑捉用户的输入信息或数据。
对话框是一个特殊类型的窗口,任何对窗口进行的操作(如:移动、最大化、最小化等)都可在对话框中实施,一般来说,在对话框中通过各种控件(如:按钮、编辑框、列表框、组合框等)来和用户进行交互。
控件是在系统内部定义的用于和用户交互的基本单元。
一、对话框的使用Visual C++提供的对话框编辑器能“可视”地进行设计、编辑,并可用ClassWizard为对话框从CDialog基类中派生一个类,MFC的CDialog类封装了用于对话框的显示、关闭等操作的许多功能函数,例如:DoModal函数用来显示模式对话框并返回用户操作的结果。
1、模式对话框(为186附加举例页)所谓模式对话框是指,当对话被弹出时,用户必须在对话框中进行相应的操作,在退出对话框之前,对话框所在的应用程序不能继续执行。
平常我们所见到的对话框大多是模式对话框。
例:模式对话框(通过菜单命令弹出)1)建一个单文档(SDI)应用程序2)创建对话框模板Insert→Resource→选中Dialog→单击New拖过一个静态文本,鼠标对准它,按右键点properties改标题为“新建模式对话框”。
3)鼠标右键对准对话框的任何位置单击,选择properties选项,设置ID为IDD_MYDIALOG 4)给对话框创建类双击新建对话框的任何位置,单击OK,写类名为“CMyDlg”,保证”CDialog”作为该类的基类。
5)创建菜单命令:a)打开资源编辑器的菜单项Menub)双击IDR_MAINFRAMEc)双击右边空白菜单,点开pop_up(让它是空白),在名字处写”弹出对话框(&A)”,ID 处写ID_PUPDIALOG6)将菜单命令连接到主框架程序中,完成ID_PUPDIALOG的消息映射:View→ClassWizard→保证Class name里是CMainFrame,在ObjectIDs里找到ID_PUPDIALOG点黑→Messages里(右边)点COMMAND建立主框架对象方法并加代码:void CMainFrame::OnPupdialog(){ CMyDlg MyDlg;MyDlg.DoModal(); //DoModal()是CDialog类成员函数,通过调用该//函数将显示对话框。
mfc对话框一、对话框的基本原理对话框是一种用户界面,几乎每一个Windows 程序都使用对话框与角户进行交互。
对话框可能是一个简单的只含有OK 按钮的消息框,也可以是一个复杂的数据输入表单。
对话框上有一些方便用户输入的控件,对话框依靠这些控件与用户进行交互,其实质是一个接收消息的窗口。
本章主要讲解模式对话框和无模式对话框的原理和使用方法,下一章将详细介绍各种控件的使用。
你将学习创建一个对话框,使用对话框模板编辑一个对话框资源,并在程序中调用对话框。
在创建一个对话框之前,先来了解一下对话框是如何工作的。
对话框的数据来自三方面——对话框资源、对话框对象和一个文档对象。
1 .对话框资源对话框资源是一个用户输入或取得数据的图形界面。
这个图形界面是使用 Develop Studio 的对话框编辑器在对话框模板上创建的,程序员可以在对话框模板上增加并编辑控件,生成对话框资源。
当应用程序运行时,就可以得到一个对话框。
2 .对话框对象MFC 使用 CDialog 类来描述对话框,它是 CWnd 类的派生类。
在 CWnd 类的基础上增加了数据交换的功能。
当创建一个新的对话框资源后,使用 C1assWizard 可以创建一个对话框类的派生类。
对话框对象实现了对话框和应用程序之间的通信。
在应用程序中定义一个对话框对象后,在对话框显示前,可以通过访问对话框对象的成员变量为该对话框的控件初始化,在对话框关闭后,可以通过访问对话框对象的成员变量获得用户的输入数据。
3.文档对象MFC 使用文档对象描述应用程序处理的数据,用户输入的数据要进一步的处理,通常要先保存到文档对象中。
例如一个处理学生记录的应用程序,用户通过一个对话框输出学生记录并保存到一个文件中。
应用程序的处理流程是:用户在对话框中输入信息,程序通过对话框对象得到输入信息,将输入信息整理到文档对象中,使用序列化函数将文档对象保存到一个文件中,所以文档对象扮演了一个很重要的数据交换的角色。
第五章对话框和常用控件对话框是Windows应用程序中最重要的用户界面元素之一,是与用户交互的重要手段,在程序运行过程中,对话框可用于扑捉用户的输入信息或数据。
对话框是一个特殊类型的窗口,任何对窗口进行的操作(如:移动、最大化、最小化等)都可在对话框中实施,一般来说,在对话框中通过各种控件(如:按钮、编辑框、列表框、组合框等)来和用户进行交互。
控件是在系统内部定义的用于和用户交互的基本单元。
一、对话框的使用Visual C++提供的对话框编辑器能“可视”地进行设计、编辑,并可用ClassWizard为对话框从CDialog基类中派生一个类,MFC的CDialog类封装了用于对话框的显示、关闭等操作的许多功能函数,例如:DoModal函数用来显示模式对话框并返回用户操作的结果。
1、模式对话框(为186附加举例页)所谓模式对话框是指,当对话被弹出时,用户必须在对话框中进行相应的操作,在退出对话框之前,对话框所在的应用程序不能继续执行。
平常我们所见到的对话框大多是模式对话框。
例:模式对话框(通过菜单命令弹出)1)建一个单文档(SDI)应用程序2)创建对话框模板Insert→Resource→选中Dialog→单击New拖过一个静态文本,鼠标对准它,按右键点properties改标题为“新建模式对话框”。
3)鼠标右键对准对话框的任何位置单击,选择properties选项,设置ID为IDD_MYDIALOG 4)给对话框创建类双击新建对话框的任何位置,单击OK,写类名为“CMyDlg”,保证”CDialog”作为该类的基类。
5)创建菜单命令:a)打开资源编辑器的菜单项Menub)双击IDR_MAINFRAMEc)双击右边空白菜单,点开pop_up(让它是空白),在名字处写”弹出对话框(&A)”,ID 处写ID_PUPDIALOG6)将菜单命令连接到主框架程序中,完成ID_PUPDIALOG的消息映射:View→ClassWizard→保证Class name里是CMainFrame,在ObjectIDs里找到ID_PUPDIALOG点黑→Messages里(右边)点COMMAND建立主框架对象方法并加代码:void CMainFrame::OnPupdialog(){ CMyDlg MyDlg;MyDlg.DoModal(); //DoModal()是CDialog类成员函数,通过调用该//函数将显示对话框。
加法计算器对话框程序大家照着做一遍后,相信对基于对话框的程序有些了解了,有个好的开始对于以后的学习大有裨益。
趁热打铁,鸡啄米这一节讲讲什么是模态对话框和非模态对话框,以及模态对话框怎样弹出。
一.模态对话框和非模态对话框
Windows对话框分为两类:模态对话框和非模态对话框。
模态对话框是这样的对话框,当它弹出后,本应用程序其他窗口将不再接受用户输入,只有该对话框响应用户输入,在对它进行相应操作退出后,其他窗口才能继续与用户交互。
非模态对话框则是,它弹出后,本程序其他窗口仍能响应用户输入。
非模态对话框一般用来显示提示信息等。
大家对Windows系统很了解,相信这两种对话框应该都遇到过。
之前的加法计算器对话框其实就是模态对话框。
二.模态对话框是怎样弹出的
毕竟加法计算器程序大部分都是MFC自动生成的,对话框怎么弹出来的大家可能还不是很清楚。
鸡啄米下面简单说说它是在哪里弹出来的,再重新建一个新的对话框并弹出它,这样大家实践以后就能更灵活的使用模态对话框了。
大家打开Addition.cpp文件,可以看到CAdditionApp类有个InitInstance()函数,在M FC应用程序框架分析中提到过此函数,不过那是单文档应用程序App类中的,函数体不太相同,但都是进行App类实例的初始化工作。
InitInstance()函数的后半部分有一段代码就是定义对话框对象并弹出对话框的,鸡啄米下面给出这段代码并加以注释:
弹出对话框比较关键的一个函数,就是对话框类的DoModal()函数。
CDialog::DoModa l()函数的原型为:
virtual INT_PTR DoModal();
返回值:整数值,指定了传递给CDialog::EndDialog(该函数用于关闭对话框)的nR esult参数值。
如果函数不能创建对话框,则返回-1;如果出现其它错误,则返回IDABOR T。
调用了它对话框就会弹出,返回值是退出对话框时所点的按钮的ID,比如,我们点了“退出”按钮,那么DoModal返回值为IDCANCEL。
三.添加一个新对话框并弹出它
鸡啄米再为加法计算器程序添加一个对话框,以在计算之前询问用户是否确定要进行计算。
大家可以完整的看下对话框的添加和弹出过程。
1.根据“创建对话框模板和修改对话框属性”中所讲的方法,在Resource View中的“Di alog”上点右键选择“Insert Dialog”,创建一个新的对话框模板,修改其ID为IDD_TIP_DIA LOG,Caption改为“提示”,然后参考“为对话框添加控件”中所讲,在对话框模板上添加一个静态文本框(static text),Caption改为“您确定要进行加法计算吗?”,接下来修改OK 按钮的Caption为“确定”,Cancel按钮的Caption为“取消”,最后调整各个控件的位置和对话框的大小。
最终的对话框模板如下图:
2.根据“创建对话框类和添加控件变量”中创建对话框类的方法,在对话框模板上点右键选择“Add Class...”,弹出添加类的对话框,设置“Class name”为CTipDlg,点“OK”。
在S olution Explorer中可以看到生成了CTipDlg类的头文件TipDlg.h和源文件TipDlg.cpp。
3.我们要在点“计算”按钮之后弹出此提示对话框,那么就要在“计算”按钮的消息处理函数OnBnClickedAddButton()中访问提示对话框类,所以为了访问CTipDlg类,在Addition Dlg.cpp中包含CTipDlg的头文件:#include "TipDlg.h"。
4.修改OnBnClickedAddButton()的函数体,在所有代码前,构造CTipDlg类的对象tip Dlg,并通过语句tipDlg.DoModal();弹出对话框,最后判断DoModal()函数的返回值是IDO K还是IDCANCEL来确定是否继续进行计算。
OnBnClickedAddButton()函数修改后如下:
C++代码
5.测试。
编译运行程序后,在对话框上输入被加数和加数,点“计算”,弹出提示对话框询问是否进行计算,如果选择“确定”,则提示对话框退出,并在主对话框上显示被加数和加数的和,而如果选择“取消”,则提示对话框也会退出,但主对话框显示的和不变,即没有进行加法计算。
到此,大家对于模态对话框的基本使用方法应该掌握了吧。
希望大家继续关注鸡啄米的MFC教程,我们共同进步。