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