|
在本章节中,我们将通过讨论第二章中Hello应用程序的副本,来研究文本框的属性和事件。涉及的内容包括文本框如何调用Palm OS存储器和处理它们之间的关系等。我们也将花些时间讨论与文本框相关的其它一些内容: ◆手写输入转换指示器(Graffiti shift indicators) ◆字符串资源(String resources) ◆编辑菜单的特殊之处和普通菜单 ◆Palm OS 版本可兼容代码 ◆错误信息和警告 文本框究竟是什么? 文本框其实就是一个编辑框(单行可编辑的),利用它你可以让你的用户输入文字或数据。让我们来创建一个文本框并感受学习的乐趣吧。 先在Code Warrior集成开发环境中创建一个应用程序: 1.运行Code Warrior集成开发环境。 2.选中菜单File | New Project来创建一个新的项目。 3.从项目选项中选出Hello应用程序,并重命名为你的新应用程序的名称。 4.从项目中移走原来的资源文件。你可以这样操作:在Src文件夹中用右键点击Hello.rsrc,选中Remove Selected Items。 5.到你的项目文件夹的Src目录下删除Hello.rsc。 6.运行资源构造器(Constructor)来创建一个资源文件。 7.在资源列表中选取窗体并按Ctrl+K,创建一个名为Contact Detail的窗体。点击默认名称并重新命名窗体。 8.双击窗体以打开该窗体进入编辑状态。 9.向窗体中拖放一个文本框。你可以选中菜单Window\Catalog来打开目录窗口。然后从目录窗口中拖动一个文本框控件放到窗体中。 10.命名文本框名为FirstName。你可以这样操作:点击该文本框来显示它的属性,在窗体的左边方框会出现一个窗口,点击Object Identifier属性,然后输入FirstName。 11.在这一步,最好把手写输入转换指示器(Graffiti shift indicators)放到你的窗体中。从目录窗口中拖动一个手写输入转换指示器控件放到窗体中,这个转换器的标准位置应放在窗体的右下角。 12.按以上操作后,窗体显示。 13.回到Code Warrior集成开发环境中,在项目中加入一个新的资源文件。在Code Warrior集成开发环境中选中Project | Add Files命令。 14.选中Project | Make命令编译连接项目。 15.到调试器中调试程序。首先通过菜单Project | Enable Debugger来击活调试器。 16.打开你的Palm,确认它固定在支架上。然后关掉PC的HotSync软件。 17.在PC上,选中Project | Debug命令。 18.在你的装置中,输入l连写的字母“1”,两个点号“..”,和一个数字“2”(1..2),来启动控制台程序(console)。 19.在PC上,点击OK启动调试器。 20.在调试器中点击前进箭头,执行应用程序。 在Palm上运行应用程序,点中文本框,你就可以输入文字或数字了。如果你在大字状态时向右上一挑或者在符号中一点,你放在窗体上的手写输入转换指示器会分别露出箭头或点。 需要结束应用程序时,请切记点击调试器窗口中的X来重启你的装置或停止控制台程序的运行。让控制台继续运行会引起Palm的一些问题。 如果你的手写输入转换指示器在你刚才的程序中运行顺利的话,你就可以开始进一步了解它了。但如果它没能正常工作,那么你就有必要去判定程序中是否存在阻止文本框事件被操作系统处理的代码了。正确的做法是,可以把它们放在任何窗体中,那么当你手写输入时就可以看到它的用途了。它通常被摆在窗体右下角,因为人们习惯这样做。没有程序一定需要它,但把它放到窗体中它就能工作。 从上面的例子中你可以看到许多与文本框相关的东西在工作。我们运行的窗体中的代码(hello.c)其实并没有对窗体做什么,然而我们却可以修改,输入,查找和替换文本,甚至做其它我们想做的事情。剪切和粘贴在这里不起作用。至于菜单和快捷键,我们将在以后的章节中接触到。 注意:如果你的Palm在调试器运作后出现异常,可能是因为它没有被重启或控制台依然在运行。请把你的Palm放好,用推针或回形针的尾部去顶开P alm背面小洞中的重启按钮。 属性 你可以在资源构造器中改变很多有关文本框如何工作的内容。在构造器中调出Contact Detail窗口,选中项目中的.rsrc文件,然后在Contact Detail窗体中双击文本框,它的属性会显示在旁边。所有的Palm OS 用户界面控件都有一些公共的属性,像Left Origin和Top Origin。表3-1是所有的文本框属性和描述的列表。熟悉这些属性后,重新编译并调试程序,以试验每一个属性是如何影响文本框行为的。 表3-1 名称 描述 Object Identifier 你选定的文本框名称。 Field ID 这个数值是Palm OS 用来定义特殊的用户界面对象的。 Left Origin 定义文本框左边界的位置,整个屏幕跨越160象素。 Top Origin 定义文本框上边界的位置,整个屏幕从顶到底共160象素。 Width 文本框宽度象素。 Height 文本框高度象素,你必需增加这个数值以避免砍掉一些大字体的顶部。 Usable 定义文本框是否在窗体中显示。那些没有被标记为可用的文本框是不可见或不可选的,直到它们被某个功能命令激活。 Editable 定义文本框是否可选或接受涂写输入。对大部分文本框来说,该项已被选中。 Underline 在文本框下面画上圆点线来显示它的位置。否则,在屏幕上不能指出已存在的空文本框。 Single Line 限制输入一行文本。该文本框不会垂直滚动或接受回车或Tab键的输入。 Dynamic Size 使该文本框可以根据需要扩大,以显示所有输入的文本。你必需增加代码来实现,不用担心在改变属性时没有看到它的作用。 Left Justified 使文字左对齐排列。不用检查对数字显示的有用性,所以小数排成行放置。 Max Characters 规定的最大字符数,在Palm OS禁止输入和发声报警前可以输入的字符数。 Font 文本中的字体在文本框中显示。请注意你最好根据你所选的字体手动改变文本框的高度。 Auto Shift 把输入的第一个字母变为大写。 Has Scroll Bar 这个选项使文本框在字符太多时自动加上滚动条。这会引起Palm OS发送事件,用户可以在该事件中更新滚动条显示。 Numeric 允许输入的数字转变为字符保存。 再谈事件 从第二章可以了解到,Palm OS程序,类似于Mac OS程序和Windows程序,都是以事件驱动为基础的。程序不用做任何事情(大部分是这样),直到用户的输入到来,比如按下了按钮,用输入笔或手指接触了屏幕等。 当用到文本框的时候,我们关心以下四个事件。第一,penDownEvent和penUpEvent。每一次装置的屏幕被接触时会有PenDownEvent发生。同样地,每一次输入笔离开屏幕时会有P enUpEvent发生。 对Palm OS的用户来说,界面元素事件,包括文本框的事件,被转换成为对FrmDispatchEvent()函数的调用。对于文本框事件FrmDispatchEvent() 函数其实就是转化成了其它三个事件:fldEnterEvent,fldChangedEvent和keyDownEvent。只要文本框被敲击选中,就发送FldEnterEven t。只要文本框调整它的外观,例如,水平滚轴,就发送FldChangedEvent。只要手写输入特征被识别并发送到文本框中,就发送keyDownE vent。 如果你不处理事件的话,就应该在事件处理器中返回false值。这样的话,我刚才描述的极好的自动产生事件的特性就没用了。如果事件处理器中返回t rue值,FrmDispatchEvent()处理下一个事件;如果返回false值, DispatchEvent()就调用FrmHandleEvent(),FrmHandleEvent()函数实质是把多个简单事件转化成若干复杂事件来处理的函数。以处理文本框事件为例,F rmHandleEvent()函数调用FldHandleEvent()就产生了我们刚才讨论的文本框事件。除非是在非正常的环境中,我不推荐调用FrmHandleEv ent()函数或FldHandleEvent()函数。当你想进一步地处理特殊的事件时,请留意从你的事件处理器中返回的false值。 现在让我们来修改Contacts项目中的代码,调用标注了日期的刚创建的新资源。使用资源管理器,复制另一个Hello.c副本到Contacts项目的S rc文件夹中。把它重命名为Contacts.c,然后通过选中Project | Add Files命令把它重新加入到项目中。使用新的Contacts_res.h头文件来替代hello_res.h,在Contacts.c文件中包含它。做完这些后,为了使代码能成功编译并连接,你还必需将引用从H elloForm改到ContactDetailForm。到现在,虽然我们还在使用错误的资源文件,但程序已经可以工作了,因为表示HelloForm窗体的ID与表示C ontactDetailForm窗体的ID是相同的。构造器经常从1000开始赋窗体的ID值的。 其它的需要修改的内容是case语句,在程序中找到处理ctlSelectEvent事件的case语句。下面就是要找的,它表示按钮被按下的事件: //CH.2 The botton was pressed case ctlSelectEvent; SndPlaySystemSound(sndAlarm); return(false); 到现在为止,Contacts程序中的case语句还没有做完。由于窗体中并没有按钮,所以根本没有机会收到ctlSelectEvent事件。那么就让我们通过改变c ase语句来捕获penDownEvent事件吧,它会使你更有信心的。用下面的代码替换上面的case ctlSelectEvent代码: //CH.3 The pen touched down case penDownEvent; SndPlaySystemSound(sndAlarm) | |
| Palm Powered设备上的增强型音频 编写Palm J2ME红外线“聊天”程序 PALM开发教程-… PALM开发教程-… PALM开发教程-… PALM开发教程-… PALM开发教程-… Palm OS上发送和&… Palm OS上常用编&… Palm OS上如何利&… |
| 文章评论 | |||