2020/2/241面向对象与可视化程序设计--VisualC++编程主讲教师:唐龙教授(计算机科学与技术系)黄维通博士(计算机与信息管理中心)清华大学2001年2月2020/2/242第八章Windows的标准控件2020/2/243内容提要控件的基本概念常用子窗口操作函数按钮控件滚动条控件静态控件列表框控件编辑框控件组合框控件2020/2/244§8.1.控件的基本概念2020/2/2451.控件是用户交互的操作对象界面的主要组成之一,用户交互的操作对象。具有窗口属性,可用ShowWindows()和MoveWindows()等窗口管理函数来显示或隐藏控件、改变控件的位置、尺寸以及其它操作。系统预定义标准控件的窗口类:BUTTON按钮控件COMBOBOX组合框控件EDIT编辑框控件LISTBOX列表框控件SCROLLBAR滚动条控件STATIC静态控件2020/2/2462.控件的创建控件以两种形式存在:–依附于对话框;–独立的子窗口。两种创建方法:–启动话框时,系统为对话框创建其中的控件,如按钮控件。–调用CreateWindows()或CreateWindowsEx()函数创建独立的子窗口控件。创建时必须指定控件的窗口类控件的窗口类可在应用程序中定义并注册或由系统预定义。2020/2/2473.控件的消息传递子窗口控件向其父窗口发送WM_COMNAND消息,其中–wParamc参数包含子窗口的ID;–IParam参数包含子窗口的句柄和通知代码。通知代码通报了子窗口控件操作,例如:–BN_CLICKED——在按钮子窗口中单击–EN_HSCROLL——在编辑子窗口中激活水平滚动条–……(参见教材P186,表8-2)滚动条控件,不发送WM_COMNAND消息,发送WM_HSCROLL或WM_VSCROLL消息。2020/2/248wParam与lParam包含的相关信息,其含义取决控件消息4.向控件传递的消息调用函数SendMessage向子窗口发送消息,staticLRESULTSendMessage(HWNDhWnd,UINTmessage,WPARAMwParam,LPARAMlParam);例如,用户单击按钮时,向该按钮发为设置按钮选中消息BM_SETCHECK,其形式为:SendMessage(hwndRadioButton,BM_SETCHECK,1,0);调用函数SendDlgItemMessage向指定的对话框控件发送消息,其形式为:SendDlgItemMessage(hdlg,ID,message,wParam,lParam);2020/2/249§8.2.常用子窗口操作函数2020/2/24101.EnableWindow函数功能:激活或禁止窗口。BOOLEnableWindow(HWNDhwnd,BOOLbEnable)Ture:激活False:禁止2.MoveWindow函数功能:移动或改变窗口的大小。BOOLMoveWindow(HWNDhwnd,intX,intY,//窗口位置intnWidth,//窗口宽度intnHeight,//窗口高度BOOLbReprint//表明窗口移动后是否重画)窗口的大小窗口位置2020/2/24113.SetWindowText功能:设置窗口的标题或文本。BOOLSetWindowText(HWNDhwnd,LPCTSTRlpszString)设置的文本内容4.GetWindowText函数功能:获取指定窗口标题或文本,返回值为所取得文本的字节数。intGetWindowText(HWNDhwnd,LPSTRlpszString,intnMax)字符串缓冲区字符串最大长度2020/2/2412[请注意]相应于SetWindowText和GetWindowText函数的调用,对于对话框控件,应分别改用SetDlgItemText和GetDlgItemText函数的调用。BOOLSetDlgItemText(HWNDhdlg,intID,LPCTSTRlpszString)IntGetDlgItemText(HWNDhdlg,intID,LPSTRlpszString,intnMax)5.DestroyWindow函数功能:关闭窗口。关闭父窗口,同时关闭其子窗口。BOOLDestroyWindow(HWNDhwnd)2020/2/2413§8.3.按钮控件2020/2/24141.按钮控件的分类普通按钮和默认按钮圆按钮–单选按钮:编程确保互斥性–自动按钮:自动实现互斥性复选框按钮组框:按钮分组按钮控件类型说明PUSHBUTTON按钮控件DEFPUSHBUTTON缺省按钮控件CHECKBOX复选框控件RADIOBUTTON圆按钮控件GROUPBOX组合框控件2020/2/24152.按钮控件的创建按钮控件的创建方式–在对话框中定义控件–创建控件型的子窗口,包括两个步骤:创建并注册一个窗口类的实例创建并显示窗口实例2020/2/2416(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用户定义按钮2020/2/2417(2)创建按钮子窗口控件调用CreateWindow函数创建子窗口滚动条控件,其形式如下:CreateWindow(“BUTTON”,//预定义按钮窗口类名lTitle,//按钮标题(文本或位图)WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON…,//样式X,Y,nWidth,nHeight,//按钮始坐标、宽度与高度hwndParant,//父其窗口的句柄ID,//按钮标识hInstance,//应用程序当前实例句柄NULL);2020/2/2418(2)创建滚动条子窗口控件(续)调用CreateWindowEx函数创建扩展的子窗口控件,它与CreateWindow函数创建的子窗口控件的差别,只是多一些扩展样式的选择。此函数原型如下:CreateWindowEx(DRORDdwExstyle//扩展的窗口类名LPCTSTRlpClassName,//已注册窗口类指针LPCTSTRlpWindowName,//窗口名称指针DRORDdwstyle,//窗口样式intX,Y,nWidth,nHeight,//滚动框始坐标、宽度与高度HWNDhwndParant,//父其窗口的句柄HMEUNhMeun,//滚动条标识/菜单的句柄HINSTANCEhInstance,//应用程序当前实例句柄NULL);2020/2/24193.按钮控件向应用程序传递消息当用户与控件交互操作时,控件向其父窗口发送WM_COMMAND消息,其wParam参数:–低字节包含控件的标识值(ID);–高字节中包含控件向父窗口发出的通知代码。按钮控件的通知代码:–BN_CLICKED单击按钮–BN_DOUBLECLICKED双击按钮–BN_SETFOCUS按钮获得输入焦点–BN_KILLFOCUS按钮失去输入焦点2020/2/24204.应用程序向按钮控件传递消息调用函数SendMessage向按钮控件发出消息,其格式:SendMessage(hwnd,message,wParam,lParam);发出的消息字参数确定动作BM_GETCHECK获取选中状态BM_SETCHECK设置/取消选中状态BM_GETSTYLE获取样式BM_SETSTYLE设置样式BM_SETSTATE设置状态BM_GETIMAGE获取按钮图标或位图句柄BM_SETIMAGE设置按钮图标或位图句柄2020/2/24214.应用程序向按钮控件传递消息(续)对同样的消息,字参数不同,动作也不同,例如,设置/取消选中标志,–若字参数应取1,则设置标志SendMessage(hwnd,BM_SETCHECK,1,0);–若字参数应取0,则设置标志SendMessage(hwnd,BM_SETCHECK,0,0);相应于对话框按钮控件,则改调用函数SendDlgItemMessage(hdlg,ID,message,wParam,lParam);2020/2/24225.按钮控件示例【例8-1】创建如右上图的按钮控件系列,当单击每一个按钮后,就出现如右下图所示的响应。[注]程序清单参见教材p192-1972020/2/2423§8.4.滚动条控件2020/2/24241.滚动条控件的功能与分类滚动条控件的功能——当应用程序显示的内容超过窗口的范围时,用户可通过拖动滚动条遍历整个窗口内容。滚动条分为垂直与水平滚动条,分别实现窗口内容纵向和横向的滚动。2020/2/24252.滚动条控件的创建三种创建方法:–创建窗口滚动条;–创建滚动条子窗口控件;–创建对话框中的滚动条控件。(1)创建窗口滚动条创建样式为WS_VSCROLL和WS_HSCROLL的窗口,其形式如下:hwnd=CreateWindow(lpszClassName,lpszTitle,WS_OVERLAPPEDWINDOW|WS_VSCROLL|WS_HSCROLL,......hInstance,NULL);2020/2/2426(2)创建滚动条子窗口控件调用CreateWindow创建子窗口滚动条控件,其形式如下:CreateWindow(“SCROLLBAR”,//预定义窗口类名lpszScrollTitle,//标题,常为NULLWS_CHILD|WS_VISIBLE…,//样式X,Y,nWidth,nHeight,//滚动框始坐标、宽度与高度hwndParant,//父其窗口的句柄ID,//滚动条标识hInstance,//应用程序当前实例句柄NULL);滚动条样式除窗口类样式外,常用的还有SBS_VERT和SBS_HORZ2020/2/2427(3)创建对话框中的滚动条控件对话框的定义中完成创建操作,一般形式如下:SCROLLBARID,X,Y,nWidth,nHeight,[style];2020/2/24283.滚动条控件发送的消息滚动操作时,该控件向应用程序发送相应的WM_VSCROLL或WM_HSCROLL消息。消息字参数wParam低字节为滚动条动作标识:–SB_TOP到滚动条顶端或右端–SB_BOTTOM到滚动条底端或左端–SB_RIGHT滚动到右边–SB_LEFT滚动到左边–SB_PAGEUP向上滚动一页–……–SB_LINERIGHT向右滚动一行–SB_THUMBPOSTION滚动框移到新位置–SB_THUMBTRACK滚动框条被拖动–SB_ENDSCROLL滚动条到最终位置2020/2/2429(1)SetScrollRange:设置滚动条的滚动范围intSetScrollRange(HWNDhwnd,intnBar,//滚动条特性标识intnMaxPos,//滚动条最大滚动位置intnMinPos,//滚动条最小滚动位置BOOLbRedraw)//当滚动条改变时是否重绘;非0表示重绘SB_CTL为控件滚动条SB_HORZ为窗口水平滚动条SB_VERT为窗口垂直滚动条(2)SetScrollPos:设置滚动块的位置intSetScrollPos(HWNDhwnd,intnBar,//滚动条的特性标识intnPos,//滚动块的位置BOOLbRedraw)//当滚动条改变时是否重绘;4.常用滚动条操作函数2020