第5章 文本与字体 2018/12/31 面向对象与可视化 程序设计 --Visual C++ 编程 主讲教师: 唐 龙教授 (计算机科学与技术系) 黄维通博士 (计算机与信息管理中心) 清 华 大 学 2001年2月 2018/12/31 Huang Weitong
第5章 文本与字体 2018/12/31 第八章 Windows的标准控件 2018/12/31 Huang Weitong
内容提要 控件的基本概念 常用子窗口操作函数 按钮控件 滚动条控件 静态控件 列表框控件 编辑框控件 组合框控件 2018/12/31
第5章 文本与字体 2018/12/31 §8.1. 控件的基本概念 2018/12/31 Huang Weitong
1.控件是用户交互的操作对象 界面的主要组成之一,用户交互的操作对象。 第5章 文本与字体 2018/12/31 1.控件是用户交互的操作对象 界面的主要组成之一,用户交互的操作对象。 具有窗口属性,可用ShowWindows()和MoveWindows()等窗口管理函数来显示或隐藏控件、改变控件的位置、尺寸以及其它操作。 系统预定义标准控件的窗口类: BUTTON 按钮控件 COMBOBOX 组合框控件 EDIT 编辑框控件 LISTBOX 列表框控件 SCROLLBAR 滚动条控件 STATIC 静态控件 2018/12/31 Huang Weitong
2.控件的创建 控件以两种形式存在: 两种创建方法: 控件的窗口类可在应用程序中定义并注册或由系统预定义。 依附于对话框; 独立的子窗口。 启动话框时,系统为对话框创建其中的控件,如按钮控件。 调用CreateWindows()或CreateWindowsEx()函数创建独立的子窗口控件。创建时必须指定控件的窗口类 控件的窗口类可在应用程序中定义并注册或由系统预定义。 2018/12/31
3.控件的消息传递 子窗口控件向其父窗口发送WM_COMNAND消息,其中 通知代码通报了子窗口控件操作,例如: wParamc参数包含子窗口 的ID; IParam参数包含子窗口的句柄和通知代码。 通知代码通报了子窗口控件操作,例如: BN_CLICKED——在按钮子窗口中单击 EN_HSCROLL——在编辑子窗口中激活水平滚动条 ……(参见教材P186,表8-2) 滚动条控件,不发送WM_COMNAND消息,发送WM_HSCROLL或WM_VSCROLL消息。 2018/12/31
wParam与lParam包含的相关信息,其含义取决控件消息 4.向控件传递的消息 调用函数SendMessage向子窗口发送消息, static LRESULT SendMessage( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam ); 例如,用户单击按钮时,向该按钮发为设置按钮选中消息BM_SETCHECK,其形式为: SendMessage(hwndRadioButton,BM_SETCHECK,1,0); 调用函数SendDlgItemMessage向指定的对话框控件发送消息,其形式为: SendDlgItemMessage(hdlg,ID,message,wParam,lParam); wParam与lParam包含的相关信息,其含义取决控件消息 2018/12/31
第5章 文本与字体 2018/12/31 §8.2. 常用子窗口操作函数 2018/12/31 Huang Weitong
1.EnableWindow函数 功能:激活或禁止窗口。 2.MoveWindow函数 功能:移动或改变窗口的大小。 Ture:激活 False:禁止 BOOL EnableWindow (HWND hwnd,BOOL bEnable) 2.MoveWindow函数 功能:移动或改变窗口的大小。 窗口位置 BOOL MoveWindow ( HWND hwnd, int X,int Y, //窗口位置 int nWidth, //窗口宽度 int nHeight, //窗口高度 BOOL bReprint //表明窗口移动后是否重画 ) 窗口的 大小 2018/12/31
功能:获取指定窗口标题或文本,返回值为所取得 文本的字节数。 3.SetWindowText 功能:设置窗口的标题或文本。 设置的 文本内容 BOOL SetWindowText(HWND hwnd, LPCTSTR lpszString) 4.GetWindowText函数 功能:获取指定窗口标题或文本,返回值为所取得 文本的字节数。 int GetWindowText(HWND hwnd,LPSTR lpszString,intn Max) 字符串 缓冲区 字符串 最大长度 2018/12/31
功能:关闭窗口。关闭父窗口,同时关闭其子窗口。 [请注意] 相应于 SetWindowText和GetWindowText函数的调用,对于对话框控件,应分别改用SetDlgItemText和GetDlgItemText函数的调用。 BOOL SetDlgItemText(HWND hdlg,int ID, LPCTSTR lpszString) Int GetDlgItemText(HWND hdlg,int ID, LPSTR lpszString, int nMax) 5.DestroyWindow函数 功能:关闭窗口。关闭父窗口,同时关闭其子窗口。 BOOL DestroyWindow(HWND hwnd) 2018/12/31
第5章 文本与字体 2018/12/31 §8.3. 按钮控件 2018/12/31 Huang Weitong
1.按钮控件的分类 普通按钮和默认按钮 圆按钮 复选框按钮 组框:按钮分组 单选按钮:编程确保互斥性 自动按钮:自动实现互斥性 2018/12/31
2.按钮控件的创建 按钮控件的创建方式 在对话框中定义控件 创建控件型的子窗口,包括两个步骤: 创建并注册一个窗口类的实例 创建并显示窗口实例 2018/12/31
(1) 在对话框定义中创建控件,其一般形式为: Control-type [Title,] ID,X,Y, nWidth,nHeight [,Style] 控件标题或内容 控件类型 控件起始坐标 控件的宽度与高度 控件 样式 按钮控件样式 BS_PUSHBUTTON 普通按钮 BS_DEFPUSHBUTTON 默认按钮 BS_RADIOBUTTON 单选按钮 BS_CHKCKBOX 复选框 BS_OWNERDRAW 自绘按钮 BS_TEXT 带文本按钮 BS_ICON 带图标按钮 BS_BITMAP 带位图按钮 BS_CENTER 按钮上文本居中 BS_LEFT 按钮上文本左对齐 BS_RIGHT 按钮上文本右对齐 BS_USERBUTTON 用户定义按钮 2018/12/31
(2)创建按钮子窗口控件 调用CreateWindow函数创建子窗口滚动条控件,其形式如下: CreateWindow( “BUTTON”, //预定义按钮窗口类名 lTitle, //按钮标题(文本或位图) WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON…,//样式 X,Y, nWidth,nHeight, //按钮始坐标、宽度与高度 hwndParant, //父其窗口的句柄 ID, //按钮标识 hInstance, //应用程序当前实例句柄 NULL ); 2018/12/31
(2)创建滚动条子窗口控件(续) 调用CreateWindowEx函数创建扩展的子窗口控件,它与 CreateWindow函数创建的子窗口控件的差别,只是多一些扩展样式的选择。此函数原型如下: CreateWindowEx( DRORD dwExstyle //扩展的窗口类名 LPCTSTR lpClassName, //已注册窗口类指针 LPCTSTR lpWindowName, //窗口名称指针 DRORD dwstyle, //窗口样式 int X,Y, nWidth,nHeight,//滚动框始坐标、宽度与高度 HWND hwndParant, //父其窗口的句柄 HMEUN hMeun, //滚动条标识/菜单的句柄 HINSTANCE hInstance, //应用程序当前实例句柄 NULL ); 2018/12/31
3.按钮控件向应用程序传递消息 当用户与控件交互操作时,控件向其父窗口发送WM_COMMAND消息,其wParam参数: 低字节包含控件的标识值(ID); 高字节中包含控件向父窗口发出的通知代码。 按钮控件的通知代码: BN_CLICKED 单击按钮 BN_DOUBLECLICKED 双击按钮 BN_SETFOCUS 按钮获得输入焦点 BN_KILLFOCUS 按钮失去输入焦点 2018/12/31
4.应用程序向按钮控件传递消息 调用函数SendMessage向按钮控件发出消息,其格式: SendMessage(hwnd,message,wParam,lParam); 发出的消息 字参数确定动作 BM_GETCHECK 获取选中状态 BM_SETCHECK 设置/取消选中状态 BM_GETSTYLE 获取样式 BM_SETSTYLE 设置样式 BM_SETSTATE 设置状态 BM_GETIMAGE 获取按钮图标或位图句柄 BM_SETIMAGE 设置按钮图标或位图句柄 2018/12/31
4.应用程序向按钮控件传递消息(续) 对同样的消息,字参数不同,动作也不同,例如,设置/取消选中标志, 若字参数应取1,则设置标志 SendMessage (hwnd,BM_SETCHECK,1,0); 若字参数应取0,则设置标志 SendMessage (hwnd,BM_SETCHECK,0,0); 相应于对话框按钮控件,则改调用函数SendDlgItemMessage(hdlg,ID,message,wParam,lParam); 2018/12/31
5.按钮控件示例 【例8-1】创建如右上图的按钮控件系列,当单击每一个按钮后,就出现如右下图所示的响应。 [注]程序清单参见教材p192-197 2018/12/31
第5章 文本与字体 2018/12/31 §8.4. 滚动条控件 2018/12/31 Huang Weitong
1. 滚动条控件的功能与分类 滚动条控件的功能——当应用程序显示的内容超过窗口的范围时,用户可通过拖动滚动条遍历整个窗口内容。 滚动条分为垂直与水平滚动条,分别实现窗口内容纵向和横向的滚动。 2018/12/31
2. 滚动条控件的创建 三种创建方法: 创建窗口滚动条; 创建滚动条子窗口控件; (1)创建窗口滚动条 创建对话框中的滚动条控件。 创建样式为WS_VSCROLL和WS_HSCROLL的窗口,其形式如下: hwnd=CreateWindow(lpszClassName, lpszTitle, WS_OVERLAPPEDWINDOW | WS_VSCROLL | WS_HSCROLL, ...... hInstance, NULL); 2018/12/31
(2)创建滚动条子窗口控件 调用CreateWindow创建子窗口滚动条控件,其形式如下: CreateWindow( “SCROLLBAR”, //预定义窗口类名 lpszScrollTitle, //标题,常为NULL WS_CHILD | WS_VISIBLE…,//样式 X,Y, nWidth,nHeight, //滚动框始坐标、宽度与高度 hwndParant, //父其窗口的句柄 ID, //滚动条标识 hInstance, //应用程序当前实例句柄 NULL ); 滚动条样式除窗口类样式外,常用的还有SBS_VERT和SBS_HORZ 2018/12/31
对话框的定义中完成创建操作,一般形式如下: SCROLLBAR ID,X,Y,nWidth,nHeight,[style]; (3)创建对话框中的滚动条控件 对话框的定义中完成创建操作,一般形式如下: SCROLLBAR ID,X,Y,nWidth,nHeight,[style]; 2018/12/31
3. 滚动条控件发送的消息 滚动操作时,该控件向应用程序发送相应的WM_VSCROLL 或WM_HSCROLL消息。 消息字参数wParam低字节为滚动条动作标识: SB_TOP 到滚动条顶端或右端 SB_BOTTOM 到滚动条底端或左端 SB_RIGHT 滚动到右边 SB_LEFT 滚动到左边 SB_PAGEUP 向上滚动一页 …… SB_LINERIGHT 向右滚动一行 SB_THUMBPOSTION 滚动框移到新位置 SB_THUMBTRACK 滚动框条被拖动 SB_ENDSCROLL 滚动条到最终位置 2018/12/31
4. 常用滚动条操作函数 (1)SetScrollRange:设置滚动条的滚动范围 (2)SetScrollPos:设置滚动块的位置 SB_CTL 为控件滚动条 SB_HORZ 为窗口水平滚动条 SB_VERT 为窗口垂直滚动条 int SetScrollRange (HWND hwnd, int nBar, //滚动条特性标识 int nMaxPos, //滚动条最大滚动位置 int nMinPos, //滚动条最小滚动位置 BOOL bRedraw) //当滚动条改变时是否重绘;非0表示重绘 (2)SetScrollPos:设置滚动块的位置 int SetScrollPos (HWND hwnd, int nBar, //滚动条的特性标识 int nPos, //滚动块的位置 BOOL bRedraw)//当滚动条改变时是否重绘; 2018/12/31
(3)GetSystemMetrics:获取系统提供的滚动条尺寸 如:获取系统水平滚动条的高度: GetSystemMetrics(SM_CYHSCROLL); (4)GetScrollpos:获取滚动块的位置 int GetScrollPos ( HWND hwnd, //窗口句柄,同SetScrollRange函数 int nBar ); //滚动条特性标识 (5)GetScrollRange:获取滚动条的滚动范围 BOOL GetScrollRange( HWND hwnd, int nBar, LPINT lpMinPos, //接收最小位置的整形变量的地址 LPINT lpMaxPos); //接收最大位置的整形变量的地址 2018/12/31
5. 滚动控件示例 【例8-2】一个带滚动条的颜色框,拉动滚动条,使其显示的区域产生变化,同时,通过设置颜色,来改变颜色框的颜色。 [注]程序清单参见教材p201-211 2018/12/31
第5章 文本与字体 2018/12/31 §8.5. 静态控件 2018/12/31 Huang Weitong
1. 静态控件及其特点 静态控件是一种包含正文或图形的小窗口。通常用于标记其他控件或控件组。 特点: 一般情况下,不接受用户输入,也不发消息。 可设置具有超文本功能,能响应用户输入,向应用程序发消息。 2018/12/31
2. 静态控件的创建 创建静态控件方法: 创建静态控件子窗口: 创建对话框中静态控件。 (1)创建静态控件子窗口 CreateWindow( “ STATIC”, ∥预定义窗口类名 lpszStaticTitle, ∥静态控件标题 WS_CHILD | WS_VISIBLE|WS_BORDER|…,∥样式 X,Y, nWidth,nHeight, ∥静态控件起始坐标及宽度与高度 hwndParant, ∥拥有该静态控件的窗口句柄 ID, ∥静态控件标识 HInstance, ∥应用程序当前实例句柄 NULL ) 2018/12/31
Static-Type Tilte,ID,X,Y,nWidth,nHeight,[,style] (2)创建对话框中静态控件 Static-Type Tilte,ID,X,Y,nWidth,nHeight,[,style] 标题(文本 或位图等) 起始坐标 宽度高度 类型关键字 LTEXT (左对齐) RTEXT (右对齐) CTEX (居中) 样 式 选 项 SS_LEFT 左对齐文本 SS_RIGHT 右对齐文本 SS_CENTER 文本居中 SS_ICON 包含位图 SS_CENTEIMAGE 位图居中 SS_NOTIFY 单击时,发消息 SS_USERITEM 用户定义 2018/12/31
3.静态控件消息发送 仅当样式选项设为SS_NOTIFY,静态控件 被单击时,向其父窗口发WM _COMMAND消息, lParam包含静态控件句柄 wParam低字节包含静态控件ID,高字节包含通知码,其含义: STN_CLICKED 单击静态控件 STN_ENABLE 激话静态控件 STN_DBLCLK 双击静态控件 STN_DISABLE 禁止静态控件 2018/12/31
4.静态控件应用举例 【例8-3】位图静态控件的创建,消息的强制生成与处理,当单击位图时,就报告该位图的尺寸 [注]程序清单参见教材p212-215 2018/12/31
第5章 文本与字体 2018/12/31 §8.6. 列表框控件 2018/12/31 Huang Weitong
1. 列表框控件的特点 列表框是集中显示同类内容的子窗口,例如,显示同类型文件等。 特点: 提供大量的可选项,需要时自动显示滚动条; 可设置单选或多选功能; 单击列表项,以 “ 反相”显示表示被选中;再次单击该项,恢复为非选中状态。 2018/12/31
2.列表框控件的创建 创建列表框控件方法: 创建列表框控件子窗口: 创建作为对话框控件的列表框。 (1)创建列表框控件子窗口 CreateWindow( “ LISTBOX”, ∥预定义窗口类名 NULL, ∥列表框一般无标题 WS_CHILD | WS_VISIBLE|WS_BORDER|…,∥样式 X,Y,nWidth,nHeight, ∥列表框起始坐标及宽度与高度 hwndParant, ∥其父窗口句柄 ID, ∥列表框标识 HInstance, ∥应用程序当前实例句柄 NULL ); 2018/12/31
LISTBOX ID,X,Y,nWidth,nHeight,[,style] (2)创建作为对话框控件的列表框 LISTBOX ID,X,Y,nWidth,nHeight,[,style] 起始坐标 宽度高度 控件类型 关键字 样 式 选 项 LBS_NOTIFY 可向父窗口发消息 LBS_SORT 按字母顺序排练表项 LBS_MULYPLESEL 多选列表框 LBS_EXTENDEDSEL 扩展多选列表框 LBS_NOREDRAW 列表框改变时步重画 LBS_STANDARD 标准样式 2018/12/31
3.列表框向应用程序传递消息 列表框向应用程序发出WM_COMMAND消息; 消息字参数wParam含义: 消息通知码含义: 低字节为控件标识值 高字节为标识列表框动作的消息通知码。 消息通知码含义: LBN_SELCHANGE 用户选择已发生改变 LBN_DBLCLK 双击 LBN_SELCANCLE 选择被取消 LBN_SETFOCUS 列表框收到输入焦点 LBN_KILLFOCUS 列表框失去输入焦点 2018/12/31
4.应用程序向列表框传递消息 索引号的使用 多选列表框消息发送 发送LB_DIR消息以显示文件目录。 调用函数SendMessage或SendDlgItemMessage向列表框发送各种消息。 索引号的使用 列表项由索引值指定,首项缺省索引号为0,末项为-1 发送LB_GETCURSEL消息获取当前选中的索引号。 多选列表框消息发送 可选取多个项,发送LB_GETSELCOUNT消息获取选中的项数; 发送LB_GETSEL消息获取指定项的选中状态 发送LB_DIR消息以显示文件目录。 2018/12/31
列表框传递消息 LB_ADDFILE 在文件列表中加入指定文件 LB_GETTEXT 获取指定项文本 LB_ADDSTRING 在列表框中加入列表项 LB_GETTEXTLEN 获取指定项长高 LB_DELETESTRING 在列表框中删除列表项 LB_GETTOPINDEX 获取列表框中第一项的索引值 LB_DIR 在列表框中列出指定文件 LB_INSERTSTRING 在列表框的指定位置加入一项 LB_FINDSTRING 在列表框中查找指定项 LB_RESETCONTENT 清空列表框 LB_GETCOUNT 获取多选列表框中的项数 LB_SETSEL 设置多选列表框中指定项的选中状态 LB_GETCURSEL 获取列表框中当前选中项的索引值 LB_SETCURSEL 设置单选列表框中指定项的选中状态 LB_GETSEL 获取列表框中指定项的选中状态 LB_SETTOPINDEX 设置列表框中第一项的索引值 LB_GETSELCOUNT 获取多选列表框中选中的项数 2018/12/31
5. 列表框应用举例 【例8-4】创建常用的单选列表框,在该列表框中列出文件目录. [注]程序清单参见教材p218-221 2018/12/31
第5章 文本与字体 2018/12/31 §8.7. 编辑框控件 2018/12/31 Huang Weitong
1. 编辑框控件及其特点 编辑框的主要作用在于接收用户键盘输入 功能特点: 可自动转换用户输入,如大小写转换等; 可使用通配符,如*代替用户输入; 支持多行编辑。 2018/12/31
2. 编辑框控件的创建 创建编辑框子窗口控件 创建对话框中编辑框控件 CreateWindow( “EDIT”, ∥预定义窗口类名 NULL, ∥编辑框一般无标题 WS_CHILD|WS_VISIBLE|…, ∥ 样式 X,Y, nWidth,nHeight, ∥起始坐标,宽度与高度 hwndParant, ∥其父窗口句柄 ID, ∥编辑框标识 hInstance, ∥应用程序当前实例句柄 NULL) 创建对话框中编辑框控件 EDITTEXT ID,X,Y,nWidth,nHeight,[,style] 2018/12/31
3.编辑框向应用程序传递消息 编辑框向应用程序发送WM_COMMAND消息; 消息字参数wParam的含义: 消息通知码含义: 低字节为控件标识: 高字节为标识编辑框动作的消息通知码。 消息通知码含义: EN_SETFOCUS 编辑框取得输入焦点 EN_KILLFOCUS 编辑框失去输入焦点 EN_CHANGE 编辑框内容发生改变 EN_UPDATE 编辑框内容被更改 EN_MAXTEXT 输入已达到最大字节数 EN_HSCROLL 编辑框内容水平滚动 EN_VSCROLL 编辑框内容垂直滚动 2018/12/31
4.应用程序向编辑框传递消息 调用SendMessage和SendDlgItemMessage向编辑框发送各种消息 常见编辑框消息及其含义: EM_GETRECT 获取编辑框矩形尺寸 EM_SETRECT 设置编辑框矩形尺寸 EM_LINESCROLL 设置滚动条滚动步长 EM_GETHANDLE 获取输入缓冲区句柄 EM_SETHANDLE 设置输入缓冲区句柄 EM_LINELENGTH 获取文本行长度 EM_GETFONT 获取编辑框使用的字体 …... EM_GETSEL 获取编辑框中的选中的文本 EM_SETSEL 设置编辑框中的选中的文本 2018/12/31
5.编辑框控件应用举例 【例8-5】包含编辑框控件的“ 乘法器” 。输入框中输入一个数,单击 “ ×” ,再输入另一个数,在结果输出框中输出结果。 [注]程序清单参见教材p223-228 2018/12/31
第5章 文本与字体 2018/12/31 §8.8. 组合框控件 2018/12/31 Huang Weitong
1. 组合框控件的特点 使用单一控件不能完全满足与用户交互的需要,组合两种预定义窗口成为组合框。 对话框及与静态文本和编辑框组合是最常见的组合框。 组合框中的列表框常隐藏于编辑框下,单击编辑框右侧箭头时被弹出。 2018/12/31
2.组合框控件的创建 创建组合框子窗口 创建作为对话框控件的组合框 CreateWindow( “COMBOBOX”, ∥预定义窗口类名 NULL, ∥组合框一般无标题 CBS_DROPDOWN|…, ∥样式 X,Y, nWidth,nHeight, ∥起始坐标,宽度与高度 hwndParant, ∥其父窗口句柄 ID, ∥组合框标识 hInstance, ∥应用程序当前实例句柄 NULL) 创建作为对话框控件的组合框 COMBOBOX ID,X,Y,nWidth,nHeight,[,style] 2018/12/31
3.组合框向应用程序传递消息 组合框向应用程序发送WM_COMMAND消息; 消息字参数wParam的含义: 消息通知码含义: 低字节为控件标识: 高字节为标识组合框动作的消息通知码。 消息通知码含义: CBN_SELCHANGE 其列表框选中项发生改变 CBN_DBLCLK 双击 CBN_SETFOCUS 组合框取得输入焦点 CBN_KILLFOCUS 组合框失去输入焦点 CBN_EDITCHANGE 其编辑框中文本发生改变 CBN_EDITUPDATE 其编辑框中显示修改的文本 CBN_DROPDOWN 其列表框将下拉 CBN_CLOSEUPL 其列表框将隐藏 2018/12/31
4.应用程序向组合框传递消息 调用SendMessage和SendDlgItemMessage向组合框发送各种消息 常见编辑框消息及其含义: CB_SHOW DROPDOWN 显示下拉列表框 CB_ADDSTRING 列表框中加新项 CB_DSTRING 列表框删除项 CB_INSERTSTRING 列表框中插入新项 CB_FINDSTRING 列表框中查找项 CB_RESETCONTENT 清空列表框 CB_DTR 列表框列目录 …... CB_GETEDITSEL 获取编辑框中的选择 CB_SETEDITSEL 设置编辑框中的选择 2018/12/31
5. 组合框控件应用举例 【例8-6】创建一个组合框控件,当单击向下按钮时,显示可选文件的名字。 [注]程序清单参见教材p230-233. 2018/12/31
(第八章) 完 2018/12/31
中期考核的大作业 综合运用已学过vc++编程知识,设计实现科学计算小计算器,其功能类似于Windows系统附件中的计算器。 [注]5月7日前完成 2018/12/31