[翻译]-WinCE 程序设计 (3rd 版)--4.3 Windows控件

 

如果没有Windows控件库的话,编写Windows程序将会是一件缓慢而又艰苦的事情。并且,每个程序将会有自己的外观和反应。这会迫使用户对每种新的应用程序都要学习一套新的操作方式。幸运的是,通过操作系统提供的一系列控件,避免了上述情况的发生。简单的说,控件只不过是预先定义好的窗口类。每个类有一个Windows提供的特定的窗口过程,给这些控件提供预定义的用户和编程接口。

因为控件只是又一个窗口,所以可用CreateWindows或CreateWindowEx来创建窗口。控件是通过事件来通知父窗口的,而事件中包含WM_COMMAND消息,并且控件ID和句柄都编码在消息的参数中。

和所有的消息一样,WM_COMMAND含有wParam和lParam这两个通用参数。对一个WM_COMMAND消息来说,wParam的高字位含有通知码,用来说明发送该消息的原因。wParam的低字位含有发送该消息的控件的ID,通常在创建控件的时候定义该ID,为了更好的使用,应该保证ID在控件的所有兄弟窗口中是唯一的。lParam则包含了控件窗口的句柄。通常,通过控件ID来追踪WM_COMMAND消息来源比通过控件的窗口句柄来追踪要更容易一些,不过这两个信息都可以从该消息中获得。下面是典型的WM_COMMAND消息处理程序中的头几行代码:
case WM_COMMAND:
    WORD idItem, wNotifyCode;
    HWND hwndCtl;
  
    // Parse the parameters.
    idItem = (WORD) LOWORD (wParam);
    wNotifyCode = (WORD) HIWORD(wParam);
    hwndCtl = (HWND) lParam;

从这里可以看出,WM_COMMAND消息处理程序通常是用控件ID和通知码来判断WM_COMMAND消息发送的原因。

通过给控件发送预定义的消息,可以配置和操纵控件。除了这些事情,应用程序可以设置按钮的状态,给列表框增加或删除项,设置编辑框中选择的文本,所有这些都是通过给控件发送消息来完成的。控件通常是通过ID来标识的,但许多Window函数都要求用控件的句柄。这时可以用GetDlgItem函数来进行简单的转换。函数原型如下:
HWND GetDlgItem(HWND hDlg, int nIDDlgItem);
两个参数分别是控件的父窗口句柄和控件的ID。虽然从名字上看这个函数只能用在对话框上,但实际上它能用在任何窗口的控件上。关于对话框我将在第六章进行讨论。

另外一个很方便的函数是SendDlgItemMessage,用于给控件发送消息。该函数发送消息给指定ID的子窗口。函数原型如下:
LONG SendDlgItemMessage (HWND hParent, int nIDChild, UINT Msg, WPARAM wParam, LPARAM lParam);
这些参数和SendMessage中的很类似。实际上,下面的这段代码从功能上讲和SendDlgItemMessage是一样的。
LONG SendMessage (GetDlgItem (hParent, nIDChild), Msg, wParam, lParam);
唯一的不同在于方便性,SendMessage没有嵌入GetDlgItem而已。

下面是六个预定义的窗口控件类。它们是:
Button 各种按钮。
Edit   一种用于输入和显示文本的窗口。
List   一种包含字符串列表的窗口
Combo 编辑框和列表框的组合。
Static 显示用户不能编辑的文本或图片的窗口
Scroll bar 未和具体窗口进行绑定滚动条

每个控件都有很多函数,所以本章难以涉及全部。但我会快速浏览一下这些控件,对重要的函数也会提及的。后面还会为您展示一个示例程序--CtlView,用来演示这些控件及它们同父窗口之间的交互。

按钮控件
按钮控件允许有几种输入方式,并且有许多风格,包括下压按钮、复选框和单选框。每种风格都是为特定用途设计的,例如,下压按钮用来接收即时输入,复选框用于开/关(on/off)输入,单选框用于从多个选择中挑选一个。

下压按钮
下压按钮通常用于激发某种行为。当用户用手写笔按一个下压按钮,按钮会发送WM_COMMAND消息,其中wParam参数的高字位包含BN_CLICKED(用于按钮被单击的通知)通知码。

复选框
复选框包括一个正方形的框和一个标签,用来让用户指定选择。复选框会保持选择或未选择状态,直到用户点击它或者程序强制按钮改变状态。除了标准BS_CHECKBOX风格外,复选框还有一个三态风格BS_3STATE,允许按钮失效并显示为灰色。另两个风格BS_AUTOCHECKBOX和BS_AUTO3STATE,会自动更新控件的状态和外观来反映出选择或未选择以及三态复选框下的失效风格。

和下压按钮一样,当单击复选框时,它会发送BN_CLICKED通知。除非复选框具有前面说的自动风格,否则需要应用程序负责手工改变按钮的状态。通过给按钮发送BM_SETCHECK消息来设置按钮的状态,其中,把参数wParam设置为0来取消按钮选择,设置为1则是选择按钮。对于三态复选框,可以将BM_SETCHECK消息的wParam参数设置为2来表示按钮失效状态。通过BM_GETCHECK消息,应用程序可以判断当前按钮状态。

单选框
单选框允许用户从多个选项里进行选择。单选框将多个按钮集分组,每组集合里同时只有一个能被选中。如果使用的是标准风格BS_RADIOBUTTON,则需要由应用程序负责选中或取消选中单选框,来保证同时只有一个被选中。当然,和复选框一样,单选框有一个BS_AUTORADIONBUTTON风格,用来自动维护按钮组的状态,来保证只有一个被选择。

分组框
您可能会奇怪,分组框也是一种按钮。分组框看起来象一个带有文本标签的中空的框,包围着被分成一组的控件集。分组框只是用于分组,除了其上的标题文字外,没有其它编程的接口,该标题文字是在创建分组框的时候作为其窗口标题文字而指定的。应该在创建分组框内的控件后创建分组框。这可以保证分组框在Z坐标上低于其内的控件。

在Windows CE设备上使用分组框应该小心。问题不在于分组框自身,而在于Windows CE较小的屏幕。分组框占用了颇有价值的屏幕,而这本应该可以被功能控件更好的使用的。尤其是在具有非常小的屏幕的Pocket PC上会出现这种情况。在许多情况下,在控件集之间绘制一条线就可以明显将控件分组了,这和使用分组框的效果一样。

定制按钮外观
通过使用许多附加风格,您可以进一步定制目前提到的按钮的外观。风格BS_RIGHT,BS_LEFT,BS_BOTTOM和BS_TOP允许您指定按钮文本的位置,而不是使用默认在按钮上居中的风格。BS_MULTILINE风格允许您在按钮上指定多行文本。文字会自动调整来适合按钮的。按钮文字中的换行符(/n)可以用来具体指定从哪里换行。Windows CE并不支持BS_ICON和BS_BITMAP按钮风格。

自绘制按钮
通过指定BS_OWNERDRAW风格,您可以完全控制按钮的外观。当按钮被指定为自绘制风格,则由拥有按钮的窗口负责绘制按钮可能出现的所有状态。当窗口包含有自绘制按钮时,会收到一个WM_DRAWITME消息,用来通知窗口有一个按钮需要绘制。对于该消息,wParam参数包含有按钮ID,lParam则指向一个DRAWITEMSTRUCT结构,该结构定义如下:
typedef struct tagDRAWITEMSTRUCT
{
    UINT CtlType;
    UINT CtlID;
    UINT itemID;
    UINT itemAction;
    UINT itemState;
    HWND hwndItem;
    HDC hDC;
    RECT rcItem;
    DWORD itemData;
} DRAWITEMSTRUCT;
CtlType设置为ODT_BUTTON(自绘制按钮),CtlID则和wParam一样,包含有按钮ID。itemAction包含标志位,指出需要绘制什么和为什么绘制。这些域中最重要的是itemState,它包含了按钮选择、失效等状态。hDC包含了按钮窗口的设备描述表句柄,rcItem则包含了按钮的尺寸。对自绘制按钮来说,itemDate应该设置为NULL。

正如您所期望的,WM_DRAWITEM处理程序中包含有许多GDI函数,用来绘制线条、矩形以及绘制按钮所需要的一切。绘制按钮的一个重要方面是要和系统中其它窗口的标准颜色匹配。因为这些颜色是可变的,所以不能硬编码到程序里。您可以通过GetSysColor函数来查询出合适的颜色。函数原型如下:DWORD GetSysColor(int nIndex);
该函数返回的是为系统中窗口和控件的不同外观而定义的颜色的RGB值。在众多作为参数的预定义索引值中,COLOR_BTNFACE返回的是按钮的表面颜色,COLOR_BTNSHADOW返回的是用于创建三维按钮的暗色。

编辑框
编辑框是一种允许用户输入和编辑文本的窗口。正如您所猜想的,编辑框是Windows控件库中最方便的控件之一。编辑框具有完整的编辑功能,包括与系统剪切板交互来剪切、复制和粘贴等,而这些都不需要应用程序协助。编辑框可以显示单行文本,或者当指定EX_MULTILINE风格时,显示多行文本。桌面版Windows中提供的记事本就是一个包含多行编辑框的顶层窗口。

编辑框有一些其它特性需要提一下。具有ES_PASSWORD风格的编辑框默认将输入的每个字符显示为星号(*)。控件保存了真正的字符。ES_READONLY风格则保护控件里的文本只能读和复制,但不能被修改。ES_LOWERCASE和ES_UPPERCASE风格则把输入的字符强制转换为对应的大小写。

通过WM_SETTEXT消息可以给编辑框添加文本,通过WM_GETTEXT消息可以检索文本。通过EM_SETSEL消息可以控制文本选择。该消息指定选择区域的起始字符和终止字符。其它消息允许查询和设置光标(指出在编辑域里的当前入口点)的位置。多行编辑框包含许多其它消息,比如控制滚动、按行列位置访问字符等。

列表框控件
列表框控件显示一个文本项列表,用户可以从中选择一个或多个项。列表框可以存储文本,还可以对列表项排序,管理列表项的显示,包括滚动显示等。通过设置列表框,可以允许单选、多选或者禁止选择列表项。

通过给列表框发送LB_ADDSTRING或LB_INSERTSTRING消息,传递指向字符串的指针到lParam参数里,就可以增加列表项。LB_ADDSTRING消息会把新添加的字符串放到列表项的尾部,而LB_INSERTSTRING可以把字符串放到列表项的任何位置。使用LB_FIND消息可以在列表框中搜索特定的项。

使用LB_GETCURSEL可以查询单选列表框的选择状态。对于多选框,使用LB_GETSELCOUNT和LB_GETSELITEMS来检索当前选择的项。使用LB_SETCURSEL和LB_SETSEL消息,可以用编程的方式来选择列表框里的项。

除了不支持自绘制列表框以及LB_DIR消息族,Windows CE支持大部分其它版本Windows所支持的列表框功能。Windows CE支持一种新风格LBS_EX_CONSTRINGDATA。具有这种风格的列表框不保存传给它的字符串,而是保存指向字符串的指针,并且由应用程序负责维护字符串。对于可能从资源文件中装载大型字符串数组的情况,使用这种处理方式可以节省内存,因为列表框不用维护一个字符串列表的单独副本。

组合框
组合框(如名字所暗示的)是控件的组合,也就是一个单行编辑框控件和列表框的组合。在从多个选项列表中选择一项或者为预定义的建议输入值提供编辑功能时,组合框是很节省空间的。在Windows CE下,组合框具有两种风格:下拉方式和下拉列表方式。(简化方式的组合框并不支持。)下拉风格的组合框包括一个编辑区域和一个位于右端的按钮。点击按钮会显示一个列表框,包含了更多选项。在选项上选择一个,会用选择的内容填写组合框的编辑域。下拉列表风格的组合框使用静态文本控件替代了编辑框。这允许用户从列表中选择一项,并防止用户输入不在列表中的项。

因为组合框组合了编辑控件和列表框控件,所以组合框的消息列表就像是这两个基本控件的消息组合。CB_ADDSTRING,CB_INSERTSTRING和CB_FINDSTRING的效果和列表框里中的同类消息类似。同样地,对下拉风格或下拉列表风格的组合框使用CB_SETEDITSELECT和CB_GETEDITSELECT消息,可以设置和查询编辑框里被选择的字符。而要控制下拉风格或下拉列表风格的组合框的下拉状态,可以使用CB_SHOWDROPDOWN和CB_GETDROPPEDSTATE消息。

和列表框的情况一样,Windows CE不支持自绘制组合框。但是组合框支持扩展风格--CBS_EX_CONSTSTRINGDATA,具有这种风格的组合框不保存列表项字符串,而是保存指向字符串的指针。和具有LBS_EX_CONSTSTRINGDATA风格的列表框一样,当应用程序有存储在ROM里的大型字符串数组时,这种处理方式可以节省内存,因为组合框不用维护字符串列表的单独副本。

静态控件
静态控件是显示文本、图标或者位图的窗口,不具有用户交互性。可以使用静态文本控件来标记窗口中的其它控件。静态文本控件显示的效果是由文本和控件风格来决定的。在Windows CE下,静态控件支持以下几种风格:
SS_LEFT 文本左对齐显示。如果需要,文本会折行来适应控件大小。
SS_CENTER 将文本在控件中间显示。如果需要,文本会折行来适应控件大小。
SS_RIGHT 文本右对齐显示。如果需要,文本会折行来适应控件大小。
SS_LEFTNOWORDWRAP 文本左对齐显示。文本不会折成多行显示,任何超出控件右边界的文本都会被裁剪掉。
SS_BITMAP 显示一个位图。控件的窗口文字指定了包含位图的资源的名字。
SS_ICON   显示一个位图。控件的窗口文字指定了包含图标的资源的名字。

具有SS_NOTIFY风格的静态控件在被点击、有效或失效的时候,会发送WM_COMMAND消息,但是Windows CE版的静态控件在双击的时候不会发送通知消息。SS_CENTERIMAGE风格在和SS_BITMAP或SS_ICON一起使用的时候,会使图片在控件上居中显示。SS_NOPREFIX风格可以和文本风格一起组合使用。能够避免将&符号解释为转义符号,防止把下个字符解释成加速字符。

Windows CE不支持具有SS_WHITEFRAME或SS_BLACKRECT风格的显示成填充矩形或中空矩形的静态控件;也不支持自绘制静态控件。

滚动条控件
滚动条控件是一个与其它控件有些不同的家伙。通常滚动条是绑定在窗口的侧边,用来控制窗口里数据的显示的。实际上,诸如编辑框和列表框等窗口控件都内部使用了滚动条控件。正是因为这种和父窗口的紧密关系,使得滚动条的接口与其它控件的有所不同。

滚动条使用WM_VSCROLL和WM_HSCROLL消息而不是WM_COMMAND消息来报告行为。垂直滚动条会发送WM_VSCROLL消息,水平滚动条会发送WM_HSCROLL消息。另外,不使用SB_SETPOSITION消息来设置滚动条的位置,而是有专用的函数来完成。下面来看一下这个独特的接口。

滚动条消息
一旦用户点击垂直滚动条来改变其位置的时候,WM_VSCROLL消息会发送到垂直滚动条的拥有者上。WM_HSCROLL则是当用户点击水平滚动条的时候发送到其拥有者上的。对这两个消息来说,wParam和lParam参数是一样的。wParam的低字位包含的代码指出为什么会发送该消息。图4-1显示了水平和垂直滚动条以及如何在滚动条不同位置点击来产生不同的消息。wParam的高字位包含滑块的位置,但仅仅在您处理SB_THUMBPOSITION和SB_THUMBTRACK代码(后面将简单介绍它们)时,这个值才是有效的。如果发送消息的滚动条是独立的没有绑定到窗口的控件,那么lParam参数则包含有滚动条的窗口句柄。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值