WAP之家:为您提供最全最新的WAP技术,CP.SP.3G等行业资讯。 WAP之家交流论坛全新开放 点击进入>>
WAP资讯 | 3G动态 | SP动态 | 运营商动态 | 内容商动态 | 制造商动态 | 论坛讨论>> 每次自动访问
WAP技术 | WAP源码 | 手机编程 | 手机源码 | 无线技术 | J2ME技术 | 手机软件 添加到收藏夹
IVR技术 | SP资料 | SMS MMS技术 | 商业方案 | IVR下载 | 书籍教程 | 工具软件 语言:繁體中文

WAP之家技术文章手机编程PlamPALM开发教程-第十三章 再论用户界面

PALM开发教程-第十三章 再论用户界面
作者:palmheart  来源:palmheart.net  发布时间:2005-12-21 3:41:03
ew( MAX_NUMBER_SIZE );

// Lock the memory, get the pointer
cpNumber = MemHandleLock( hNumber );

// Initialize it
StrCopy( cpNumber, "0" );

// Unlock the field's memory
MemHandleUnlock( hNumber );

这四个函数和FieldToy中的函数十分相似。我们用了三个Memory Manager函数(Ref3.pdf)来分配和初始化计算器显示字段的内存。函数MemHandleNew()分配内存,函数MemHandleLock()防止在我们使用时重新分配内存,函数StrCopy()(定义于String Manager)用来把显示内存块初始化零。最后我们使用函数MemHandleUnlock()对内存块解锁。
获取和使用系统优先权

// Handle the number format
switch( dChoice )
{
default:
cComma = ',';
cPoint = '.';
break;

case nfPeriodComma:
cComma = '.';
cPoint = ',';
break;

case nfSpaceComma:
cComma = ' ';
cPoint = ',';
break;

case nfApostrophePeriod:
cComma = '\'';
cPoint = '.';
break;

case nfApostropheComma:
cComma = '\'';
cPoint = ',';
break;
}

// We're done
return;
}

在初始化程序的最后是有关读取系统优先权的代码,它用来描述数字是怎样显示的。我们先调用了函数PreGetPreference()来获取系统的优先权,然后使用了switch语句来赋值静态变量cComma和cPoint。PreGetPreference()是系统优先函数中的一个。
函数Function calcStop():结束库MathLib

//----------------------------------------------------------------------------
void calcStop(
//----------------------------------------------------------------------------
// Cleans up stuff from this module.
//----------------------------------------------------------------------------
void )
//----------------------------------------------------------------------------
{
UInt uiUseCount;

// Close MathLib
MathLibClose( MathLibRef, &uiUseCount );
if( uiUseCount == 0 )
SysLibRemove( MathLibRef );

// Free the number field chunk
MemHandleFree( hNumber );

// We're done
return;
}

上面是与函数calcInit()相对应的函数calcStop()。首先,我们关闭与MathLib的连接。MathLib可以跟踪到底有几个程序在使用它,我们使用它返回的值来确定是否应该移除这个公用库。由于Palm OS是一个单任务的操作系统,所以一般情况下,调用这个函数是不会错的。函数SysLibRemove()是一个保留函数,但MathLib的创建者建议在这种情况下使用这个函数。
最后,我们使用函数MemHandleFree()(定义于么Memory Manager)来释放显示所使用的内存。
CalcFormEventHandler的修改

//----------------------------------------------------------------------------
Boolean calcFormEventHandler(
//----------------------------------------------------------------------------
// Handles events for this form.
// Returns true if it fully handled the event.
//----------------------------------------------------------------------------
EventPtr spEvent )
//----------------------------------------------------------------------------
{
// Handle the event
switch( spEvent->eType )
{

这是一个“老式”的calcFormEventHandler()函数,它和我们上一章的函数没有任何区别。我们需要完全重写了这个函数。

初始化字段

// The form is opened
case frmOpenEvent:
{
FormPtr spForm;
Word wIndex;
FieldPtr spField;
ControlPtr spButton;
char caPoint[2];

// Get the field
spForm = FrmGetActiveForm();
wIndex = FrmGetObjectIndex( spForm, calcNumberField );
spField = FrmGetObjectPtr( spForm, wIndex );

// Draw the field
FldSetTextHandle( spField, hNumber );
FldDrawField( spField );

在窗体被加载后,事件frmOpenEvent就立即发生。当我们获知窗体被加载后就使用这个事件来初始化窗体。首先,我们使用三个函数FrmGetActiveForm()、FrmGetObjectIndex()、FrmGetObjectPtr()来获取字段的指针。然后我们使用Field Manager中的函数FldSetTextHandle()和FldDrawField()来设置文本句柄(text handle)并将其显示在编辑框里。注意,即使我们在使用同一个内存块,每一次显示一个字段也必须调用FldSetTextHandle(),这是因为在这个函数中Palm OS都要重新计算大小和设置字段文本。
例如,如果我们输入了123,但是中间没有调用函数FldSetTextHandle(),在初始值0的地方只会出现数字1。这是因为如果不调用FldSetTextHandle()或类似的函数来改变其字段长度,它就会沿袭初始字段长度只有一。
改变按钮文本

// Get the decimal point button
wIndex = FrmGetObjectIndex( spForm, calcPointButton );
spButton = FrmGetObjectPtr( spForm, wIndex );

// Draw the decimal point button
caPoint[0] = cPoint;
caPoint[1] = '\0';
CtlSetLabel( spButton, caPoint );
}
break;

由于Palm OS允许用户改变数字的外形,在理想的情况下,我们必须强制界面来反映这种变化。我们使用一个其它的扩展字符来代表小数点按钮上的符号。
首先我们调用函数FrmGetObjectIndex()和函数FrmGetObjectPtr()(定义于Form Manager,Ref1.pdf)获得按钮结构的指针。为小数点创建一个字符,然后调用函数CtlSetLabel()来改变标签内容并重绘按钮(Control Manager,Ref1.pdf)。
处理窗体按钮事件

// A control was selected
case ctlSelectEvent:
{
// Handle the different buttons
switch( spEvent->data.ctlSelect.controlID )
{
case calcAddButton:
calcAdd();
break;

case calcChangesignButton:
calcChangeSign();
break;

case calcClearButton:
calcClear();
break;

case calcDivideButton:
calcDivide();
break;

case calcDoneButton:
{
FormPtr spForm;
Word wIndex;
FieldPtr spField;

// Get the field
spForm = FrmGetActiveForm();
wIndex = FrmGetObjectIndex( spForm, calcNumberField );
spField = FrmGetObjectPtr( spForm, wI

上一页  [1] [2] [3] [4] [5] [6] [7] [8]  下一页

[] [返回上一页] [打 印]
文章评论

用户名: 查看更多评论

分 值:100分 85分 70分 55分 40分 25分 10分 0分

内 容:

         (注“”为必填内容。) 验证码: 验证码,看不清楚?请点击刷新验证码