660 likes | 953 Views
第 8 章 高级控件. 第 8 章 高级控件. 本章主要讲述高级控件及其应用的实例。. 8.1 高级控件简介. 新的 Win32 控件及其控件类 :. 8.2 动画控件. Windows 支持一种动画控件( Animate control ),动画控件可以播放 AVI 格式的动画片( AVI Clip ),动画片可以来自一个 AVI 文件,也可以来自资源中。动画控件可以用来显示无声的动画。如果视频剪辑文件中带有声音,则不能使用动画控件来显示。. 8.2.1 动画控件的样式.
E N D
第8章 高级控件 本章主要讲述高级控件及其应用的实例。
8.1 高级控件简介 新的Win32控件及其控件类 :
8.2 动画控件 Windows 支持一种动画控件(Animate control),动画控件可以播放AVI格式的动画片(AVI Clip),动画片可以来自一个AVI文件,也可以来自资源中。动画控件可以用来显示无声的动画。如果视频剪辑文件中带有声音,则不能使用动画控件来显示。
8.2.1 动画控件的样式 动画控件的样式可以在Properties对话框的Styes属性页进行设置 。
8.2.2 CAnimateCtrl类 MFC的CAnimateCtrl类封装了动画控件, CAnimateCtrl类主要的成员函数包括: • BOOL Open(LPCTSTR lpszFileName ); Open函数从AVI文件或资源中打开动画片,如果参数lpszFileName或nID为NULL,则系统将关闭以前打开的动画片。若成功则函数返回TRUE。 • BOOL Play( UINT nFrom, UINT nTo, UINT nRep ); 该函数用来播放动画片。参数nFrom指定了播放的开始帧的索引,索引值必须小于65536,若为0则从头开始播放。nTo指定了结束帧的索引,它的值必须小于65536,若为-1则表示播放到动画片的末尾。nRep是播放的重复次数,若为-1则无限重复播放。若成功则函数返回TRUE。
CAnimateCtrl类的成员函数(续) • BOOL Seek(UINT nTo); 该函数用来静态地显示动画片的某一帧。参数nTo是帧的索引,其值必须小于65536,若为0则显示第一帧,若为-1则显示最后一帧。若成功则函数返回TRUE。 • BOOL Stop(); 停止动画片的播放。若成功则函数返回TRUE。 • BOOL Close(); 关闭并从内存中清除动画片。若成功则函数返回TRUE。
把动画片放进资源里: 操作步骤: 1.在程序的资源视图中单击鼠标右键,并在弹出菜单中选择Import...命令。 2.在文件选择对话框中选择.avi文件,按Import按钮退出。 3.按Import按钮退出后,会出现一个Custom Resource Type对话框,。如果是第一次向资源中加入AVI文件,那么应该在Resource type编辑框中为动画片类资源起一个名字(如AVI),若以前已创建过AVI型资源,则可以在直接在列表框中选择AVI型。按OK后,.avi就被加入到资源中。
动画控件的使用实例: 下面的这段代码打开并不断重复播放一个资源动画,它们通常是位于OnInitDialog函数中: m_AnimateCtrl.Open(IDR_AVI1) m_AnimateCtrl.Play(0,-1,-1); 注:动画控件只能播放一些简单的,颜色数较少的AVI动画。
8.3 标签控件 标签控件(Tab Control)是用来在一个窗口,如对话框中的同一用户区域控制多组显示信息或控制信息,由顶部的一组标签来控制不同的信息提示; 标签既可以是文本说明也可以是一个代表文本含义的图标,或是两者的组合。
8.3.1 标签控件的样式 标签控件的样式可以在Properties对话框的Styes属性页进行设置,如图所示:
8.3.2 CTabCtrl类 标签控制在MFC中只存在一种封装形式,即控制类CtabCtrl 。类CTabCtrl的成员函数 如下:
8.3.3 标签控制的操作方法 • CTabCtrl类有一个成员函数InsertItem,它的原型是: BOOL InsertItem(int nItem,TC_ITEM*pTabCtrlItem); 其中第一个参数是加入项目的序号,此序号将在调用CTabCtrl的另一个成员函数GetCurSel()时作为返回值。
标签控制的操作方法(续) • 与GetCurSel()对应的就是SetCurSel(int nItem),SetCurSel函数可改变标签控件当前选定的项目,其中nItem就是该项目的序号。 • InsertItem的关键在于第二个参数PTabCtrlItem。这是一个指向TC_ITEM结构的指针。 TC_ITEM结构的定义如下:
TC_ITEM结构的定义: • typedef struct_TC_ITEM • { • UINT mask; //标签控件的类型 • UINT lnReserved1; //VC保留,勿用 • UINT lnReserved2; //VC保留,勿用 • LPSTR pszText; //标签控件的项目文字 • int cchTextMax; // pszText的长度 • int iImage; // 标签控件的图形序号 • LPARAM lParam; // 用于交换的数据 • }TC_ITEM;
TC_ITEM结构定义中的变量说明: • Mask:指定标签控件的类型。 它可以是以下三个值: TCIF_TEXT: pszText成员有效 TCIF_IMAGE :iImage成员有效 TCIF_PARAM :iParam成员有效 如果要使用多个属性,应该用按位或运算符”|”连接。例如要使pszText和iImage成员同时有效,则用TCIF_TEXT|TCIF_IMAGE作为mask的值。 • pszText 标签控件的项目文字,可直接赋予字符串值。此时标签控件的类型必须有TCIF_TEXT。 • 在编程中,真正经常使用的只有mask、pszText、iImage三个成员变量。
8.3.4 应用实例 步骤1.新建基于对话框的工程Eg8_1; 步骤2.在对话框资源上面添加TAB控件和两个静态控件,两个静态控件ID资源号为IDC_STATIC1和IDC_STATIC2其中标题对应为“这是第一个标签”、 “这是第二个标签”,TAB控件的资源号为IDC_TAB1;
应用实例(续) 步骤3.为TAB控件添加成员变量m_Ctrl类型为CtabCtrl; 步骤4.重载对话框类的的OnInitDialog()函数; 重载以后的函数如下: • BOOL CEg8_1Dlg::OnInitDialog() • {CDialog::OnInitDialog(); • …… • TC_ITEM tcItem;//添加标签 • tcItem.mask=TCIF_TEXT; • tcItem.pszText="标签1"; • m_Ctrl.InsertItem(0,&tcItem); • tcItem.pszText="标签2"; • m_Ctrl.InsertItem(1,&tcItem); • m_Ctrl.SetCurSel(0); • …… • }
应用实例(续) 步骤5.添加响应函数。 完善OnSelchangeTab1()函数: • void CEg8_1Dlg::OnSelchangeTab1(NMHDR* pNMHDR, LRESULT* pResult) • { • // TODO: Add your control notification handler code here • int i=m_Ctrl.GetCurSel();//所选标签号
应用实例(续) • if(i==1) { • GetDlgItem(IDC_STATIC2)->ShowWindow(TRUE); • GetDlgItem(IDC_STATIC1)->ShowWindow(SW_HIDE); • } • else • { • GetDlgItem(IDC_STATIC1)->ShowWindow(SW_SHOW); • GetDlgItem(IDC_STATIC2)->ShowWindow(SW_HIDE); • } • }
8.4 列表控件 列表控件以列表条的形式显示数据信息,一般可以用来显示数据的子集,如数据库里表里的数据,或者用来显示一些分散的对象等。
8.4.1 列表控件的样式 列表控件的样式可以在Properties对话框的Styes属性页进行设置:
8.4.2 CListCtrl类 与列表视图控件有关的一些数据类型: • LV_COLUMN结构。该结构仅用于报告式列表视图,用来描述表项的某一列.要想向表项中插入新的一列,需要用到该结构,其定义为: typedef struct _LV_COLUMN { UINT mask; //屏蔽位的组合(见下面括号),表明哪些成员是有效的 int fmt; //该列的表头和子项的标题显示格式(LVCF_FMT) int cx; //以像素为单位的列的宽度(LVCF_FMT) LPTSTR pszText; //指向存放列表头标题正文的缓冲区(LVCF_TEXT) int cchTextMax; //标题正文缓冲区的长度(LVCF_TEXT) int iSubItem; //说明该列的索引(LVCF_SUBITEM) } LV_COLUMN;
与列表视图控件有关的一些数据类型(续) • LV_ITEM结构。该结构用来描述一个表项或子项,它包含了项的各种属性,其定义为: typedef struct _LV_ITEM { UINT mask; //屏蔽位的组合,表明哪些成员是有效的 int iItem; //从0开始编号的表项索引(行索引) int iSubItem; //从1开始编号的子项索引(列索引) UINT state; //项的状态(LVIF_STATE) UINT stateMask; //项的状态屏蔽 LPTSTR pszText; //指向存放项的正文的缓冲区(LVIF_TEXT) int cchTextMax; //正文缓冲区的长度(LVIF_TEXT) int iImage; //图标的索引(LVIF_IMAGE) LPARAM lParam; // 32位的附加数据(LVIF_PARAM) } LV_ITEM;
CListCtrl类的成员函数: • 列的插入和删除项: 插入某列 :int InsertColumn( int nCol, const LV_COLUMN* pColumn); 删除某列 : BOOL DeleteColumn( int nCol );
CListCtrl类的成员函数(续) • 表项的插入 函数的声明为int InsertItem(const LV_ITEM* pItem); 参数pItem指向一个LV_ITEM结构,该结构提供了对表项的描述。若插入成功则函数返回新表项的索引,否则返回-1。
CListCtrl类的成员函数(续) • 调用GetItemText和SetItemText来查询和设置表项及子项显示的正文 : • int GetItemText( int nItem, int nSubItem, LPTSTR lpszText, int nLen ) const; • CString GetItemText( int nItem, int nSubItem ) const; • BOOL SetItemText( int nItem, int nSubItem, LPTSTR lpszText );
8.4.3 应用实例 下面开始建立一个CListCtrl对话框的工程Eg8_2,步骤如下: 步骤1.建立一个基于对话框的程序,打开对话框资源。将对话框的标题设为“列表控件”。将CListCtrl拖到视图窗口中,调整位置、大小,并定义其对象标识为IDC_LIST。
应用实例(续) 步骤2.改变列表控件的属性,选中View|Report选项。
应用实例(续) 步骤3.在MFC ClassWizard中建立对列表控件IDC_LIST的成员变量为m_List,以后程序中对该控件的控制通过此成员变量来实现。 步骤4.重载 对话框类的初始化函数OnInitDialog(): • BOOL CMy83Dlg::OnInitDialog() • {CDialog::OnInitDialog(); • …… • //初始化列表视图 • LV_COLUMN lvc; • LV_ITEM lvi;
初始化函数OnInitDialog(): • char *display2[3][3]={"1","01","75","2","02 ","84 ","3","03 ","67 "}; • char *display[3]={"姓名","学号","分数"}; • char *display1[3]={"张三","李四","王麻子"}; • lvc.mask=LVCF_FMT|LVCF_TEXT|LVCF_SUBITEM|LVCF_WIDTH; • lvc.fmt=LVCFMT_LEFT; • lvc.cx=111; • for(int i=0;i<3;i++) //插入各列 • { • lvc.iSubItem=i; • lvc.pszText=display[i]; • m_List.InsertColumn(i,&lvc); • } • lvi.mask=LVIF_TEXT; • lvi.iSubItem=0;
初始化函数OnInitDialog(): • for( i=0;i<3;i++) //插入表项 • { • lvi.pszText=display1[i]; • lvi.iItem=i; • m_List.InsertItem(&lvi); • for(int j=1;j<3;j++) • { • m_List.SetItemText(i,j,display2[i][j]); • } • return TRUE; // return TRUE unless you set the focus to a control • }
8.5 树形控件 树形控件是一种可以分级显示项目列表的窗口,其所含项目以相互关联的方式显示在控件中,通过点击位于某个层次的项目节点可以展开下一层次中从属于该节点的所有项目。 在MFC中,由CTreeCtrl类提供了对树形控件的功能支持。
8.5.1 树形控件的样式 树形控件的样式可以在Properties对话框的Styes属性页进行设置,如图所示:
8.5.2 CTreeCtrl类 • MFC提供的树视图控件CTreeCtrl类用于封装树视图控件的功能, • 它应用在对话框中或视图窗体中,同其他控件一样,可直接拖放到窗口中,改变其位置、大小和一些基本属性
与树形视图控件有关的一些数据类型: • HTREEITEM型句柄: Windows用HTREEITEM型句柄来代表树形视图的一项,程序通过HTREEITEM句柄来区分和访问树形视图的各个项。 • TV_ITEM结构:该结构用来描述一个表项,它包含了表项的各种属性,其定义如下: typedef struct _TV_ITEM { UINT mask; //包含一些屏蔽位的组合,用来表明结构的哪些成员是有效的 HTREEITEM hItem; //表项的句柄(TVIF_HANDLE)
与树形视图控件有关的数据类型(续) UINT state; //表项的状态(TVIF_STATE) UINT stateMask; //状态的屏蔽组合(TVIF_STATE) LPSTR pszText; //表项的标题正文(TVIF_TEXT) int cchTextMax; //正文缓冲区的大小(TVIF_TEXT) int iImage; //表项的图象索引(TVIF_IMAGE) int iSelectedImage; //选中的项的图象索引(TVIF_SELECTEDIMAGE) int cChildren; //表明项是否有子项(TVIF_CHILDREN),为1则有,为0则没有 LPARAM lParam; //一个32位的附加数据(TVIF_PARAM) } TV_ITEM, FAR *LPTV_ITEM;
与树形视图控件有关的数据类型(续) • TV_INSERTSTRUCT结构。在向树形视图中插入新项时要用到该结构,其定义如下: typedef struct _TV_INSERTSTRUCT { HTREEITEM hParent; //父项的句柄 HTREEITEM hInsertAfter; //说明应插入到同层中哪一项的后面 TV_ITEM item; } TV_INSERTSTRUCT;
8.5.3 应用实例 下面开始建立一个CTreeCtrl对话框的工程Eg8_3,步骤如下: 步骤1.建立一个基于对话框的程序,打开对话框资源。将对话框的标题设为“树形控件”。将CTreeCtrl拖到视图窗口中,调整位置、大小,并定义其对象标识为IDC_TREE。 步骤2.改变其属性,选中Has buttons、Has lines复选框,这样用起树视图控件就同Windows中资源管理器中的一样了。
应用实例(续) 步骤3. 定义一个从CTreelCtrl继承的类CNewTree,在MFC ClassWizard中建立对新定义类的成员变量为m_Tree,以后程序中对该控件的控制通过此成员变量来实现。这么做是为了以后方便对其添加其他用户自定义的功能。 步骤4.重载对话框类的初始化函数OnInitDialog()。
对话框类的初始化函数OnInitDialog() • BOOL CMy83Dlg::OnInitDialog() • { • CDialog::OnInitDialog(); • …… • TV_INSERTSTRUCT hInsert; • HTREEITEM hItem1; • hInsert.item.mask=TVIF_TEXT; • char *diplay[3][3]={"第一层第一个 ","第一层第二个 ","第一层第三个 ","第二层第一个","第二层第二个","第二层第三个","第三层第一个","第三层第二个","第三层第三个"}; • char *diplay[3]={"第一层 ","第二层","第三层"}; • for(int j=0;j<3;j++) • { • hInsert.hParent=NULL; //指定该项位于最高层
对话框类的初始化函数OnInitDialog() • hInsert.hInsertAfter=TVI_LAST; • hInsert.item.pszText=diplay1[j]; • hItem1=m_Tree.InsertItem(&hInsert); • for(int i=0;i<3;i++) • { • hInsert.hParent=hItem1; //指定该项为子项 • hInsert.hInsertAfter=TVI_SORT; • hInsert.item.pszText=diplay[j][i]; • m_Tree.InsertItem(&hInsert); • } • } • return TRUE; // return TRUE unless you set the focus to a control • }
8.6 旋转按钮控件 旋转按钮控制(Spin Button Control)又称为上下控制(Up Down Control),其主要功能是利用一对标有相反方向箭头的小按钮,通过点击它来在一定范围内改变当前的数值。 旋转按钮控制的当前值通常显示在一个称为伙伴窗口(Buddy Window)的控制中,可以是一个编辑框等。
8.6.1 旋转按扭控件的样式 旋转按扭控件的样式可以在Properties对话框的Styes属性页进行设置,如图所示:
选项的含义: • Alignment的选项的功能: • Right:使上下控件放置在伙伴控件的右边; • Left:使上下控件放置在伙伴控件的左边; • Unattached:使上下控件放置与伙伴控件互不勾连; • Orientation的选项的功能: • Vertical:设置控件为水平方向; • Horizontal:设置控件为垂直方向; • AutoBuddy :设置上下箭头(SPIN)指针,使之指向伙伴编辑框; • Wrap:使控件值在达到最小值之后回绕到最大值,反之亦然; • Set buddy integer:设置伙伴控件的值为整形; • Arrow keys:使用户可以使用键盘的上下箭头来改变控件的值; • No thousand:没有以千为单位分隔的逗号; • Hot track:设置热键跟踪;
CSpinButtonCtrl类 旋转按钮控制在MFC类库中被封装在CSpinButtonCtrl类,其操作主要是获取和设置旋转按钮的变化范围、当前数值、伙伴窗口、伙伴窗口显示当前数据的数值基十进制还是十六进制和用户按住按钮时数值变化速度的加速度等。
8.7 滑动条控件 滑动条控件又叫做轨道条控件,其主要是用一个带有轨道和滑标的小窗口以及窗口上的刻度,来让用户选择一个离散数据或一个连续的数值区间。
8.7.1 滑动条控件的样式 滑动条控件的样式可以在Properties对话框的Styes属性页进行设置,如图所示: