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 |
| [] [返回上一页] [打 印] |
|
文章评论 |
