按钮
图形界面和消息处理是任何一个基于Windows的应用程序必须认真考虑的事情。在前面的章节中已经介绍了Windows应用程序消息处理的机制,这种机制对于所有对象的消息处理都是一致的,即实行客户(用户操作或请求)到操作系统(捕获消息)到应用程序(接收消息并执行处理代码)的机制。而图形界面则包含丰富的内容,主要是指各种各样的控件,不仅包括前面章节中介绍的主窗口,还包括按钮、编辑框、滚动条等具有窗口风格的子窗口。丰富的图形界面元素为建立界面友好的应用程序提供了可能,而完整的消息处理机制则为应用程序的功能提供了高效集成的保证。 概述 子窗口的概念包含两方面的含义: 从创建子窗口的过程来看,Createwindow函数为创建各类窗口提供了统一的函数,并且子窗口的类型唯一由第一个参数确定;从窗口的界面风格来看,这些子窗口都拥有窗口的许多性质。 设计含有子窗口的程序都从调用函数 CreateWindow开始,它一共有 11个参数,指定待创建的子窗口的类型、标题、风格等非常重要的性质。 CreateWindow函数的原型定义如下: HWND CreateWindow(LPCTSTR lpClassName, // 指定子窗口的类名 LPCTSTR lPWindowName, // 指定窗口名称 DWORD dwSty1e, // 指定窗口风格 int x, // 指定窗口左上角顶点的水平坐标 int y, // 指定窗口左上角顶点的垂直坐标 int nWidth, // 指定窗口宽度 int nHeight, // 指定窗口高度 HWND hWndParent, //父窗口句柄,允许为NULL HMENU hMenu, //窗口的菜单句柄或者是子窗口自己的标识符 HANDLE hInstance, //应用程序句柄,可以为NULL LPVOID lpParam //指向lParam数值的指针); 当子窗口创建成功后,返回子窗口的句柄,否则返回NULL。在11个参数中 lpClassName、dwStyle和hMenu是三个最重要的参数。下面分别讲述它们的意义。 lpClassName指定子窗口的类名,它们的取值可以是如表所示的值。 子窗口类型 类名 描述 按钮 Button 创建按键按钮、单选按钮和三态按钮。 静态文本框 Static 显示用户不可直接编辑的文本,一般为标题。 滚动条 ScrollBar 滚动视图。 列表框 ListBox 显示具有多个子项的列表框。 编辑框 Edit 允许用户直接编辑文本。 组合框 ComboBox 与列表框类似,但多一个编辑区域。 多文档客户窗口 MDICLIENT 创建多文档应用程序的客户窗口。 dwStyle指定子窗口的风格。这里只讲述一般窗口的风格,表所列的子窗口的风格在后面内容中分别讲述。一般窗口的风格取值如表所示。 取值 效果 WS_BORDER 创建一个带有窄边框的了窗口。 WS_CAPTION 创建一个带有标题栏的子窗口,包含了WS_BORDER。 WS_CHILD 创建子窗口,必须指定,并且不能与WS_POPUP同时使用。 WS_CHILDWINDOW 同WS_CHILD。 WS_CLIPCHILDREN 适用于父窗口,不会被子窗口覆盖。 WS_DISABLED 创建一个禁活的窗口,不接收用户的输入信息。 WS_DLGFRAME 创建一个对话框风格的窗口,并且不能与WS_CAPTION同用。 WS_GROUP 允许用户通过Tab键在子窗口之间切换。 WS_HSCROLL 创建带水平滚动条的了窗口。 WS_ICONIC 创建最小化的子窗口。 WS_MAXIMIZE 创建最大化的子窗口。 WS_MAXIMIZEBOX 创建具有最大按钮的子窗口。 WS_MINIMIZE 同WS_ICONIC。 WS_MINIMIZEBOX 创建最小按钮的子窗口。 WS_SIZEBOX 创建可缩放边框的子窗口。 WS_SYSMENU 使子窗口有系统菜单。 WS_TABSTOP 指定用户第一次接下Tab键时输入焦点所属的子窗口。 WS_THICKFRAME 同WS_SIZEBOX。 WS_VISIBLE 创建初始化可视的窗口。 WS_VSCROLL 使窗口具有垂直滚动条。 参数hMenu指定菜单句柄或者子窗口的标识符。例如,已建立的菜单资源标识符为IDM_MENU, 窗口需要加载该菜单,则 hMenu参数可为 IDM_NENU子窗口的标识符可以是字符或者数字,但同一个应用程序中不同子窗口的 标识符必须相异,并且前面加上(hMENU)来满足参数类型兼容的要求。 应用程序运行后,首先创建主窗口,并发送WM_CREATE消息,由于在该消息的处理代码中含有创建子窗口的代码,于是就创建了子窗口。当子窗口的WS_VISIBLE风格指定后,子窗口就显示出来。 同前所讲的消息处理机制类似,子窗口的消息也主要依靠参数lParam和wParam来完成。 应用程序创建子窗口后,在主窗口的消息处理函数中一般使用SendMessase向子窗口发送消息。当用户对子窗口进行某种操作后,将向父窗口发送WM_COMMAND类型的通知消息。其中,lParam包含子窗口的句柄;wParam参数的高位字节为通知代码,低位子代表子窗口的标识符。 下面将分别讲述各种子窗口的特有风格以及消息循环,并结合实例介绍子窗口的应用。 一、Button子窗口 Button(按钮)是Windows子窗口的最常用的元素之一。例如安装程序中选择Next或者Back按钮。 1. 按钮类型 依据操作的类型可以把按钮分为按键按钮、单选按钮、复选按钮,另外还有存放单选按钮和复选按钮的按钮组合框(GroupBox)。 按键按钮一般执行某项功能,例如弹出新的窗口。在创建子窗口的函数中,如果需要创建按键按钮,则dwStyle参数指定为BS_PUSHBUTTON。 当某些选择相互排斥时,需要用到单选按钮,例如字体或者颜色。单选按钮的左端为一个圆圈,选中单选按钮,则显示实心,相反为空心圆。在同一个按钮组合框里的众多单选按钮中,用户只能选择一个。如果需要单选按钮,则dwStyle 参数必须指定为BS_RADIOBUTTON。 当某些选择可以相互并存时,需要用到复选按钮。复选按钮的风格与单选按钮类似,左端为圆圈或者小空心正方形。在同一个按钮组合框里的复选按钮可以同时被选中几个。如果需要创建,则dwStyle参数设置为BS_CHECKBOX。 在复选按钮中还有一类特殊的按钮,即三态按钮。顾名思义,三态按钮允许有三种状态:选中(Selected)、本选中(Unselected)、显灰(Grayed)。三态按钮在需要把单选按钮和复选按钮放在同一个组合框里时才有应用的价值,若要创建三态按钮,则把dwStyle参数设置为BS_3STATE。 按钮的风格取值如表所示。 按钮风格 描述 BS_AUTOCHECKBOX 创建一个自动选中的复选按钮,只有复选按钮在复选框里改设置值才起作用。 BS_AUTORADIOBUTTON 创建一个自动选中的单选按钮。 BS_AUTO3STATE 创建自动的三态按钮。 BS_CHECKBOX 创建一个复选按钮。 BS_DEFPUSHBUTTON 创建默认选中的按键按钮,当用户按下Enter键时,则表示选择该按键按钮。 BS_GROUPBOX 创建按钮组合框,当创建一组单选按钮或者复选按钮时,首先需要创建该按钮组合框。 BS_LEFTTEXT 创建单选按钮或复选按钮时,指定按钮名称的文本出现在左边。 BS_OWNERDRAW 创建自画按钮,必须先创建图形资源。 BS_PUSHBUTTON 创建按键按钮。 BS_RADIOBUTTON 创建单选按钮。 BS_3STATE 创建三态按钮 按钮有自己特殊的消息类型。当用户选择了按钮时,它将向父窗口发送WM_COMMAND消息,这些通知消息包含在wParam的高位字节中。按钮的通知代码如表所示。LOWORD(wParam)==按钮ID HIWORD(wParam)==控制码 通知代码 描述 BN_CLICKED 表示用户单击丁该按钮 BN_DOUBLECLICKED 表示用户双击了该按钮 BN_HILITE 表示按钮显亮 BN_UNHlLlTE 取消按钮显亮 BN_PAINT 绘制按钮 BN_DISABLE 表示按钮禁活 BN_PUSHED 用户选中该按钮并按下了Enter键 BN_SETFOCUS 输入焦点转移到该按钮