400 likes | 533 Views
第四章. Windows 界面设计. Windows 界面设计. 对话框、编辑框、按钮、列表控件、树形控件等界面设计能使程序支持用户输入的手段更加丰富。. 对话框. 对话框用于显示消息和取得用户数据,是 Windows 应用程序中最常用的用户界面。 对话框可以作为一个容器,通常包括各种控件,如编辑框、按钮、组合框和列表框等。 用户通过在编辑框中输入信息,通过对列表框、单选框等的选择,为应用程序提供必要的数据。 对话框有两种类型: 模式对话框 和 非模式对话框 。这两种形式的对话框在打开和关闭方式上存在区别。
E N D
第四章 Windows界面设计
Windows 界面设计 对话框、编辑框、按钮、列表控件、树形控件等界面设计能使程序支持用户输入的手段更加丰富。
对话框 • 对话框用于显示消息和取得用户数据,是Windows应用程序中最常用的用户界面。 • 对话框可以作为一个容器,通常包括各种控件,如编辑框、按钮、组合框和列表框等。 • 用户通过在编辑框中输入信息,通过对列表框、单选框等的选择,为应用程序提供必要的数据。 • 对话框有两种类型:模式对话框和非模式对话框。这两种形式的对话框在打开和关闭方式上存在区别。 • MFC的Dialog 类是对话框类的基类,提供了对话框的打开、关闭和管理对话框及对话框中的控件等功能。
对话框 • 定义对话框资源 • 首先定义一个对话框资源。在WORKSPACE窗口当中RESOURCE一页,在DIALOG小图标上单击鼠标右键,弹出菜单,选择INSERT命令。 • 然后在弹出的资源类型对话框中选择DIALOG,表示添加一个对话框资源。单击NEW按钮。 • 对话框上面已经有了两个按钮:OK和CANCEL。它们的作用分别是确认用户通过对话框进行的输入和取消前面的输入工作。选中按扭后单击右键,可以把它们的相关属性,如标题分别改为确定和取消等。然后根据需要布置其它的控件。 • 要使这个对话框真正实现它的功能,必须在程序当中定义一个使用这个资源的对话框类。
对话框的属性 • General选项卡 • Styles选项卡 • More Styles选项卡 • Extended Styles选项卡
CDialog类 在MFC中,对话框窗口的功能主要由CWnd和CDialog两个类实现。 MFC通过CDialog来封装对话框的功能。CDialog从CWnd继承了窗口类的功能(包括CWnd实现的有关功能),并添加了新的成员变量和函数来处理对话框。
CDialog的成员函数: • 构造函数: • CDialog( LPCTSTR lpszTemplateName, CWnd* pParentWnd = NULL ); • CDialog( UINT nIDTemplate, CWnd* pParentWnd = NULL ); • CDialog( ); CDialog重载了三个构造函数。其中,第三个是缺省构造函数;第一个和第二个构造函数从指定的对话框模板资源创建,pParentWnd指定了父窗口或所属窗口,若空则设置父窗口为应用程序主窗口。 在构造函数中初始化主要是针对对话框的数据成 员。
成员函数 Create根据模板创建无模式对话框 CreateIndirect根据内存中的模板创建无模式对话框 InitModalIndirect根据内存中的模板创建模式对话框 DoModal 创建并显示静态对话框 OnInitDialog 重载该方法可以修改对话框的初始化设置 OnSetFont重载该方法可以修改对话框使用的字体
成员函数 OnOK重载该方法可以进行OK按钮的操作,默认时关闭对话框,DoMododal返回IDOK. OnCancel重载该方法可以进行Cancel按钮的操作,默认时关闭对话框,DoMododal返回IDCANCEL. MapDialogRect对话框的矩形单位转换为屏幕单位 NextDlgCtrl将对话框的焦点移到下一个控件上 PrevDlgCtrl将对话框的焦点移到上一个控件上 GotoDlgCtrl将对话框的焦点移到指定控件上
成员函数 SetDefID设置对话框的默认按钮 SetHelpID设置对话框上下文的HelpID EndDialog对话框的矩形单位转换为屏幕单位
对话框 • 为对话框类加入成员变量 利用ClassWizard可以很方便地为对话框类CRegisterDialog加入成员变量。操作步骤如下: • 按Ctrl+W进入ClassWizard。 • 选择ClassWizard上部的Member Variables标签,然后在Class name栏中选择CRegisterDialog。这时,在下面的变量列表中会出现对话框控件的ID。 • 双击列表中的ID_AGE会弹出Add Member Variable对话框,在Member variable name栏中输入m_nAge,在Category栏中选择Value,在Variable type栏中选择UINT。按OK按钮后,数据变量m_nAge就会被加入到变量列表中。 • 仿照上一步和事先设计的成员变量表,为各个控件加入相应的成员变量。
对话框 • 为对话框类加入成员变量
当控件和变量关联上了之后,在对话框的头文件中会多一个成员变量:当控件和变量关联上了之后,在对话框的头文件中会多一个成员变量: double m_yuwen; 在对话框对应的源文件中找到DoDataExchage函数会发现多了条代码: DDX_Text(pDX, IDC_EDIT1, m_yuwen);
编写对话框的消息处理函数 通过类向导为对话框添加消息映射和消息处理函数。 MessageBox(LPCTSTR lpText, LPCTSTR lpCaption, UINT uType);参数含义:LPCTSTR lpText —— 对话框的内容LPCTSTR lpCaption —— 对话框的标题UINT uType ——窗口的风格
MB_ICONEXCLAMATION —— 显示图标为惊叹号MB_ICONQUESTION —— 显示图标为问号MB_ICONSTOP —— 显示图标为红叉叉MB_ABORTRETRYIGNORE —— 显示终止、重试、忽略按钮MB_OK —— 只显示确定按钮MB_OKCANCEL —— 显示确定和取消按钮MB_RETRYCANCEL —— 显示重试和取消按钮同时应用多个风格的时候用|连接。
对话框 • 对话框的数据交换机制 : • 对话框数据交换(DDX,Dialog Data Exchange) 实现用户与对话框之间的数据交换。其实现函数如下: DDX_Custom(pDX,nIDC,field) • 对话框数据验证 (DDV,Dialog Data Validation)用于验证对话框输入数据的有效性,其实现函数如下: DDV_Custom(pDX,field,...) pDX:一个指向CDataExchang对象的指针 nIDC:表示进行数据交换控件的ID field:表示类中的成员变量。
不直接调用DoDataExchage函数,由CWnd成员函数UpdateData来调用。不直接调用DoDataExchage函数,由CWnd成员函数UpdateData来调用。 UpdateData(TRUE)->从对话框的控件传送到相应的数据成员变量中; UpdateData(FALSE)->从数据成员变量传送到相应的对话框的控件; • 对话框的运行机制: • 1)在堆栈上以变量的形式构建一个对话框对象。 • 2)调用CDialog::DoModal ( ),负责对模态话框的创建和撤销。
相关控件介绍 1.静态控件: Static text静态文本框、Picture、Group box 作用:显示静态的文本、图标、位图或图 元文件。
2.Edit Box控件 此控件自动支持右键弹出菜单。 SetWindowText/GetWindowText用于设置/得到当前显示的文本。 GetLimitText/SetLimitText可以得到/设置在输入框中输入的字符数量。 GetSel( int& nStartChar, int& nEndChar )得到用户选择的字符范围 void Clear( );删除选中的文本,void Copy( );可将选中的文本送入剪贴板,void Paste( );将剪贴板中内容插入到当前输入框中光标位置,void Cut( );相当于Copy和Clear结合使用。
3.Radio Box控件 单选按钮表示一系列的互斥选项。 成员函数: SetCheck设置单选按钮的选中状态。 SetCheck(1)按钮被选中; SetCheck(0)清除选中按钮的选中状态; GetCheck得到单选按钮的状态(0为未选中,1为 选中) GetCheckedRadioButton(int nIDFirstButton, int nIDLastButton)一组中被选中的按钮的ID
4.Check Box控件 成员函数: SetCheck()设置某一复选框的选中状态。 GetCheck()得到某一复选框状态。
5.Combo Box控件 组合框可以看作是一个编辑框或静态文本 框与一个列表框的组合 成员函数: int GetCurSel( )/int SetCurSel(int iIndex)得到/设置当前被选中的行的位置。 int GetLBText得到列表框内指定行的字符串。
非模态对话框 • 非模式对话框和模式对话框的主要区别是: • 非模式对话类的实例声明为全局对象或用new操作符生成。因为显示函数返回后,非模式对话框通常还要继续打开。 • 非模式对话框的显示使用CDialog::Create函数而非CDialog::DoModal函数。CDialog::Create立即返回,但非模式对话框继续保持。 • 关闭非模态对话框使用CWnd::Destroy函数而不是EndDialog函数。因而不能使用MFC为OK按钮和Cancel按钮提供的缺省处理。需要自定义OnCancle消息处理函数处理非模式对话框的关闭,如果有OK按钮,还要定义OnOk函数消息处理函数。
将模态对话框改成非模态对话框 1.在CxxxView.h中添加对话框指针 CDialogview * m_pDialogview (对话框的类名 * 指针名) 2.在CxxxView.h中添加对话框的头文件函数名 #include “Dialogview.h” 3.在打开对话框的菜单命令函数中加入“创建非模态对话框并显示函数” • if(m_pDialogview==NULL) • { • m_pDialogview=new CDialogview; • m_pDialogview->Create(IDD_MODAL_DIALOG,this); • } • m_pDialogview-> ShowWindow(SW_SHOW); m_pDialogview->SetActiveWindow();注意:visible属性必选上
4.在构造函数和析构函数中添加初始化指针代码4.在构造函数和析构函数中添加初始化指针代码 m_pDialogview = NULL;(构造函数中) 析构函数中: if(m_pDialogview != NULL) { delete m_pDialogview;//释放空间 }
公用对话框 • Color对话框 • CColorDialog的构造函数为: CColorDialog( COLORREF clrInit = 0, DWORD dwFlags = 0, CWnd* pParentWnd = NULL ); clrInit用来指定初始的颜色选择,dwFlags用来设置对话框,pParentWnd用于指定对话框的父窗口或拥有者窗口。
公用对话框 • 文件对话框的构造函数为: CFileDialog( BOOL bOpenFileDialog, LPCTSTR lpszDefExt = NULL, LPCTSTR lpszFileName = NULL, DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, LPCTSTR lpszFilter = NULL, CWnd* pParentWnd = NULL ); 参数bOpenFileDialog将创建Open对话框或者Save As(保存文件)对话框。lpszDefExt用来指定缺省的文件扩展名。lpszFileName用于规定初始文件名。dwFlags用于设置对话框的一些属性。lpszFilter指向一个过滤字符串。pParentWnd是指向父窗口或拥有者窗口的指针。
公用对话框 • Find/Replace对话框 • 要启动Find/Replace对话框,应该调用CFindReplaceDialog::Create函数: BOOL Create( BOOL bFindDialogOnly, LPCTSTR lpszFindWhat, LPCTSTR lpszReplaceWith = NULL, DWORD dwFlags = FR_DOWN, CWnd* pParentWnd = NULL ); 当参数bFindDialogOnly创建Find对话框或者Replace对话框。lpszFindWhat指定了要搜索的字符串,lpszReplaceWith指定了用于替换的字符串。dwFlags用来设置对话框,参数pParentWnd指明了对话框的父窗口或拥有者窗口。
公用对话框 • CFontDialog对话框 CFontDialog类的构造函数如下所示: CFontDialog( LPLOGFONT lplfInitial = NULL, DWORD dwFlags = CF_EFFECTS | CF_SCREENFONTS, CDC* pdcPrinter = NULL, CWnd* pParentWnd = NULL ); 参数lplfInitial指向一个LOGFONG结构,用来初始化对话框中的字体设置。dwFlags用于设置对话框。pdcPrinter指向一个代表打印机的CDC对象,若设置该参数,则选择的字体就为打印机所用。pParentWnd用于指定对话框的父窗口或拥有者窗口。
公用对话框 • CPrintDialog对话框 CPrintDialog对话框的构造函数是: CPrintDialog( BOOL bPrintSetupOnly, DWORD dwFlags = PD_ALLPAGES | PD_USEDEVMODECOPIES | PD_NOPAGENUMS | PD_HIDEPRINTTOFILE | PD_NOSELECTION, CWnd* pParentWnd = NULL ); 参数bPrintSetupOnly创建Print对话框或者Print Setup对话框。dwFlags用来设置对话框,缺省设置是打印出全部页,禁止From和To编辑框(即不用确定要打印的页的范围),PD_USEDEVMODECOPIES使对话框判断打印设备是否支持多份拷贝和校对打印(Collate),若不支持,就禁止相应的编辑控件和Collate检查框。pParentWnd用来指定对话框的父窗口或拥有者窗口。
基本控件 —静态控件 • 静态控件主要用于标签文本、矩形框、位图、光标、图标等可视化对象的显示。CStatic类封装了静态控件,该类对象的Create函数如下: BOOL Create( LPCTSTR lpszText, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID = 0xffff ); 其中lpszText指定控件中的文本;dwStyle指定静态控件风格;rect指定位置和大小;pParentWnd为CStatic对象父窗口句柄,不能为NULL;nID为对象的ID标识。 • CStatic类的成员函数包括: • SetBitmap/ GetBitmap:指定/获取显示的位图; • SetIcon/GetIcon:指定/获取显示的图标; • SetCursor/GetCursor:指定/获取显示的光标; • SetEnhMetaFile/GetEnhMetaFile:指定/获取增强的图元文件。
基本控件 —按钮控件 • 按钮控件可分为命令按钮(Pushbutton)、检查框(Check Box)、单选按钮(Radio Button)、组框(Group Box)和自绘式按钮(Owner-draw Button)。 CButton类的成员函数Create负责创建按钮控件: BOOL Create( LPCTSTR lpszCaption, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID ); • CButton 类的成员函数包括: • UINT GetState( ) const;返回按钮控件的各种状态。 • int GetCheck( ) const;返回检查框或单选按钮的选择状态。 • void SetCheck( int nCheck );设置检查框或单选按钮的选择状态。 • UINT GetButtonStyle( ) const;获得按钮控件的BS_XXXX风格。 • void SetButtonStyle( UINT nStyle, BOOL bRedraw = TRUE );设置按钮风格。 • HICON SetIcon( HICON hIcon );设置按钮显示的图标。 • HICON GetIcon( ) const;返回以前用SetIcon设置的按钮图标。 • HCURSOR SetCursor( HCURSOR hCursor );设置按钮显示的光标图。 • HCURSOR GetCursor( );返回以前用GetCursor设置的光标。
基本控件 —编辑框控件 • 编辑框控件实际上是一个简易的正文编辑器,用户可以在编辑框中输入并编辑文本。 MFC的CEdit类封装了编辑框控件。CEdit类的成员函数Create负责创建按钮控件: BOOL Create( DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID ); • CEdit 类的成员函数包括: • void GetWindowText( CString& rString ) const;用来获得窗口的标题或控件中的正文。 • void GetSel( int& nStartChar, int& nEndChar ) const;用来获得所选正文的位置。 • int LineLength( int nLine = –1 ) const;用于获取指定字符索引所在行的字节长度。 • void SetWindowText( LPCTSTR lpszString );用来设置窗口的标题或控件中的正文 。 • void ReplaceSel( LPCTSTR lpszNewText, BOOL bCanUndo = FALSE );用来将所选正文替换成指定的正文。
基本控件 —列表框控件 • 列表框主要用于输入,它允许用户从所列出的表项中进行单项或多项选择,被选择的项呈高亮度显示 。MFC的CListBox类封装了列表框。CListBox类的Create成员函数负责列表框的创建: BOOL Create( DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID ); • CListBox 类的成员函数包括: • int AddString( LPCTSTR lpszItem );用来往列表框中加入字符串。 • int InsertString( int nIndex, LPCTSTR lpszItem );用来在列表框中的指定位置插入字符串。 • int DeleteString( UINT nIndex );用于删除指定的列表项。 • void ResetContent( );该函数用于清除所有列表项。 • int Dir( UINT attr, LPCTSTR lpszWildCard );该函数用来向列表项中加入所有与指定通配符相匹配的文件名或驱动器名。
基本控件 —组合框控件 • 组合框把一个编辑框和一个单选择列表框结合在一起。用户既可以在编辑框中输入,也可以从列表框中选择一个列表项来完成输入。 MFC的CComboBox类封装了组合框。CComboBox的成员函数Create负责创建组合框: BOOL Create( DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID ); • CComboBox 类的成员函数绝大多数与CListBox的成员函数类似 。
基本控件 —滚动条控件 • 滚动条主要用来从某一预定义值范围内快速有效地进行选择。滚动条分垂直滚动条和水平滚动条两种。MFC的CScrollBar类封装了滚动条控件。CScrollBar类的Create成员函数负责创建控件: BOOL Create( DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID ); • CScrollBar 类的成员函数包括: • int GetScrollPos( ) const;该函数返回滚动框的当前位置。 • int SetScrollPos( int nPos, BOOL bRedraw = TRUE );将滚动框移动到指定位置。 • void GetScrollRange( LPINT lpMinPos, LPINT lpMaxPos ) const;对滚动条的滚动范围进行查询。 • void SetScrollRange( int nMinPos, int nMaxPos, BOOL bRedraw = TRUE );用于指定滚动条的滚动范围。 • BOOL GetScrollInfo( LPSCROLLINFO lpScrollInfo, UINT nMask );用来获取滚动条的各种状态,包括滚动范围、滚动框的位置和页尺寸。 • BOOL SetScrollInfo( LPSCROLLINFO lpScrollInfo, BOOL bRedraw = TRUE );该函数用于设置滚动条的各种状态。
特殊控件—微调按钮控件 • 微调按钮主要用于数字调节,通常和编辑框或静态文本组成一个多部件控件来共同显示和控制某一个值。 MFC的CSpinButtonCtrl类封装了微调按钮的功能。CSpinButtonCtrl的成员函数Create负责创建控件: BOOL Create( DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID ); • CSpinButtonCtrl类的成员函数: • void GetRange( int &lower, int& upper ) const;void SetRange( int nLower, int nUpper );查询和设置微调按钮值的范围。 • int GetPos( ) const;int SetPos( int nPos );用来查询和设置微调按钮的当前值。 • UINT GetBase( ) const;int SetBase( int nBase );用来查询和设置微调按钮值的计数制。 • CWnd* GetBuddy( ) const;CWnd* SetBuddy( CWnd* pWndBuddy );查询和设置微调按钮的伙伴。 • UINT GetAccel( int nAccel, UDACCEL* pAccel ) const;BOOL SetAccel( int nAccel, UDACCEL* pAccel );用来查询和设置微调按钮的加速值。
特殊控件—滑动条控件 • 滑动条带有一个轨道和滑标,在轨道上通常标有刻度,用户通过移动滑标,可以在一个指定的范围内选择一个不精确的值。 MFC的CSliderCtrl类封装了滑动条。CSliderCtrl类的Create成员函数负责控件的创建: BOOL Create( DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID ); • CSliderCtrl 类的成员函数: • void GetRange( int &lower, int& upper ) const;void SetRange( int nLower, int nUpper );查询和设置滑动条的范围。 • int GetPos( ) const;int SetPos( int nPos );用来查询和设置滑动条的当前值。 • int GetLineSize( ) const;int SetLineSize( int nSize );查询和设置在按一下左箭头键或右箭头键时滑标的移动量,该移动量的缺省值是1个单位。 。 • int GetPageSize( ) const;int SetPageSize( int nSize );查询和设置滑标的块移动量 。 • BOOL SetTic( int nTic );指定位置设置刻度。
特殊控件—标签控件 • 标签控件是用来在一个窗口(如对话框等)中的同一用户区域控制多组显示信息或控制信息,由顶部的一组标签来控制不同的信息提示。 MFC的CTabCtrl类封装了标签控件。该类的Create成员函数负责创建控件: BOOL Create( DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID ); • CTabCtrl类的主要成员函数: • int GetCurSel( )/int SetCurSel( int nItem );用于得到/设置当前被选中的页位置。 • BOOL DeleteItem( int nItem )/BOOL DeleteAllItems( );用于删除指定/所有页面。 • void RemoveImage( int nImage );用于删除某页选择位置上的图标。
特殊控件—树型控件 • 树型控件主要用来显示具有一定层次结构的数据项,如资源管理器中的磁盘目录等,以供用户在其中进行各种选择。 MFC的CTreeCtrl类封装了树型控件。该类的Create成员函数负责创建控件: BOOL Create( DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID ); • CTreeCtrl类的成员函数: • GetCount:树控件中的总项目数。 • GetRootItem /GetChildItem/GetParentItem/GetPrevSiblingItem/GetNextSiblingItem :获得树控件的根项目/子项目/父项目/前一个/后一个兄弟项目 。 • GetSelectedItem:获得被用户选中的项目。 • ItemHasChildren:监测项目是否有子目录。 • SetItemText/GetItemText:设置/获得项目的标签文本。 • InsertItem /DeleteItem :向树控件插入/删除一个新项目。 • Expand:根据参数展开或隐藏项目的所有子目录。 • SortChildren:将指定项目的所有子目录按字母顺序排列。 • SortChildrenCB:将指定项目的所有子项目按程序指定顺序排列。 • SelectSetFirstVisible: 设置指定项目为树控件中的第一个可见的项目