




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
对话框是应用程序中最重要的界面元素之一,是与用户交互的重要手段。它是一个特殊的窗口,其特殊是因为对话框中往往有多个控件(控件是用于和用户交互的基本单元。控件常用于对话框中,另外它还可由其它的父窗口所拥有以完成其它的任务。),如文本框、编辑框、列表框、滚动条等。用户通过与对话框中各控件的交互,起到输入/输出数据或完成其它任务的目的。
第五章对话框及常用控件对话框是应用程序中最重要的界面元素之一,是与用1从MFC编程的角度看,一个对话框(DialogBox)由两部分组成:1.对话框(资源)模板对话框(资源)模板用于指定对话框的控件及其分布,Windows根据对话框模板来创建并显示对话框。2.对话框类对话框类用来实现对话框的功能,由于对话框行使的功能各不相同,因此需要从CDialog类派生一个新类,以完成特定的功能。从MFC编程的角度看,一个对话框(DialogBox)由两2相应地,对话框的设计包括对话框模板的设计和对话框类的设计两个主要方面。与对话框有关的消息主要包括WM_INITDIALOG消息和控件通知消息。在对话框创建时将发出WM_INITDIALOG消息(初始化对话框消息),该消息的消息处理函数是OnInitDialog。OnInitDialog函数的主要用途是初始化对话框。对话框的控件会向对话框发送控件通知消息。相应地,对话框的设计包括对话框模板的设计和对话框类的3CObjectCCmdTargetCWnd
CDialog
CCommonDialog(通用对话框)
CColorDialog(颜色对话框)
CFileDialog(文件对话框)
CFindReplaceDialog(查找替换对话框)
CPageSetupDialog(页面设置对话框)
CFontDialog(字体对话框)
CPrintDialog(打印对话框)MFC的部分对话框类继承关系如下:MFC的部分对话框类继承关系如下:4MFC的CDialog类封装了用于对话框显示、关闭等常用操作的许多成员函数。5.1.1模式对话框和无模式对话框1.模式对话框模式对话框(ModalDialogBox)是指当对话框出现时,它的父窗口将暂时失效,只有处理完对话框所要求的动作后,才会把控制权交回给父窗口。5.1对话框的使用MFC的CDialog类封装了用于对话框显示、关闭等常用操作5模式对话框一般创建过程:Step1:用CDialog::CDialog构造器创建模式对话框;Step2:用CDialog::DoModal函数显示对话框(√);Step3:用CDialog::EndDialog函数终止对话框。CDialog::CDialog构造函数:格式:CDialog(UINTnIDTemplate,CWnd*pParentWnd=NULL);功能:构造一个基于资源的模式对话框。参数:nIDTemplate-对话框模板资源ID号;pParentWnd-指向父窗口的指针,若为NULL,则对话框窗口为应用程序主窗口。模式对话框一般创建过程:6CDialog::DoModal函数:格式:virtualintDoModal();功能:激活并显示模式对话框,操作完成后返回对话框结果。返回:返回一个int值(IDOK或IDCANCEL),若创建失败,则返回0。CDialog::EndDialog函数:格式:voidEndDialog(intnResult);功能:退出模式对话框。参数:nResult-为DoModal函数的返回值。CDialog::DoModal函数:72.无模式对话框/共存式对话框无模式对话框(ModalessDialogBox)又称共存式对话框,它不会令父窗口失效,因此无模式对话框出现时,使用者可以继续执行父窗口的工作。无模式对话框一般创建过程:Step1:用CDialog::Create函数创建无模式对话框(√);Step2:用CWnd::ShowWindow函数显示对话框(√);Step3:用CWnd::DestroyWindow函数终止对话框。注:由于函数CDialog::OnOK()和CDialog::OnCancel()调用EndDialog(),所以需要重载CDialog::OnOK()和CDialog::OnCancel();若按下[Cancel]按钮时,结束对话框,则在CDialog::OnCancel()中调用DestroyWindow()。
2.无模式对话框/共存式对话框8CDialog::Create函数:格式:BOOLCreate(UINTnIDTemplate,CWnd*pParentWnd=NULL);功能:创建一个无模式对话框。返回:若创建成功则返回非0。参数:nIDTemplate-对话框模板资源ID号;
pParentWnd-指向父窗口的指针,若为NULL,则对话框窗口为应用程序主窗口。CDialog::Create函数:9CWnd::ShowWindow函数:格式:BOOLShowWindow(intnCmdShow);功能:显示窗口。返回:若窗口原可见,则返回非0;若窗口原隐藏,则返回0。参数:nCmdShow-规定如何显示CWnd窗口,常用取值有:
SW_HIDE:隐藏窗口
SW_SHOWMINIMIZED:最小化窗口
SW_RESTORE:激活并显示窗口;若已最小化或最大化,则恢复其原大小和位置
SW_SHOW:激活窗口并以其当前大小和位置显示窗口
SW_SHOWMAXIMIZED:最大化窗口。。。CWnd::ShowWindow函数:10CWnd::DestroyWindow函数:格式:virtualBOOLDestroyWindow();功能:删除与CWnd对象连接的窗口。返回:若删除成功,则返回非0值。CDialog::OnOK函数:格式:virtualvoidOnOK();功能:当单击模式/无模式对话框中[Ok]按钮(ID号为IDOK的按钮)时调用该函数。可重载该函数以实现特定的[Ok]按钮动作。CDialog::OnCancel函数:
格式:virtualvoidOnCancel();功能:当单击模式/无模式对话框中[Cancel]按钮(ID号为IDCANCEL的按钮)时调用该函数。可重载该函数以实现特定的[Cancel]按钮动作。CWnd::DestroyWindow函数:115.1.2使用对话框编辑器操作方法:[Insert]->[Resource…]->[Dialog]->[New]。
1.打开对话框编辑器。
2.控件工具栏中各控件含义。
3.控件布局工具栏。5.1.3对话框的编程程序例:用[MFCAppWizard]创建一SDI程序,程序运行后单击MOUSE弹出一模式对话框。(见操作演示)主要步骤:Step1:用[MFCAppWizard]创建一SDI程序(设工程名为CH51A);Step2:[Insert]->[Resource…]->[Dialog]->[New]添加对话框资源
;
5.1.2使用对话框编辑器12Step3:[View]->[ClassWizard…]为对话框派生一个类CMyDlg;此步操作完成时要生成一对文件:MYDLG.H和MYDLG.CPP。Step4:[View]->[ClassWizard…]选择视图类CXXXView,添加OnLButtonDown处理函数;Step5:在OnLButtonDown函数中添加以下代码:voidCXXXView::OnLButtonDown(UINTnFlags,CPointpoint){//TODO:Addyourmessagehandlercodehereand/orcalldefault
CMyDlgdlg;//生成并构造一个对话框对象
dlg.DoModal();//显示对话框
CView::OnLButtonDown(nFlags,point);}Step6:在CXXXView.CPP文件开始的#include后添加以下代码:
#include"MyDlg.h"Step3:[View]->[ClassWizard…]为对13程序例:为模式对话框增加一个命令按钮,单击该按钮弹出一消息框。按钮控件的常用消息有两个:1、BN_CLICKED(单击按钮消息)
当用户单击按钮时,由按钮控件发送给对话框。2、BN_DOUBLECLICKED(双击按钮消息)
当用户双击按钮时,由按钮控件发送给对话框。程序例:用[MFCAppWizard]创建一SDI程序,程序运行后单击MOUSE弹出一无模式对话框。(见操作演示)主要步骤:Step1:用[MFCAppWizard]创建一SDI程序(设工程名为CH51B);Step2:[Insert]->[Resource…]->[Dialog]->[New]添加对话框资源
;程序例:为模式对话框增加一个命令按钮,单击该按钮弹出一消息框14
Step3:[View]->[ClassWizard…]为对话框派生一个类CMyDlg;此步操作完成时要生成一对文件:MYDLG.H和MYDLG.CPP。Step4:[View]->[ClassWizard…]选择视图类CH51BView,添加OnLButtonDown处理函数;Step5:在OnLButtonDown函数中添加以下代码:voidCCH51BView::OnLButtonDown(UINTnFlags,CPointpoint){ //TODO:Addyourmessagehandlercodehereand/orcalldefault
CMyDlg*pDlg=newCMyDlg; pDlg->Create(IDD_DIALOG1,this); pDlg->ShowWindow(SW_SHOW); CView::OnLButtonDown(nFlags,point);}Step3:[View]->[ClassWizard…]为15Step6:在CH51BView.CPP文件开始的#include后添加以下代码:
#include"MyDlg.h"
从上面两种不同对话框的例子可以看出:模式对话框在显示时,未关闭窗口前其它窗口是不能成为活动窗口的;无模式对话框在显示时,未关闭窗口前其它窗口则是可以成为活动窗口的。Step6:在CH51BView.CPP文件开始的#incl16控件(Control)是能够完成输入/输出等特定功能的一种特殊窗口。系统定义的标准控件所对应的类一般是由CWnd派生的。5.2.1在对话框中创建和使用控件控件的创建方式有两种:1、在对话框模板中用编辑器指定控件 即将控件的父窗口指定为对话框。2、把控件看作任一窗口的子窗口,通过调用Create()函数来创建5.2控件的创建和使用控件(Control)是能够完成输入/输出等特定功能的一种特17程序例:在本例中,可学到三种改变按钮控件标题的方法:法1:通过ClassWizard增加资源IDD_DIALOG1的CButton类对象
CButtonm_MyBtn;在OnInitDialog()中添加:
m_MyBtn.SetWindowText(“欢迎”);//将按钮控件标题设为//“欢迎”CWnd::SetWindowText函数:格式:voidSetWindowText(LPCTSTRlpszString);功能:设置窗口或控件的标题。参数:lpszString-指向用作新标题或控件文本的CString对象或字符串。程序例:在本例中,可学到三种改变按钮控件标题的方法:18法2:通过CWnd::GetDlgItem获取按钮控件对象指针实现
设新增按钮控件的ID号为IDC_BUTTON1,则与m_MyBtn.SetWindowText(“欢迎”);等价的代码如下:GetDlgItem(IDC_BUTTON1)->SetWindowText(“欢迎”);CWnd::GetDlgItem函数:格式:CWnd*GetDlgItem(intnID);功能:获取指定控件或子窗口的指针。参数:nID-控件或子窗口的ID标识符。法3:在对话框模板中,通过设定控件属性对话框实现法2:通过CWnd::GetDlgItem获取按钮控件对象指19
5.2.2控件的数据交换和数据验证
DDV/DDX技术DDX(dialogdataexchange)DDV(dialogdatavalidation)UpdateData()函数实现控件的控制程序例(P200)UpdateData();M_mybtn.SetWindowText(m_strEdit)5.2.2控件的数据交换和数据验证205.2.3控件的通用属性
控件的属性对话框的修改5.2.3控件的通用属性215.2.4控件的消息在控件的使用和编程过程中,用户可以向控件发送消息来完成特定的任务,或者是根据控件产生的消息来执行所需要的程序代码。当控件的状态发生改变时,控件会向其父窗口发送消息,该消息称为通知消息。每个消息均由一个MSG结构来记录。对一般控件,通知消息通常是WM_COMMAND。MSG结构中记录的该消息的几个常用参数说明如下:HIWORD(wParam)-控件ID标识符LOWORD(wParam)-控件的具体消息代码(如命令按钮有BN_CLICKED和BN_DOUBLECLICKED两个)lParam-控件的句柄5.2.4控件的消息225.2.5如何在程序中加载其它的应用程序?
有时,需要在一个应用程序中加载另一个应用程序。在VC中,有三个API函数WinExec()、ShellExecute()、CreateProcess()可以实现这种应用目的。
WinExec最简单,原型如下:WinExec(LPCSTRlpCmdLine,//程序文件的路径
UINTFuCmdShow//窗口显示方式
);
如,加载C盘windows文件夹下的notepad.exe记事本程序,代码如下:WinExec("c:\\windows\\notepad.exe",SW_SHOWMAXIMIZED);5.2.5如何在程序中加载其它的应用程序?23运行EMAIL或网址在某消息映射中添加实现EMAIL运行charszMailAddress[80];
strcpy(szMailAddress,"mailto:netvc@21");
ShellExecute(NULL,"open",szMailAddress,NULL,NULL,SW_SHOWNORMAL);在某消息映射中添加实现网址启动
charszMailAddress[80];strcpy(szMailAddress,"");ShellExecute(NULL,"open",szMailAddress,NULL,NULL,SW_SHOWNORMAL);运行EMAIL或网址在某消息映射中添加实现EMAIL运行24可将控件分为三类:
1、一般控件/标准控件表:一般控件控件名称MFC类静态控件CStatic(√)按钮控件CButton(√)(包括:命令按钮、单选钮、复选框)编辑控件CEdit(√)列表框CListBox(√)组合框CComboBox(√)滚动条CScrollBar(√)
5.3Window常用控件可将控件分为三类:5.3Window常用控件25
2、新增的公共控件Windows支持18种新的公共控件,VC的MFC类库提供相应的类以方便程序员编程。表:公共控件控件名称MFC类动画控件CAnimateCtrl扩展组合框控件CComboBoxEx
(比一般的组合框控件多一项功能:支持图象列表)日期时间控件CDateTimeCtrl标题控件CHeaderCtrl热键控件CHotKeyCtrl(它是一个窗口,用于显示用户输入的热键,如[Ctrl]+[Shift]+[F8]。使用热键可迅速地完成指定的操作。它常用于对话框中。)2、新增的公共控件26图象列表CImageListIP地址控件CIPAddressCtrl列表控件CListCtrl月历控件CMonthCalCtrl进展条控件CProgressCtrl丰富编辑控件CRichEditCtrl(是一个窗口,用户可以在其中输入和编辑文字,同时允许用户在编辑时使用丰富的格式特性,就像Word中使用脚注[Footnote]等一样。它既支持文字和图形格式,也可包括嵌入的OLE对象。)滑动条控件CSliderCtrl(√)旋转按钮控件CSpinButtonCtrl(√)图象列表CImageLi27状态栏控件CStatusBarCtrl标签控件CTabCtrl工具栏控件CToolBarCtrl工具栏提示控件CToolTipCtrl树形控件CTreeCtrl
3、ActiveX控件ActiveX(ActivetheInternet:激活Internet)控件:是MS提出的一组使用COM(ComponentObjectModel:组件对象模型)使得软件组件在网络环境中进行交互的技术集。另外,我们还可编写代码定制自己的控件(CustomControl)。状态栏控件CStatusB285.3.1静态控件和按钮
1、静态控件静态控件的功能比较简单,可作为显示字符串、图标、位图用。静态控件一般不接收用户输入,也不能被选择。在对话框的资源编辑器的控件工具栏中,属于静态控件的有:静态文本(StaticText)、成组框(GroupBox)、静态图片(Picture)。成组框(GroupBox):是一个矩形框,其中有一组控件(如单选钮或复选框)。它可用于把具有公共用途的控件组织在一起。成组框不能被选中,应用程序也不能向它发送消息。静态图片(Picture)可将应用程序资源中的位图、图标等显示在该控件中。
5.3.1静态控件和按钮29
2、按钮事实上,Wndows可为我们提供4种按钮:命令按钮/按键按钮(Button)、单选钮(RadioButton)、复选框(CheckBox)、自画按钮四种。MFC提供类CButton来实现按钮控件的功能。从对话框模板创建,只需向对话框类加入CButton类型的成员变量即可。
(1)命令按钮/按键按钮(Button)几乎所有的对话框都使用命令按钮,应用程序通常使用命令按钮启动某一操作。(2)单选钮(RadioButton)应用程序通常在成组框中使用单选按钮,用户可以在一组相关但又对立的选项中进行选择,在同一时刻只能选中其中一个。它通常有两种状态:选中(按钮上有黑点)和未选中(没有黑点)。另外如果为三态单选钮,则还有禁止状态(灰钮)。2、按钮30(3)复选框(CheckBox)应用程序通常在成组框中使用复选框,用户可以在一组相关但又独立的选项中进行选择,在同一时刻可以选择任意个选项。它通常有两种状态:选中(框中有√)和未选中(没有√)。另外如果为三态复选框,则还有禁止状态(灰框)。
例:见教材P205图5.22。(4)自画按钮对于手工创建,则首先要调用CButton()构造对象,然后再调用CButton::Create创建按钮控件,并将其连接到CButton对象。最典型的自画按钮就是位图按钮,它是用位图图象代替文字标签的按钮控件。位图按钮的作用与命令按钮相同。MFC提供的CButton的派生类CBitmapButton(位图按钮类)来实现位图按钮的功能,通过几个独立的位图分别代表按钮的松开(Up)、按下(Down)、获取输入焦点(Focused)和禁止(Disabled)状态。(3)复选框(CheckBox)31创建按钮CButton::Create成员函数:格式:BOOLCreate(LPCTSTRlpszCaption,DWORDdwStyle,constRECT&rect,CWnd*pParentWnd,UINTnID);参数:lpszCaption-按钮上显示的文字;dwStyle-按钮风格,除了Windows风格可以使用外(如WS_CHILD|WS_VISUBLE|WS_BORDER)还有按钮专用的一些风格,常用的有:BS_CHECKBOX
复选框BS_DEFPUSHBUTTON
默认命令按钮
BS_OWNERDRAW
自绘按钮BS_PUSHBUTTON
命令按钮BS_RADIOBUTTON
单选按钮BS_3STATE
允许按钮有三种状态,即:选中,未选中,未定
创建按钮CButton::Create成员函数:32
Rect-窗口所占据的矩形区域;
pParentWnd-父窗口指针;nId-该窗口的ID值。获取/改变按钮状态:通过调用intCButton::GetCheck得到当前是否被选中,返回0:未选中,1:选中,2:未定。调用voidCButton::SetCheck设置当前选中状态。3、按钮的消息BN_CLICKED:单击按钮消息;BN_DOUBLECLICKED:双击按钮消息。处理按钮消息:要处理按钮消息需要在父窗口中进行消息映射,映射宏为ON_BN_CLICKED(id,memberFun)id为按钮的ID值,就是创建时指定的nID值。处理函数原型为afx_msgvoidmemberFun();演示:P205【例Ex_Ctrls1】Rect-窗口所占据的矩形区域;33voidCEx_CommCtrlsDlg::OnButton1(){ //TODO:Addyourcontrolnotificationhandlercodehere UpdateData(); if(!m_bEnabled)return; intnID=GetCheckedRadioButton(IDC_RADIO1,IDC_RADIO4); if(nID==IDC_RADIO1) { CEditDlgdlg; dlg.DoModal(); } if(nID==IDC_RADIO2) { CListBoxDlgdlg; dlg.DoModal(); } if(nID==IDC_RADIO3) { CComboDlgdlg; dlg.DoModal(); } if(nID==IDC_RADIO4) { CScrollDlgdlg; dlg.DoModal(); }}voidCEx_CommCtrlsDlg::OnCheck1(){ //TODO:Addyourcontrolnotificationhandlercodehere UpdateData(); for(inti=0;i<4;i++) GetDlgItem(IDC_RADIO1+i)->EnableWindow(m_bEnabled);}BOOLCEx_CommCtrlsDlg::OnInitDialog(){……………… //TODO:Addextrainitializationhere CheckRadioButton(IDC_RADIO1,IDC_RADIO4,IDC_RADIO1); OnCheck1(); returnTRUE;//returnTRUEunlessyousetthefocustoacontrol}voidCEx_CommCtrlsDlg::OnButto344.技巧-位图按钮举例位图按钮是以位图(而不是文本)作标题的按钮。可用CBitmapButton位图按钮类和CBitmapButton::AutoLoad()函数实现。一个CBitmapButton对象按钮可以包含四幅位图,即:松开(Up)、按下(Down)、聚焦(Focused)、禁止(disabled),其中第一幅位图是必须的。实现步骤:⑴用对话框资源编辑器在对话框中放置一个命令按钮(Button),并选中Styles卡片中Owner_draw/自绘按钮复选框⑵为按钮设定标题名和ID(如ID编辑框输入:IDC_MYIMAGE,Caption编辑框输入:MYIMAGE)⑶用资源编辑器生成四幅位图,并把位图资源ID设置成与按钮标题相对应的字符串ID
这里要注意位图资源不能用数字ID,而是使用字符串ID(即用双引号将ID标识符括起来),使用格式如下:
4.技巧-位图按钮举例35
"按钮标题名U"-松开(Up)位图
"按钮标题名D"-按下(Down)位图
"按钮标题名F"-聚焦(Focused)位图
"按钮标题名X"-禁止(disabled)位图⑷在对话框类中生成CBitmapButton对象(该类要用#include<afxext.h>)
CBitmapButtonm_BitmapButton;⑸在CDialog::OnInitDialog()函数中调用CBitmapButton::AutoLoad()函数实现位图与按钮的关联此处代码如下:
m_BitmapButton.AutoLoad(IDC_MYIMAGE,this);
"按钮标题名U"-松开(Up)位36
CBitmapButton::AutoLoad函数:格式:BOOLAutoLoad(UINTnID,CWnd*pParent);功能:初始化对话框中的按钮为位图按钮。参数:nID-按钮的ID号;pParent-指向父窗口的指针。⑹建立位图按钮的消息处理机制,这样就可以使用位图按钮了
CBitmapButton::AutoLoad函375.3.2编辑框(EditBox)Edit控件是用来接收用户输入和编辑文本的控件。1.编辑控件的属性和风格见编辑框的属性对话框。2.编辑框的常用操作(1)文本、数字的设置和读取为使编辑控件允许输入和读取不同类型的数据,需要使用对话框数据交据交换DDX(DialogDataeXchange)和数据验证DDV(DialogDataVerification)技术。
DDX技术的实质就是为控件建立一数据映射,DDX接收CDataExchange类(该类提供上下文信息,它没有基类)中的信息,并将数据在指定控件和数据变量或CString对象之间传递。
DDV技术的实质是验证数据的有效性,它主要验证数据是否在给定的最大值和最小值之间。一旦数据超出了有效范围,DDV函数将显示一消息框,并在消息框中给用户提示合理的输入范围。
DDX和DDV的关键技术是DDX全局函数和DDV全局函数(通常DDV函数要与DDX函数成对出现)。5.3.2编辑框(EditBox)38CWnd::UpdateData成员函数:用法1:UpdateData(TRUE);/UpdateData();功能:将对话框中控件的数据传送至相关联的成员变量。用法2:UpdateData(FALSE);功能:将对话框中控件相关联的成员变量的值传送至控件。(2)口令设置当编辑框控件设置口令形式时,用户输入的各字符都被一特殊的字符显示(该特殊字符叫口令字符),缺省的口令字符是星号“*”。应用程序可用CEdit::SetPassWordChar成员函数设置口令字符:格式:voidSetPassWordChar(TCHARch);功能:设置或删除输入文本时显示在编辑控件中的口令字符。参数:ch-设定的口令字符,若为0则显示用户实际输入的字符。
Edit控件口令字符也可通过该控件的Password属性设置,当Password属性设为True时,就会将输入的内容屏蔽为星号“*”。CWnd::UpdateData成员函数:39注:采用这里的方法设置口令存在漏洞,故此法只能用于一般的口令设置(漏洞:当把其Password属性设为True时,虽然我们看来都是星号,但程序中的Edit控件实际仍是用户输入的密码,应用程序可以获取该控件中的密码,其他应用程序也可以通过向Edit控件发送WM_GETTEXT或EM_GETLINE消息来获取Edit控件中的内容。黑客程序正是利用Edit控件的这个特性,当发现当前探测的窗口是Edit控件并且具有ES_PASSWORD属性值时,则通过SendMessage向此编辑控件窗口发送WM_GETTEXT或EM_GETLINE消息,这样Edit框中的内容就一目了然了。注:采用这里的方法设置口令存在漏洞,故此法只能用于一般的口令40(3)选择文本由于在编辑框中编辑文本时,用户可能选择要某一段文本,所以通过voidCEdit::GetSel(int&nStartChar,int&nEndChar)得到用户选择的字符范围,通过调用voidCEdit::SetSel(intnStartChar,intnEndChar,BOOLbNoScroll=FALSE)可以设置当前选择的文本范围,如果指定nStartChar=0、nEndChar=-1则表示选中所有的文本。voidReplaceSel(LPCTSTRlpszNewText,BOOLbCanUndo=FALSE)可以将选中的文本替换为指定的文字。此外编辑框还有一些和剪贴板有关的功能,voidCEdit::Clear()删除选中的文本,voidCEdit::Copy()可将选中的文本送入剪贴板,voidCEdit::Paste()将剪贴板中内容插入到当前编辑框中光标位置,voidCEdit::Cut()
相当于Copy和Clear结合使用。(3)选择文本414.编辑控件的常用消息当编辑框的文本被修改等事件发生时,将向父窗口发送一些消息,常用的消息如下:EN_CHANGE
编辑框中文本更新后产生此消息(映射宏名:ON_EN_CHANGE)EN_ERRSPACE
编辑框无法分配内存时产生此消息(映射宏名:ON_EN_ERRSPACE)EN_KILLFOCUS/EN_SETFOCUS
在编辑框失去/获取输入焦点时产生相应的消息(映射宏名:ON_EN_KILLFOCUS/ON_EN_SETFOCUS)
程序例:P209[例Ex_Ctrls2]程序主要代码附后4.编辑控件的常用消息42BOOLCEditDlg::OnInitDialog(){ CDialog::OnInitDialog();
//TODO:Addextrainitializationhere m_strAve="0.00"; UpdateData(FALSE); returnTRUE;//returnTRUEunlessyousetthefocustoacontrol //EXCEPTION:OCXPropertyPagesshouldreturnFALSE}voidCEditDlg::OnButton1(){ //TODO:Addyourcontrolnotificationhandlercodehere UpdateData(); doubleave=(double)(m_nScore1+m_nScore2+m_nScore3)/3.0; m_strAve.Format("%6.2f",ave); UpdateData(FALSE);}BOOLCEditDlg::OnInitDialog()435.3.3列表框(ListBox)列表框用来列出许多项目供用户选择的控件。1.列表框的风格列表框按性质可分为单选(缺省)、多选、扩展多选、非选四种类型。单选列表框(Single):用户一次只能选择一个选项;多选列表框(Multiple):用户一次只能选择几个选项;扩展多选列表框(Extended):用户可用Mouse拖动或其它特殊组合键进行选择;非选列表框(No):不提供选择功能。见教材P140图表。5.3.3列表框(ListBox)442.列表框基本操作在列表框被创建后,往往要添加、删除、改变或获取列表框中的列表项,该操作可调用ClistBox类成员函数实现。列表框的(列表)项可用字符串标识或用索引确定(索引表明某项在列表框中的位置,它以0为基数,即:第一项索引为0,第二项索引为1,。。。)。(1)添加列表项列表框创建时是一个空表,需要由用户添加或插入一些项。添加列表项可使用ClistBox::AddString成员函数:格式:intAddString(LPCTSTRlpszItem);功能:在列表框中添加字符串文本的一个列表项。若列表框未以LBS_SORT风格创建,则添加字符串到列表的尾部,否则插到列表中。2.列表框基本操作45返回:添加列表项在列表框中的索引。错误返回LB_ERR,空间不足返回LB_ERRSPACE。参数:lpszItem-列表项的文本字符串。CListBox::InsertString用于将列表项插入到指定位置:格式:intInsertString(intnIndex,LPCTSTRlpszItem)功能:将字符串文本插入到指定位置。返回:字符串在列表框中插入位置的索引。错误返回LB_ERR,空间不足返回LB_ERRSPACE。参数:nIndex-指定插入字符串的索引(从0开始)。若为-1,则该串插入到列表的尾部。lpszItem-列表项的文本字符串。返回:添加列表项在列表框中的索引。错误返回LB_ERR,空间46CListBox::SetItemData成员函数:格式:intSetItemData(intnIndex,DWORDdwItemData);功能:设置与列表框中指定列表项相关的32位值。返回:若出错,则返回LB_ERR。参数:nIndex-列表项的索引dwItemData-指定与列表项相关的32位值CListBox::SetItemDataPtr成员函数:格式:intSetItemDataPtr(intnIndex,void*pData);功能:设置与列表框中指定列表项相关的指针。返回:若出错,则返回LB_ERR。CListBox::SetItemData成员函数:47参数:nIndex-列表项的索引。pData-指定与列表项相关的指针。CListBox::SetItemData是将一个32数值与某列表项(由nIndex指定)关联起来,而CListBox::SetItemDataPtr可将数组、结构体等数据与列表项关联。与上面相对应的两个函数CListBox::GetItemData和CListBox::GetItemDataPtr分别用来获取相关联的用户数据。CListBox::GetItemDataPtr函数:格式:void*GetItemDataPtr(intnIndex);功能:获取与指定列表项关联的指针。返回:若调用成功,则返回获取的指针;若发生错误,则返回-1。参数:nIndex-列表项索引(从0开始)。参数:48(2)删除列表项intCListBox::DeleteString(UINTnIndex)成员函数用于删除指定列表项,并返回列表中剩下的列表项个数。voidCListBox::ResetContent()成员函数可删除列表框中所有列表项。通过调用intCListBox::GetCount()成员函数将得到当前列表框中列表项的个数。(3)查找列表项通过调用CListBox::FindString成员函数可以在列表框中查找指定的列表项的位置。格式:intFindString(intnStartAfter,LPCTSTRlpszItem);功能:在列表框中查找指定的字符串的列表项。返回:若查找成功,则返回所匹配的列表项索引,若查找不成功则返回LB_ERR。(2)删除列表项49参数:nStartAfter-查找的开始位置索引号。若为-1,则从头至尾查找。LpszItem-要查找的列表项文本串。(4)选择列表项若获取当前所选列表项,可调用CListBox::GetCurSel成员函数:格式:intGetCurSel();功能:获取列表框中当前所选列表项的索引。若设置某列表项为选中状态,可调用CListBox::SetCurSel成员函数:格式:intSetCurSel(intnIndex);功能:设置列表框中某列表项为选中状态(高亮显示)。参数:nIndex-指定列表项的索引。参数:50若获取某列表项的文本串,可使用CListBox::GetText成员函数:格式:voidGetText(intnIndex,CString&rString);功能:若获取某列表项的字符串。参数:nIndex-列表项的索引。
rString-获取的字符串对象。3.列表框的Notification消息列表框可以向父窗口发六种Notification消息:
LBN_DBLCLK
鼠标双击列表框中某项字符串时产生(映射宏:ON_LBN_DBLCLK)
LBN_ERRSPACE
列表框无法分配内存时产生
LBN_KILLFOCUS/LBN_SETFOCUS
在列表框失去/得到输入焦点时产生
LBN_SELCHANGE
列表框选择的项发生改变时产生
LBN_SELCANCEL
取消当前列表框的选项时产生若获取某列表项的文本串,可使用CListBox::GetTe51使用以上几种消息映射的方法为定义原型如:afx_msgvoidmemberFxn();的函数,并且定义形式如ON_Notification(id,memberFxn)的消息映射。如果在对话框中使用列表框,ClassWizard会自动列出相关的消息,并能自动产生消息映射代码。4.CCheckListBox类(*)在MFC4.2版本中添加了CCheckListBox类(复选列表框类),该类是由CListBox派生并拥有CListBox的所有功能,不同的是可以在每行前加上一个复选框。必须注意的是在创建时必须指明LBS_OWNERDRAWFIXED或LBS_OWNERDRAWVARIABLE风格。使用以上几种消息映射的方法为定义原型如:afx_msgvo52voidCListBoxDlg::OnDataAdd(){ //TODO:Addyourcontrolnotificationhandlercodehere UpdateData(TRUE); if(m_strName.IsEmpty()) { MessageBox("姓名不能为空!"); return; } m_strName.TrimLeft(); m_strName.TrimRight(); if((m_List.FindString(-1,m_strName))!=LB_ERR) { MessageBox("列表框中已有相同姓名,不能添加!"); return; } intnIndex=m_List.AddString(m_strName); SCOREdata; data.score1=m_nScore1; data.score2=m_nScore2; data.score3=m_nScore3; m_List.SetItemDataPtr(nIndex,newSCORE(data));}5示例:P214[例Ex_Ctrls3]voidCListBoxDlg::OnDataAdd()53voidCListBoxDlg::OnDataDel(){ //TODO:Addyourcontrolnotificationhandlercodehere intnIndex=m_List.GetCurSel(); if(nIndex!=LB_ERR) { m_List.DeleteString(nIndex); m_strName.Empty(); m_nScore1=m_nScore2=m_nScore3=0; UpdateData(FALSE); } else MessageBox("当前没有选择项或列表框操作失败!");}voidCListBoxDlg::OnDestroy(){ CDialog::OnDestroy();
//TODO:Addyourmessagehandlercodehere for(intnIndex=m_List.GetCount()-1;nIndex>=0;nIndex--) { delete(SCORE*)m_List.GetItemDataPtr(nIndex); }}voidCListBoxDlg::OnSelchangeList1(){ //TODO:Addyourcontrolnotificationhandlercodehere intnIndex=m_List.GetCurSel(); if(nIndex!=LB_ERR) { m_List.GetText(nIndex,m_strName); SCORE*data=(SCORE*)m_List.GetItemDataPtr(nIndex); m_nScore1=data->score1; m_nScore2=data->score2; m_nScore3=data->score3; UpdateData(FALSE); }}第5章对话框及常用控件课件545.3.4组合框(ComboBox)组合框窗口一般由一个编辑框和一个列表框组成。1.组合框的风格及类型组合框按主要性质可分为简单组合框、下拉式组合框(缺省)、下拉式列表组合框三种类型。简单组合框(Simple):其列表框不用下拉,而是直接显示出来。下拉式组合框(DropDown):Mouse单击下拉按钮后显示下拉的列表框。下拉式列表组合框(DropList):Mouse单击下拉按钮后显示下拉的列表框,但编辑框无效。组合框的其它一些风格见教材P146图表。2.组合框常用操作由于组合框内包含了列表框,所以列表框的功能都能够使用,如:intCComboBox::AddString(LPCTSTRlpszItem)向组合框添加字符串项;5.3.4组合框(ComboBox)55intCComboBox::DeleteString(UINTnIndex)用于删除指定的索引项;intCComboBox::InsertString(intnIndex,LPCTSTRlpszItem)将字符串插入到指定位置;voidCComboBox::ResetContent()可以删除组合框中所有项和编辑文本;intCComboBox::GetCount()获得当前组合框中列表项的个数。如果需要得到/设置当前被选中的项的位置,可以调用intCComboBox::GetCurSel()/intCComboBox::SetCurSel(intiIndex)。通过调用intCComboBox::GetLBText(intnIndex,LPTSTRlpszText)获得组合框内指定列表项的字符串。通过调用intCComboBox::FindString(intnStartAfter,LPCTSTRlpszItem)可以在当前所有项中查找指定的字符串的位置,nStartAfter指明开始查找的位置索引号。intCComboBox::SelectString(intnStartAfter,LPCTSTRlpszItem)可以选择指定的字符串。intCComboBox::DeleteString(UI56此外编辑框的功能都能够使用。CComboBox::GetEditSel用于获取组合框的编辑框中被选中的字符位置:格式:DWORDGetEditSel();功能:获取组合框的编辑框中当前选择的首尾字符位置。返回:LOWORD-开始位置,HIWORD-选择字符串中的最后一个未选字符的位置。若为不含编辑框的下拉式列表组合框,则返回CB_ERR。CComboBox::SetEditSel用于设置组合框的编辑框中被选中的字符位置:格式:BOOLSetEditSel(intnStartChar,intnEndChar);功能:设置组合框的编辑框中要选择的字符位置。返回:成功,则返回非0。参数:nStartChar-指定开始位置。
nEndChar-指定终止位置。此外编辑框的功能都能够使用。57BOOLCComboBox::LimitText(intnMaxChars)用于设置组合框的编辑框中可输入的最大字符数。组合框中编辑控件的剪贴板功能CComboBox::Copy、CComboBox::Clear、CComboBox::Cut、CComboBox::Paste均可以使用。3.组合框的Notification消息组合框可以向父窗口发送11种消息,消息前缀名为CBN_。
CBN_DBLCLK
鼠标双击组合框的某项字符串时产生
CBN_DROPDOWN
组合框的列表框被弹出时产生
CBN_KILLFOCUS/CBN_SETFOCUS
在编辑框失去/获得输入焦点时产生
CBN_SELCHANGE
组合框中选择的列表项改变时产生
CBN_EDITUPDATE
组合框中的编辑框内容被更新时产生
CBN_EDITCHANGE
组合框的编辑框内容改变后产生BOOLCComboBox::LimitText(int58使用以上几种消息映射的方法为定义原型如:afx_msgvoidmemberFxn();的函数,并且定义形式如ON_Notification(id,memberFxn)的消息映射。如果在对话框中使用组合框,ClassWizard会自动列出相关的消息,并能自动产生消息映射代码。4.示例P219【例Ex_Ctrls4】主要程序代码:voidCComboDlg::OnSelchangePattern(){ //TODO:Addyourcontrolnotificationhandlercodehere intnIndex=m_Pattern.GetCurSel(); if(nIndex!=CB_ERR) { m_nDrawPattern=m_Pattern.GetItemData(nIndex); Invalidate(); }}使用以上几种消息映射的方法为定义原型如:afx_ms59voidCComboDlg::OnPaint(){ CPaintDCdc(this);//devicecontextforpainting
//TODO:Addyourmessagehandlercodehere CWnd*pWnd=GetDlgItem(IDC_DRAW); pWnd->UpdateWindow(); CDC*pDC=pWnd->GetDC(); CBrushdrawBrush; drawBrush.CreateHatchBrush(m_nDrawPattern,RGB(0,0,0)); CBrush*pOldBrush=pDC->SelectObject(&drawBrush); CRectrcClient; pWnd->GetClientRect(rcClient); pDC->Rectangle(rcClient); pDC->SelectObject(pOldBrush); //DonotcallCDialog::OnPaint()forpaintingmessages}BOOLCComboDlg::OnInitDialog(){ CDialog::OnInitDialog();
//TODO:Addextrainitializationhere CStringstr[6]={"水平线","竖直线","向下斜线","向上斜线","十字线","交叉线"}; intnIndex; for(inti=0;i<6;i++) { nIndex=m_Pattern.AddString(str[i]); m_Pattern.SetItemData(nIndex,i); } m_Pattern.SetCurSel(0); m_nDrawPattern=0; returnTRUE;//returnTRUEunlessyousetthefocustoacontrol //EXCEPTION:OCXPropertyPagesshouldreturnFALSE}第5章对话框及常用控件课件605.3.5滚动条(ScrollBar)滚动条是由两端的滚动箭头和中间的滚动框和其中的滚动块组成。根据滚动条的走向可分为水平滚动条和垂直滚动条两种。1.滚动条基本操作MFC中,CScrollBar类是对滚动条控件提供支持的类,它封装了滚动条控件的各种操作,包括设置和获取滚动条的范围及滚动块的位置等。在创建滚动条后需要调用CScrollBar::SetScrollRange设置滚动范围:格式:voidSetScrollRange(intnMinPos,intnMaxPos,BOOLbRedraw=TRUE);功能:设置滚动块在滚动条控件中的范围。参数:nMinPos-指定滚动块最小滚动位置。
nMaxPos-指定滚动块最大滚动位置。
bRedraw-重画标志,为TRUE时表示滚动条被重画。5.3.5滚动条(ScrollBar)61CScrollBar::SetScrollPos用来设置当前滚动块在滚动条控件的位置:格式:intSetScrollPos(intnPos,BOOLbRedraw=TRUE);功能:设置当前滚动块在滚动条控件的位置。返回:滚动块在滚动条控件的原位置。参数:nPos-新的滚动块位置。bRedraw-重画标志,为TRUE时表示滚动条被重画。CScrollBar::SetScrollPos用来设置当62CScrollBar::GetScrollRange用于获得滚动范围:格式:voidGetScrollRange(LPINTlpMinPos,LPINTlpMaxPos);功能:获取滚动块在滚动条控件中的范围。参数:lpMinPos-得到指向滚动块最小滚动位置的指针。lpMaxPos-得到指向滚动块最大滚动位置的指针。CScrollBar::GetScrollPos用来获得当前滚动块在滚动条控件的位置:格式:intGetScrollPos();功能:获得当前滚动块在滚动条控件的位置。CScrollBar::GetScrollRange用于获得63
CScrollBar::ShowScrollBar成员函数:格式:voidShowScrollBar(BOOLbShow=TRUE);功能:显示/隐藏滚动条。
CScrollBar::EnableScrollBar成员函数:格式:BOOLEnableScrollBar(UINTnArrowFlags=ESB_ENABLE_BOTH);功能:设置滚动条上箭头是否为允许状态。nArrowFlags可取以下值:
ESB_ENABLE_BOTH
两个箭头都为允许状态
ESB_DISABLE_LTUP
上/左箭头为禁止状态
ESB_DISABLE_RTDN
下/右箭头为禁止状态
ESB_DISABLE_BOTH
两个箭头都为禁止状态CScrollBar::ShowScrollBar成员函642.WM_VSCROLL和WM_HSCROLL消息当用户对滚动条进行操作时,滚动条会向父窗口发送WM_VSCROLL或WM_HSCROLL消息(分别对应于水平滚动条和垂直滚动条)。这些消息可通过ClassWizard在滚动条的父窗口中进行映射,并产生相应的消息处理函数OnHScroll和OnVScroll,函数原型如下:afx_msgvoidOnVScroll(UINTnSBCode,UINTnPos,CScrollBar*pScrollBar);afx_msgvoidOnHScroll(UINTnSBCode,UINTnPos,CScrollBar*pScrollBar);所使用的消息映射宏为:ON_WM_VSCROLL()/ON_WM_HSCROLL(),在映射宏中不需要指明滚动条的ID,因为所有滚动条的滚动消息都由同样的函数处理。在OnHScroll/OnVScroll中,第二个参数nPos为滚动块的当前位置,第三个参数pScrollBar指明当前滚动条的指针,第一个参数nSBCode表示滚动条上发生的动作(即滚动条控件的通知消息),可取以下值:2.WM_VSCROLL和WM_HSCROLL消息65
SB_TOP/SB_BOTTOM
已滚动到顶/底部时产生此消息
SB_LINEUP/SB_LINEDOWN
向上/下滚动一行时产生此消息
SB_PAGEDOWN/SB_PAGEUP
向上/下滚动一页时产生此消息
SB_THUMBPOSITION滚动块拖动到某位置时产生此消息
SB_THUMBTRACK拖动滚动块时产生此消息
SB_ENDSCROLL
停止滚动时产生此消息(用户松开鼠标)滚动条控件的通知消息详见P223表5.21。SB_TOP/SB_BOTTOM已滚动到顶/底部时产生此665.3.6滑动条和旋转按钮一、滑动条滑动条控件是由滑动块(或滑杆)和可选刻度线构成的窗口。移动滑杆时,控件将发送通知消息。(1)滑动条的风格见教材P227表5.23。(2)滑动条的基本操作MFC的CSliderCtrl类封装了滑动条控件的各种操作,包括范围、位置设置和获取等。下面对CSliderCtrl类的常用成员函数进行介绍。5.3.6滑动条和旋转按钮671)设置和获取滑动条的位置和范围CSliderCtrl::SetPos成员函数:格式:voidSetPos(intnPos);功能:设置滑动块在滑动条控件中的当前位置。参数:nPos-新的滑动块位置。CSliderCtrl::SetRange成员函数:格式:voidSetRange(intnMin,intnMax,BOOLbRedraw=FALSE);功能:设置滑动块在滑动条控件中的范围(最大和最小值)。参数:nMin-滑动块的最小位置。nMax-滑动块的最大位置。bRedraw-重画标志,为TRUE时表示滑动条被重画。1)设置和获取滑动条的位置和范围68CSliderCtrl::GetPos成员函数:格式:intGetPos();功能:获取滑动块在滑动条控件中的当前位置。返回:滑动块在滑动条控件中的当前位置。CSliderCtrl::GetRange成员函数:格式:voidGetRange(int&nMin,int&nMax);功能:获取滑动块在滑动条控件中的范围(最大和最小值)。参数:nMin-得到滑动块的最小位置。nMax-得到滑动块的最大位置。CSliderCtrl::GetPos成员函数:692)设置和清除刻度线尺寸CSliderCtrl::SetTic成员函数:格式:BOOLSetTic(intnTic);功能:设置在滑动条控件中刻度线的位置。返回:若刻度线被设置,则返回非0,否则返回0。参数:nTic-刻度线的位置。CSliderCtrl::SetTicFreq成员函数:格式:voidSetTicFreq(intnFreq);功能:设置在滑动条控件中刻度线的间隔(即疏密程度)。参数:nFreq-刻度线的间隔。CSliderCtrl::ClearTics成员函数:格式:voidClearTics(BOOLbRedraw=FALSE);功能:删除滑动条控件中的刻度线。参数:bRedraw-重画标志,为TRUE时表示选择清除后滑动条被重画。2)设置和清除刻度线尺寸703)设置和获取选择范围CSliderCtrl::SetSelection成员函数:格式:voidSetSelection(intnMin,intnMax);功能:设置滑动条
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年中国无线固定接入台市场调查研究报告
- 2025年中国方锤T型组合市场调查研究报告
- 2025年中国数码多媒体音箱市场调查研究报告
- 2025-2030年中国井控装置行业市场发展态势及投资潜力研究报告
- 肇庆市实验中学高中生物一:细胞的多样性和统一性习题课
- 肇庆市实验中学高中生物:第六章细胞生命历程及减数分裂测试卷评讲(第2课时)教案
- 小学一年级语文下册《动物儿歌》课文仿写范文素材
- 新疆司法警官职业学院《计算方法(Ⅱ)》2023-2024学年第二学期期末试卷
- 2025年中国自动崩解时限检查仪数据监测研究报告
- 新疆伊宁市第七中学2025年初三下-第三次月考数学试题试卷含解析
- 西部计划考试考题及答案
- 2024上海市招聘社区工作者考试题及参考答案
- 2024年河北省初中学业水平适应性测试生物学试卷
- DB37-T 2673-2019 医疗机构能源消耗定额标准-(高清版)
- 2023届毕业论文格式要求(福建农林大学)
- 玻璃工艺学:第8章 玻璃的熔制
- 黄元御“下气汤十二方”治诸多内科杂病疑难重症
- 第3章品牌识别及品牌符号
- 肝硬化-本科授课课件
- 城镇供热管网工程施工组织设计
- 《蒋勋眼中的宋词》阅读练习及答案
评论
0/150
提交评论