从零开始学VC系列教程 二.对话框及常用控件实验
Visual C++应用程序设计实验报告之对话框和按钮的控件
CButton* pBtn;
for(int i=0;i<4;i++)
{
pBtn=(CButton*)GetDlgItem(nCheckIDs[i]);
if(pBtn->GetCheck())
实验步骤与调试过程
1.创建工作文件夹
2.创建一个基于对话框的应用程序Ex_Research
3.设计“上网问卷调查”对话框
(1)按教程的步骤先将该对话框应用程序上机练习并通过
(2)添加一个静态文本控件,标题为“你每天上网的平均时间”,保留默认的标识符
(3)添加4个单选按钮控件,在其属性对话框中,分别将其标题设置为“<1小时”、“<2小时”、“<3小时”、“>3小时”,标示符分别为IDC_TIME_L1、IDC_TIME_L2、IDC_TIME_L3、IDC_TIME_M4
{
pBtn->GetWindowText(strCtrl);
str=str+strCtrl;
str=str+" ";
}
}
MessageBox(str);
CDialog::OnOK();
}
void CEx_ResearchDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
str=str+strCtrl;
str=str+"\n你使用的接入方式:";
vc中的对话框和控件
10.2.1 生成基于对话框的MFC应用程序框架
(1)启动MFC AppWizard (2) MFC AppWizard-Step 1对话框:选择应用 程序的类型和语言。 (3) MFC AppWizard-Step 2 of 4对话框:询 问了三个问题并要求输入一个标题。 (4) MFC AppWizard-Step 3 of 4对话框:询 问了三个问题。 (5) MFC AppWizard-Step 4 of 4对话框:显 示AppWizard为应用程序生成的派生类的一些情况。 (6) 编译运行。
第10章 对话框和控件
10.1 10.2 10.3 10.4 习题 对话框和控件的基本概念 使用AppWizard开发MFC应用程序 基本控件 通用对话框
10.1 对话框和控件的基本概念
10.1.1 对话框的基本概念 10.1.2 控件的基本概念
10.1.1 对话框的基本概念
在MFC中,对话框的功能被封装在了CDialog类中, CDialog类是CWnd类的派生类。 有模式对话框垄断了用户的输入,当一个有模式对 话框打开时,用户只能与该对话框进行交互,而其 它用户界面对象收不到输入信息。 无模式对话框类似普通的Windows窗口,在无模式 对话框打开时,用户可以同时打开其它窗口对象, 操作完毕后,又可用鼠标或其它方式激活该窗口。
VC++对话框与常用控件
返
回
CMyCalculatorDlg类添加数据成员 4.2.4 为CMyCalculatorDlg类添加数据成员
为 了 实 现 计 算 器 功 能 , 我 们 需 要 向 CMyCalculatorDlg 类 ( 即 MyCalculatorDlg.h文件中)添加变量。变量属性和用途如下表。
数据类型 double double double CString
教学内容
MyCalculator程序 演示 开发MyCalculator程序 口令对话框 通用对话框 常用控件介绍
§4.1 MyCalculator程序
程序运行结果
程序运行演示
返回目录
开发MyCalculator MyCalculator程序 §4.2 开发MyCalcuபைடு நூலகம்ator程序
4.2.1 创建工程 4.2.2 可视化设计 为编辑框IDC_DISPLAY IDC_DISPLAY引入变量 4.2.3 为编辑框IDC_DISPLAY引入变量 CMyCalculatorDlg类添加数据成员 4.2.4 为CMyCalculatorDlg类添加数据成员 BUTTON按钮的BN_CLICKED事件添加响应函数 按钮的BN_CLICKED 4.2.5 为BUTTON按钮的BN_CLICKED事件添加响应函数 4.2.6 编写程序代码 4.2.7 技术要点 4.2.8 程序优化
返
回
技术要点——UpdateData函数 UpdateData函数 4.2.7 技术要点 UpdateData
① UpdateData函数是CDialog的基类CWnd的成员函数; ② 函数原型如下: BOOL TRUE ); UpdateData( BOOL bSaveAndValidate =
对话框和控件
对话框的使用——使用无模式对话框
❖ 对话框的分类: ➢ 模式对话框:当对话框被弹出,用户必须在对话框中作出相
应的操作,在退出对话框之前,对话框所在应用程序的其他 操作不能继续执行。 ➢ 无模式对话框:当对话框被弹出后,一直保留在屏幕上,用 户可继续在对话框所在的应用程序中进行其他操作;当需要 使用对话框时,只需像激活一般窗口一样单击对话框所在的 区域即可激活。举例说明。
对话框资源类型表
说明
IDD_DIALOGBAR
对话条,往往和工具条停放在一起
IDD_FORMVIEW
一个表状风格的对话框,用于无模式对 话框或视图类
IDD_OLE_PROPPAGE_LARGE 一个大的OLE属性页
IDD_OLE_PROPPAGE_SMALL 一个小的OLE属性页
IDD_PROPPAGE_LARGE
对话框的使用—添加对话框资源
对话框的使用—设置对话框属性
在对话框模板处单击鼠标右键,从弹出的快 捷菜单中选择“属性”菜单项,出现“对话 框属性”界面。可以进行各项的设置。
对话框的使用—设置对话框属性
对话框的使用——添加和布局控件
控件的添加:在对话框中添加控件的方法有下列几种: 在控件工具栏中单击某控件,此时的鼠标箭头在对话框内变 成“┼”字形状;在对话框指定位置单击鼠标左键,则此控件 被添加到对话框的相应位置,再拖动刚添加控件的选择框可 改变其大小和位置。
对话框的使用—添加对话框资源
❖ 在一个MFC应用程序中添加对话框资源,通常按下列步骤进行: ❖ (1)选择“插入”->“资源”,或按快捷键Ctrl+R打开“插入资源”对话框,
在对话框中可以看到资源列表中存在Dialog项,展开该项可以看到对话框资源 的不同类型选项。
vc++第5章对话框与控件
(6) SendMessage
�
� � �
利用Platform SDK(software development kit )的SendMessage函数, 通过发送WM_GETTEXT消息获取前两个编辑 框控件的文本。 将文本转换为相应的数值并完成加法计算 将结果转换为相应的字符串 再发送WM_SETTEXT消息,设置第三个编辑 框的实现代码。
第五章(1) 对话框与控件
贾澎涛 pengtao.jia@
1. 常用控件介绍
� � � � � � � � � �
静态文本框(Static Text) 图形控件(Picture) 编辑框(Edit Box) 按钮(Button) 复选框(Check Box) 单选按钮(Radio Button) 组框(Group Box) 列表框(List Box) 组合框(Combo Box) 滚动条(Scroll Bar)
(3) GetDlgItemInt和 SetDlgItemInt
int num1, num2, num3; num1 = GetDlgItemInt(IDC_EDIT1); num2 = GetDlgItemInt(IDC_EDIT2); num3 = num1 + num2; SetDlgItemInt(IDC_EDIT3,num3)
(4)将控件和整型变量相关联
�
利用ClassWizard为编辑框添加映射变 量(类的整型成员变量)。 UpdateData(); m_num3 = m_num1 + m_num2; UpdateData(FALSE);
(5) 将控件和控件变量相关联
�
利用ClassWizard为编辑框添加映射变量(类的控件类型 成员变量) int num1, num2, num3; char ch1[10], ch2[10], ch3[10]; m_edit1.GetWindowText(ch1,10); m_edit2.GetWindowText(ch2,10); num1 = atoi(ch1); num2 = atoi(ch2); num3 = num1 + num2; itoa(num3,ch3,10); m_edit3.SetWindowText(ch3);
从零开始学VC系列教程 二.对话框及常用控件实验
从零开始学VC系列教程二. 对话框及常用控件实验恭喜你,进入VC学习的第二节了.这一节是人机交互的基础.所谓人机交互,说通俗点就是与机器对话.然而我们现在的技术还不能像科幻片里一样与机器人直接说话就行了.所以,我们的操作意图还得通过文本输入,命令按钮等等来实现.本节内容:学会对话框调用及一些常用控件的使用方法.学习目的:学习人机交互,为软件开发提供界面基础.1.新建工程.参考第一节的方法新建一个工程,名字为Eg02完成后如下图细心的朋友一定会发现.新建的工程里还有一个对话框,ID名是IDD_ABOUTBOX这个是做什么用的呢?我们用到的软件都会有一个版权声明.通过第一章的学习,大家应该知道怎么观看这个IDD_ABOUTBOX对话框了吧.没错!双击IDD_ABOUTBOX就可以了.我们会看到如下的一个对话框这就是我们这个程序的关于对话框,一般用于版权声明及版本号标识.大家看到的这个对话框里有两个静态文本框和一个图像框(Picture),静态文本框我们在前一节已经介绍过了.大家可以修改一下版权所有这一行,填什么都可以,签个大名也行.完成以后你一定想看看效果,这个对话框怎么打开呢?其实VC已经为我们做好了.先按F7编译,然后按F5运行.大家可以看到程序运行了.单击应用程序图标,就会出现一个菜单,选最后一个[关于Eg02],关于对话框就弹出来了.当然,这是系统为我们做好的.自己怎么在程序中调用这个对话框呢?为了演示,首先参考第一节的内容添加一个按钮,然后把按钮的ID改为IDC_BTN_ABOUTME,把标题,也就是Caption改为[关于].最终效果如下下面我们为按钮添加代码.相信大家一定还记得怎么进入代码吧..对了,双击[关于]按钮,在弹出的对话框中点[确定]就可以了.为了让大家更好的理解下面的操作,我们先要解释一下关于对话框的类.VC向导会为关于对话框建立一个类,大家看看下面的图单击标签ClassView(这里显示的是[Class…])就可以看到Eg02这个应用程序的类.第一个CAboutDlg就是关于对话框的类.CEg02Dlg对应IDD_EG02_DIALOG.中间的Ceg02App 是应用程序的基础类.所以,如果要对关于对话框进行操作,就要用到类CAboutDlg,因为与此有关的函数及变量都封装在CAboutDlg中.看到这里大家可能又糊涂了,没关系,在以后的教程中,通过一些练习大家就会慢慢领会到的.这里还是先为[关于]按钮添加代码. void CEg02Dlg::OnBtnAboutme(){// TODO: Add your control notification handler code here}上面是VC为[关于]按钮添加的响应函数.我们添加代码成以下所示void CEg02Dlg::OnBtnAboutme(){// TODO: Add your control notification handler code hereCAboutDlg ADlg;ADlg.DoModal();}一共有两句,第一句是CAboutDlg ADlg;作用是定义一个变量Adlg.第二句是ADlg.DoModal();功能是调用类CAboutDlg里的一个函数DoModal();这个函数在MSDN里的解释是Call this member function to invoke the modal dialog box and return the dialog-box result when done. This member function handles all interaction with the user while the dialog box is active. This is what makes the dialog box modal; that is, the user cannot interact with other windows until the dialog box is closed.一般我们用于显示一个对话框.其实大家看看CAboutDlg这个类下面,只有两个函数DoModal()这个函数并不在这个里面.第一章我们提到过类的派生和继承.其实CAboutDlg这个类是派生于CDialog类,DoModal()这个函数是CDialog的成员函数,由于CAboutDlg是继承父类CDialog的,所以CDialog里的函数在CAboutDlg中也可以使用.下面我们来说说几个常用控件的使用.首先在IDD_EG02_DIALOG对话框中加入一个Edit(编辑框)控件.Edit一般用于输入输出数据文本.相当于VB里的TextBox.加入Edit控件后,编辑其属性为然后,我们再加一个按钮(PushButton),并编辑其属性为接下来,我们先说一下要实现的效果.很简单,在编辑框里输入一个文本,然后按显示,就把文本显示在静态文本框中.所以,这里要把静态文本编辑框的ID改为IDC_DISPLABEL 下面我们为[显示]按钮添加代码void CEg02Dlg::OnBtnShow(){// TODO: Add your control notification handler code hereCString a;GetDlgItemText(IDC_EDIT_INPUT,a);SetDlgItemText(IDC_DISPLABEL,a);}其实不复杂,也只有三句,第一句定义一个CString类变量a 我们来说说GetDlgItemText这个函数吧.查查MSDN就知道函数原型了. int GetDlgItemText(int nID,LPTSTR lpStr,int nMaxCount)const; int GetDlgItemText( int nID, CString& rString ) const;大家看看就觉得奇怪了,怎么有两个原型啊?并且一个是传两个参数,另一个是传三个参数.在VC里面,同一个类下是可以存在多个同名函数的,具体调用哪个函数要看参数的不同.在这里我们传入了两个参数,所以VC会调用int GetDlgItemText( int nID, CString& rString ) const;这个函数.第一个函数是控件的ID号,第二个是字串.第二个传了地址,所以我们在下一句中用的a已经是获得IDC_EDIT_INPUT的文本了.运行效果如下下面介绍一下进度条的使用以及定时器的使用.我们要实现的效果是进度从0到满格,然后再从0到满格,依次循环.每跳一格间隔500ms,这个时间我们用定时器来实现.首先从控件条里拖出一个进程条到对话框,修改属性如下然后我们要介绍一下VC的定时器.VC里面使用定时器有多种方式,我们先介绍一种作为抛砖引玉首先添加一个Windows消息处理器.消息这个词语可能很陌生,我们会在后面很多次说明.这里先照图做在类管理器里选中Ceg02Dlg这个类,然后点右键,就会弹出一个菜单,选择[Add Windows Message Handler…],接下来会弹出另一个菜单双击WM_TIMER然后按[确定]就可以了.大家会看到,CEg02Dlg类中多了一个函数这个就是VC中的定时器响应函数.然后双击这个函数就进入代码了然后我们为Timer事件添加代码. void CEg02Dlg::OnTimer(UINT nIDEvent){// TODO: Add your message handler code here and/or call default IDC_PROGRESSstatic int nPos=0;((CProgressCtrl*)(GetDlgItem(IDC_PROGRESS)))->SetPos(nPos);if(nPos<100) nPos+=10;else nPos=0;CDialog::OnTimer(nIDEvent);}首先定义一个整型的变量nPos用于记录进度条的进度值.默认时,进度条0为空,100为满格.从后的程序大家可以看到,这个变量自加到100就变为0.最难理解的就是((CProgressCtrl*)(GetDlgItem(IDC_PROGRESS)))->SetPos(nPos);首先, GetDlgItem(IDC_PROGRESS)这个函数用来获取IDC_PROGRESS的句柄,在VC 里面引入了句柄这个词语,我们将在下一章中对消息和句柄进行详细的说明, 句柄是WINDOWS用来标识被应用程序所建立或使用的对象的唯一整数,WINDOWS使用各种各样的句柄标识诸如应用程序实例,窗口,控制,位图,GDI对象等等。
c++学习指导对话框和常用控件
3.1对话框的使用 对话框的使用
图3.3 对话框属性窗口 对话框的常规( 表3.2 对话框的常规(General)属性 )
项 目 ID框 标题框 字体按钮 位置X/位置Y 菜单框 类名称框 说 明 修改或选择对话框的标识符名称 输入对话框的标题名称,中英文均可,如“我的对话框” 单击此按钮可选择字体的种类(如宋体)及尺寸(如9号) 对话框左上角在父窗口中的X、Y坐标,都为0时表示居中 默认值为无,当对话框需要菜单时输入或选择指定的菜单资 源 默认值为无,它提供C/C++语言编程时所需要的对话框类名, 对MFC类库的资源文件来说,该项不被激活。
3.1对话框的使用 对话框的使用
图3.3中,有一个 图标,当单击此图标后,图标变成,表示该对话框将一直显示直 到用户关闭它。在 状态下,当该对话框一旦失去活动状态后就会自动消失!
将添加的对话框的属性进行以下3点修改,结果如图3.4所示: ● 在ID框中,将对话框标识符IDD_DIALOG1改成IDD_DIALOG_FIRST; ● 在标题框中,将对话框标题“对话”改为“我的第一个对话框”; ● 单击[字体]按钮,通过弹出的字体对话框将对话框内的文本设置成“宋体,9” , 以使自己的对话框和Windows中的对话框保持外观上的一致(这是界面设计的“一致性” 原则)。
向对话框添加一个控件的方法有下列几种: ● 在控件工具栏中单击某控件,此时的鼠标箭头在对话框内变成“十”字形状;在 对话框指定位置单击鼠标左键,则此控件被添加到对话框的相应位置,再拖动刚添加控 件的选择框可改变其大小和位置。 ● 在控件工具栏中单击某控件,此时的鼠标箭头对话框内变成“十”字形状;在指 定位置处单击鼠标左键不放,拖动鼠标至满意位置,释放鼠标键。 ● 用鼠标左键点中控件工具栏中的某控件,并按住鼠标左键不放;在移动鼠标到对 话框的指定位置的过程中,用户会看到一个虚线框,下面带有该控件的标记;释放鼠标 左键,新添加的控件立即出现在对话框中。 2. 控件的选取 控件的删除、复制和布局操作一般都要先选取控件,若选取单个控件,则可以下列 方法: ● 用鼠标直接选取。首先保证在控件工具栏中的选择按钮()是被选中的,然后 移动鼠标指针至指定的控件上,单击鼠标左键即可。 ● 用助记符来选取。如果控件的标题中带有下划线的字符,这个字符就是助记符, 选择时直接按下该助记符键或“Alt+助记符”组合键即可。
VC++ 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类成员函数,通过调用该//函数将显示对话框。
vc实验报告-对话框
private:
CStuDialog *m_pDlg;
m_pView->PostMessage(WM_GOODBYE,IDC_SHOW);
}
else
{
CDialog::OnOK();
}
}
7、同样的在CFeiMotaiView类中添加CStuDialog指针,声明class CStuDialog
包含CStuDialog.h头文件。
#include"StuDialog.h"
if(m_bJapanese==1)
Japanese.Format("日语");else Japanese.Format("");
pDC->TextOut(0,20,m_strName);
pDC->TextOut(0,40,m_strMajor);
pDC->TextOut(60,40,English);
{
biaoshi=1;
CStuDialog::OnOK();
// TODO: Add your control notification handler code here
}
11、在CMotaiView中重载OnDraw函数,在窗口中显示与用户交互的信息:
void CMotaiView::OnDraw(CDC* pDC)
}
// TODO: add draw code for native data here
}
二、非模态对话框。
1、与非模态类似,建立新建MFC APP wizard工程,建立单文档并命名为FeiMotai,前六步与建立模态对话框类似。
对话框常用控件实验报告
对话框常用控件实验报告班级:电气工程与自动化2班学号:06120902姓名: 嘎日玛盖Ⅰ内容和要求:一,对话框常用控件实验要求:1 控件的消息映像2控件与关联变量的数据处理二,对话框常用控件实验步骤:1步骤2效果3执行效果截图4问题的解决方法三,对话框常用控件实验的内容:1编辑框2静态文本3单选框4复选框Ⅱ实验步骤1.新建一个工程,选择MFC AppWizard(exe)的项目类型,输入项目名:heiha,结果如图1:选择单文檔类型。
2.新建一个菜单“正式开始工作”,在其下面建立新选项“提交档案”,设其ID为ID_MENU_TIJIAO,如图2:钮、复选按钮和普通按钮:m_NAME、m_XINGBIE和m_AIHAO。
5.利用MFC ClassWIzard在Cfirst类中添加IDOK按钮的BN_CLICKED消息映像,并添加下列代码。
UpdateData(true);m_NAME=m_NEIRONG;UINT AID=GetCheckedRadioButton(IDC_RADIO1,IDC_RADIO2);GetDlgItemText(AID,m_XINGBIE);CString str,strCtrl;UINTnCheckIDs[7]={IDC_CHECK1,IDC_CHECK2,IDC_CHECK3,IDC_CHECK4,IDC_CHEC K5,IDC_CHECK6,IDC_CHECK7};CButton *p;for(int i=0;i<7;i++){ p=(CButton*)GetDlgItem(nCheckIDs[i]);if(p->GetCheck()){GetDlgItemText(nCheckIDs[i],strCtrl);str=str+strCtrl;str=str+" ";}}m_AIHAO=str;UpdateData(false);6. 利用MFC ClassWIzard在CMainFrame类中添加对应新建菜单按钮“提交档案”选项ID 的COMMEND消息映像,并添加下列代码。
VC动态创建对话框和按钮、消息响应
VC动态创建对话框和按钮、消息响应vc 动态创建对话框和按钮、消息响应1.创建非模态对话框:类*对象=new 类BOOL 对象->Create(ID,this);创建后需调用ShowWindow函数将对话框显示出来对象->ShowWindow(SW_SHOW);在非模态对话框中点击确定和取消时,对话框并不销毁,而是隐藏起来,要想销毁,需调用DestroyWindow函数2.动态创建按钮:方法1为要加按钮的类添加一个私有的CButton成为变量m_btn,还要添加一个BOOL 型的私有成员量m_bIsCreated用来确定是否创建了按钮if(m_blsCreated==FALSE)////判断如果没有创建按钮{m_btn.Create("new",/////按钮上显示的文本BS_DEFPUSHBUTTON|WS_VISIBLE|WS_CHILD,///如果没有制定WS_VISIBLE还要调用ShowWindow将其显示出来CRect(0,0,100,100),/////左上角的坐标(0,0),长度为100,100 this,123);ID地址为123m_blsCreated=TRUE;}else{m_btn.DestroyWindow();m_blsCreated=false;}方法2用CWnd类的成员对象m_hWnd用来保存与窗口对象相关联的窗口句柄,如果窗口对象没有与任何窗口相关联,该值为NULL if(!m_btn.m_hWnd){m_btn.Create("new",BS_DEFPUSHBUTTON|WS_VISIBLE|WS_ CHILD,CRect(0,0,100,100),thi s,123);m_blsCreated=TRUE;}else{m_btn.DestroyWindow();m_blsCreated=false;}按钮的动态创建,及添加消息响应函数btn3 = new CButton();btn3->Create("按钮3",BS_PUSHBUTTON|WS_VISIBLE|WS_CHILD,CRect(250,250,320,270),this,10003);其中最后一个参数10003,是ID号,一定要大于100,因为100以内为VC编译系统使用.按钮消息响应(1) 先在CMy12View类中加入afx_msg void PushButton3();(2) 加入消息函数对应代码BEGIN_MESSAGE_MAP(CMy12View, CView)ON_BN_CLICKED(10003, PushButton3)END_MESSAGE_MAP()(3) 编写PushButton3()void CMy12View::PushButton3(){AfxMessageBox("Button3 is pushed!");//MessageBeep(-1);}//不用在CMy12View.h中定义:public:void CMy12View::PushButton3()。
C控件使用
4.1.2 对话框的分类2
两种对话框在用资源编辑器设计和使用Class Wizard 进展编 程时的方法根本一致。但在创立和退出窗口时的方式有所 不同。
在创立时,模式对话框是由系统自动分配内存空间,因此在 退出对话框时,对话框对象会自动删除。而无模式对话框 那么是需要用户来指定内存,退出时还需用户自己来删除 对话框对象。
对话框资源所提供的仅仅是一个数据构造,要利用所创 立的对话框资源,必须要创立以它作为资源的对话框类, 对话框类是从CDialog类中派生出的子类,它提供了编程接 口来管理对话框。
3
4.1.2 对话框的分类1
4.1.2 对话框的分类 对话框有两种类型:模式对话框和无模式对话框。
下面分别对这两种对话框进展说明。 1. 模式对话框
25
4.1.3 在程序中使用有模式对话框
图4.11 最后完成的对话框 26
4.1.3 在程序中使用有模式对话框
表4.2 对话框的控件类型和ID
控 件 类 型 ID 静态文本框 静态文本框 静态文本框 编辑框 编辑框 编辑框
属性 IDC_STATIC IDC_STATIC IDC_STATIC IDC_MYSTRING IDC_POSX IDC_POSY
20
4.1.3 在程序中使用有模式对话框
VC++对话框和常用控件
3、实现消息映射,添加代码 选择类名CMainFrame(管理菜单),选择ID: ID_PUPDIALOG,在Message中选择COMMAND,通过ADD FUNCTION 建立菜单项“弹出对话框”的消息映射。
在函数中添加如下代码:
在MainFrm.cpp文件中添加如下代码:#include “MyDlg.h” 4、编译运行,单击build/Execute *.exe。结果如下
Visual C++程序设计
12
添加对话框资源
对展开的不同类型的对话框资源不作任何选择,选 中“Dialog”,单击[新建]按钮,系统就会自动为当 前应用程序添加了一个对话框资源,并出现如下图 所示的界面。
添加对话框资源后的开发环境
Visual C++程序设计
控件工具栏
默认标识符
对话框模板
布局工具栏 14
一旦对话框资源被打开或被创建,就会出现对话框 编辑器,通过它可以在对话框中进行控件的添加和 布局等操作。
控件的添加。
对话框编辑器最初打开时,控件工具栏是随之出现 的,利用此工具栏中的各个按钮可以顺利完成控件 的添加。下图说明了各个按钮所对应的控件类型。
Visual C++程序设计
控件的选择 静态文本 组框 复选框 组合框 水平滚动条 旋转按钮 滑动条 列表视图 标签 复合编辑 月历
用户定制控件
静态图片 编辑框 按钮 单选框 列表框 垂直滚动条 进展条 热键 树形视图 动画 日期选择 IP地址 扩展组合框 16
创建对话框类
MFC提供了一系列对话框类,并实现了对话框消息响 应和处理机制。CDialog类是对话框类中最重要的类, 我们在程序中创建的对话框类一般都是CDialog类的派 生类。CDialog类还是其它所有对话框类的基类,其派 生关系如下所示: CObject CCmdTarget CWnd CDialog
VC++对话框
实验6 对话框实验目的1、掌握对话框和CDialog类2、掌握对话框的创建、显示和数据校验机制3、掌握模式对话框与无模式对话框的使用方法4、掌握公共对话框的使用实验内容本节主要掌握对话框的基本知识和使用方法。
对话框的基本知识包括对话框模板的设计,模板与对话框类的连接,对话框的消息循环。
同时还对颜色对话框、字体对话框和文件对话框等常用的公共对话框进行了解。
例1.设计画笔宽度选择对话框,通过该对话框可以调整画笔的宽度,范围为1~10,并使用该画笔在客户区画一个圆。
对话框资源创建的步骤如下:(1)利用AppWizard创建一个基于MFC的单文档应用程序ex71。
(2)单击工作区中的ResourceView,选中Dialog,右击Dialog,在弹出的菜单中选择Insert Dialog,这时,在Dialog目录下新增了一个标识为IDD_DIALOG1的条目,即添加了一个新对话框资源,同时在对话框编辑器中显示出该对话框资源。
新建的对话框具有两个默认的按钮控件即OK和Cancel,如下图。
在对话框编辑器中,右击该对话框,在弹出的菜单中选择属性,弹出对话属性对话框,用来设计对话框的属性。
在General选项卡中设置对话框的ID为IDD_PenDlg,对话框的标题为“画笔宽度选择”,如下图。
(3)向对话框中添加控件。
1)一个静态文本控件。
在对话框编辑器中,选中控件窗口中的静态文本,拖动到对话框中,右键单击已添加的静态文本控件,在弹出的菜单中选择属性,弹出该控件属性页,设计该控件的标题为“画笔宽度”。
2)一个编辑框控件。
用同样的方法添加编辑框控件,并在其属性页中,设计编辑框的ID为IDC_Width。
3)一个微调控件。
在微调控件的属性页里,General标签也中设置微调控件(Spin)的属性,ID为IDC_SPIN,Style标签页中的Alignmeng对齐方式选择为right;选中Set buddy integer。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
从零开始学VC系列教程二. 对话框及常用控件实验恭喜你,进入VC学习的第二节了.这一节是人机交互的基础.所谓人机交互,说通俗点就是与机器对话.然而我们现在的技术还不能像科幻片里一样与机器人直接说话就行了.所以,我们的操作意图还得通过文本输入,命令按钮等等来实现.本节内容:学会对话框调用及一些常用控件的使用方法.学习目的:学习人机交互,为软件开发提供界面基础.1.新建工程.参考第一节的方法新建一个工程,名字为Eg02完成后如下图细心的朋友一定会发现.新建的工程里还有一个对话框,ID名是IDD_ABOUTBOX这个是做什么用的呢?我们用到的软件都会有一个版权声明.通过第一章的学习,大家应该知道怎么观看这个IDD_ABOUTBOX对话框了吧.没错!双击IDD_ABOUTBOX就可以了.我们会看到如下的一个对话框这就是我们这个程序的关于对话框,一般用于版权声明及版本号标识.大家看到的这个对话框里有两个静态文本框和一个图像框(Picture),静态文本框我们在前一节已经介绍过了.大家可以修改一下版权所有这一行,填什么都可以,签个大名也行.完成以后你一定想看看效果,这个对话框怎么打开呢?其实VC已经为我们做好了.先按F7编译,然后按F5运行.大家可以看到程序运行了.单击应用程序图标,就会出现一个菜单,选最后一个[关于Eg02],关于对话框就弹出来了.当然,这是系统为我们做好的.自己怎么在程序中调用这个对话框呢?为了演示,首先参考第一节的内容添加一个按钮,然后把按钮的ID改为IDC_BTN_ABOUTME,把标题,也就是Caption 改为[关于].最终效果如下下面我们为按钮添加代码.相信大家一定还记得怎么进入代码吧..对了,双击[关于]按钮,在弹出的对话框中点[确定]就可以了.为了让大家更好的理解下面的操作,我们先要解释一下关于对话框的类.VC向导会为关于对话框建立一个类,大家看看下面的图单击标签ClassView(这里显示的是[Class…])就可以看到Eg02这个应用程序的类.第一个CAboutDlg就是关于对话框的类.CEg02Dlg对应IDD_EG02_DIALOG.中间的Ceg02App是应用程序的基础类.所以,如果要对关于对话框进行操作,就要用到类CAboutDlg,因为与此有关的函数及变量都封装在CAboutDlg中.看到这里大家可能又糊涂了,没关系,在以后的教程中,通过一些练习大家就会慢慢领会到的.这里还是先为[关于]按钮添加代码.void CEg02Dlg::OnBtnAboutme(){// TODO: Add your control notification handler code here}上面是VC为[关于]按钮添加的响应函数.我们添加代码成以下所示void CEg02Dlg::OnBtnAboutme(){// TODO: Add your control notification handler code hereCAboutDlg ADlg;ADlg.DoModal();}一共有两句,第一句是CAboutDlg ADlg;作用是定义一个变量Adlg.第二句是ADlg.DoModal();功能是调用类CAboutDlg里的一个函数DoModal();这个函数在MSDN里的解释是Call this member function to invoke the modal dialog box and return the dialog-box result when done. This member function handles all interaction with the user while the dialog box is active. This is what makes the dialog box modal; that is, the user cannot interact with other windows until the dialog box is closed.一般我们用于显示一个对话框.其实大家看看CAboutDlg这个类下面,只有两个函数DoModal()这个函数并不在这个里面.第一章我们提到过类的派生和继承.其实CAboutDlg这个类是派生于CDialog类,DoModal()这个函数是CDialog的成员函数,由于CAboutDlg是继承父类CDialog的,所以CDialog里的函数在CAboutDlg中也可以使用.下面我们来说说几个常用控件的使用.首先在IDD_EG02_DIALOG对话框中加入一个Edit(编辑框)控件.Edit一般用于输入输出数据文本.相当于VB里的TextBox.加入Edit控件后,编辑其属性为然后,我们再加一个按钮(PushButton),并编辑其属性为接下来,我们先说一下要实现的效果.很简单,在编辑框里输入一个文本,然后按显示,就把文本显示在静态文本框中.所以,这里要把静态文本编辑框的ID改为IDC_DISPLABEL下面我们为[显示]按钮添加代码void CEg02Dlg::OnBtnShow(){// TODO: Add your control notification handler code hereCString a;GetDlgItemText(IDC_EDIT_INPUT,a);SetDlgItemText(IDC_DISPLABEL,a);}其实不复杂,也只有三句,第一句定义一个CString类变量a 我们来说说GetDlgItemText这个函数吧.查查MSDN就知道函数原型了.int GetDlgItemText(int nID,LPTSTR lpStr,int nMaxCount)const;int GetDlgItemText( int nID, CString& rString ) const;大家看看就觉得奇怪了,怎么有两个原型啊?并且一个是传两个参数,另一个是传三个参数.在VC里面,同一个类下是可以存在多个同名函数的,具体调用哪个函数要看参数的不同.在这里我们传入了两个参数,所以VC会调用int GetDlgItemText( int nID, CString& rString ) const;这个函数.第一个函数是控件的ID号,第二个是字串.第二个传了地址,所以我们在下一句中用的a已经是获得IDC_EDIT_INPUT的文本了.运行效果如下下面介绍一下进度条的使用以及定时器的使用.我们要实现的效果是进度从0到满格,然后再从0到满格,依次循环.每跳一格间隔500ms,这个时间我们用定时器来实现.首先从控件条里拖出一个进程条到对话框,修改属性如下然后我们要介绍一下VC的定时器.VC里面使用定时器有多种方式,我们先介绍一种作为抛砖引玉首先添加一个Windows消息处理器.消息这个词语可能很陌生,我们会在后面很多次说明.这里先照图做在类管理器里选中Ceg02Dlg这个类,然后点右键,就会弹出一个菜单,选择[Add Windows Message Handler…],接下来会弹出另一个菜单双击WM_TIMER然后按[确定]就可以了.大家会看到,CEg02Dlg类中多了一个函数这个就是VC中的定时器响应函数.然后双击这个函数就进入代码了然后我们为Timer事件添加代码.void CEg02Dlg::OnTimer(UINT nIDEvent){// TODO: Add your message handler code here and/or call default IDC_PROGRESS static int nPos=0;((CProgressCtrl*)(GetDlgItem(IDC_PROGRESS)))->SetPos(nPos);if(nPos<100) nPos+=10;else nPos=0;CDialog::OnTimer(nIDEvent);}首先定义一个整型的变量nPos用于记录进度条的进度值.默认时,进度条0为空,100为满格.从后的程序大家可以看到,这个变量自加到100就变为0.最难理解的就是((CProgressCtrl*)(GetDlgItem(IDC_PROGRESS)))->SetPos(nPos);首先, GetDlgItem(IDC_PROGRESS)这个函数用来获取IDC_PROGRESS的句柄,在VC里面引入了句柄这个词语,我们将在下一章中对消息和句柄进行详细的说明, 句柄是WINDOWS 用来标识被应用程序所建立或使用的对象的唯一整数,WINDOWS使用各种各样的句柄标识诸如应用程序实例,窗口,控制,位图,GDI对象等等。
WINDOWS句柄有点象C语言中的文件句柄。
在这里,GetDlgItem获取了窗体句柄,大家应该还记得,在VC里面,控制就看成窗体。
(CProgressCtrl*)这个地方是将返回的句柄强制转换为CProgressCtrl类型,与C 语言的中的强制转换是一样的.进度条的控制类是CprogressCtrl.而前面返回的是一个窗体类型,所以先要强制转换.在第一章中,我们提到过,VC中的控件都认为是窗体,在这里就体现出来了. SetPos(nPos);这个函数是类CprogressCtrl的成员函数,用来指定当前进度条的进度.最后还有一步,就是激活这个定时器.像我们的C51或A VR一样,要初始化定时器. 而void CEg02Dlg::OnTimer(UINT nIDEvent)这个函数就像我们单片机的定时器中断服务函数一样.时间到了就会自动执行.参考上面的图,双击OnInitDialog(),就可以进入对话框初始化函数,只要添加一句就可以了.完成后如下BOOL CEg02Dlg::OnInitDialog(){CDialog::OnInitDialog();// Add "About..." menu item to system menu.// IDM_ABOUTBOX must be in the system command range.ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX < 0xF000);CMenu* pSysMenu = GetSystemMenu(FALSE);if (pSysMenu != NULL){CString strAboutMenu;strAboutMenu.LoadString(IDS_ABOUTBOX);if (!strAboutMenu.IsEmpty()){pSysMenu->AppendMenu(MF_SEPARATOR);pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);}}// Set the icon for this dialog. The framework does this automatically// when the application's main window is not a dialogSetIcon(m_hIcon, TRUE); // Set big iconSetIcon(m_hIcon, FALSE); // Set small icon// TODO: Add extra initialization hereSetTimer(0,500,NULL); //这里是添加的,别的都是自动生成的return TRUE; // return TRUE unless you set the focus to a control}在这里我们只添加SetTimer(0,500,NULL);其中,参数0代表定时器的ID号为0,.第二个参数500是定时器的时间,单位为ms,后面的NULL是指不要回调函数.按F7编译后运行就可以看到运行效果了.或许大家有个问题,为什么开始时是添加了一个WM_TIMER的消息处理器呢?我们使用SetTimer开始定时器后,如果没有回调函数,系统会在每次定时时间到后发送一个WM_TIMER消息到窗体.窗体收到这个信息后,调用OnTimer()函数进行处理.系统定义这个函数为afx_msg void OnTimer(UINT nIDEvent);可以看到是以afx_msg修饰的,这种函数会与其中一个信息关联,或者说是消息影射到这个函数.每当有消息发过来,都会执行这个函数.大家只要好好想想单片机的定时器中断就会明白的,原理一样,只是传输机制不同.如果上面的内容你制作成功了,那么恭喜你,第二节就基本学完了.下面我们也来说说多任务和消息机制吧.Windows是基于消息机制的,它是一个多任务的操作系统,也就是说,同一时间内,系统会挂起多个任务.为了说明多任务,我们先来看一段单片机程序.Void main(void){While(1){TaskA();}}这个程序很简单,单片机工作后就进入while()循环了,单片机这个时候就干一件事,那就是执行任务TaskA.这样的工作总是在一个主循环内实施,一次只执行一个任务的我们称为单任务系统.单片机程序只要不引入操作系统并且由一个主循环一直执行完毕的基本都是单任务的.有些程序也是这样写的.Void main(void){While(1){TaskA();TaskB();TaskC();}}这样的程序看起来似乎是有三个任务了.这三个任务是顺序执行的,也就是说,必须让A 完成后,才能到B,B完成后才能到C.如果A有一个长时间的延时,系统就会在A中空等,然而B与A本来是无关的,这样空等的时间就算是浪费了.如果我们的windows也是顺序执行的就麻烦了,那时我们不仅仅会说Windows有点慢,而是说Windows像蜗牛一样在爬.如果我们让这些任务更合理的安排一下,在执行A的时候,有空就去执行B,而在B的空闲时间去执行C 或者A,那么时间就节省下来了.如果时间切换够快,那么我们可以认为A,B,C三个任务在同时进行.所以,如果我们把单片机的执行时间分成若干等份,每份1ms或者更小,这种时间等份我们称为时间片,每次时间到了就换一个任务.也就是说,第一毫秒执行A,这时我们并不等A全部执行完,并记住这个断点,到了第二毫秒执行B,第三毫秒执行C,第四毫秒又执行A并从原来的断点开始执行,依次直至三个任务都完成.大家可以看到,任务A每三毫秒执行了一次.这就是多任务的模型了.Windows其实就是这么干的.只是每次任务时间不一定是我们上面说的3ms,因为系统同一时间内可能会有很多待执行的任务,这些任务就被系统按优先级排成队,一个个取出来执行.比如我们现在打开VC,系统在加载VC,同时我们还可以移动鼠标,这些好像都是在同时进行,其实它们也是按时间片分时执行的.现在分析一下这个工作过程吧.现在我们要打开VC,系统开始加载VC了,可以看到VC 的LOGO界面,但这个时候我们还可以动一下鼠标,硬件首先会响应,并给软件发个通知,而软件这个时候可能还没有轮到鼠标程序的执行,怎么办呢?系统会先把这个鼠标操作保存起来,轮到鼠标时间片时再来处理鼠标操作.大家可能觉得,这样鼠标操作不是滞后了吗?确实是这样的,但这个滞后时间是很短的,我们基本不会察觉出来.我们来看看消息的定义.消息系统对于一个win32程序来说十分重要,它是一个程序运行的动力源泉。