PALM开发教程-第八章 表和滚动条 |
| 作者:palmheart 来源:palmheart.net 发布时间:2005-12-21 3:35:05 |
|
k; } // CH.8 Now refresh the table drawTable(); } return( true ); 这些代码十分简单。注意由于响应重复按钮事件,所以需在ctlRepeatEvent事件中添加代码。对于向上的箭头,每按一次游标中减一;对于向下的箭头,没按一次游标中加一。 为了保证安全,需要检查游标到底能移到什么地方。在绘制表的过程中,我们会重新绘制按纽,或在需要的地方使按钮变得不可用。 为了完成这个操作,在drawTable()的按钮响应事件中添加以下代码: // CH.8 Get pointers to the arrow buttons upArrow = getObject( form, ContactListRecordUpRepeating ); downArrow = getObject( form, ContactListRecordDownRepeating ); // CH.8 Update the arrow buttons and scrollbars if( numRecords > TABLE_NUM_ROWS ) { // CH.8 Show the up arrow if( cursor > 0 ) { CtlSetLabel( upArrow, BLACK_UP_ARROW ); CtlSetEnabled( upArrow, true ); } else { CtlSetLabel( upArrow, GRAY_UP_ARROW ); CtlSetEnabled( upArrow, false ); } CtlShowControl( upArrow ); // CH.8 Show the down arrow if( cursor >= numRecords - TABLE_NUM_ROWS ) { CtlSetLabel( downArrow, GRAY_DOWN_ARROW ); CtlSetEnabled( downArrow, false ); } else { CtlSetLabel( downArrow, BLACK_DOWN_ARROW ); CtlSetEnabled( downArrow, true ); } CtlShowControl( downArrow ); // CH.8 Show the scrollbar FrmShowObject( form, FrmGetObjectIndex( form, ContactListScrollbarScrollBar ) ); SclSetScrollBar( getObject( form, ContactListScrollbarScrollBar ), cursor, 0, numRecords - TABLE_NUM_ROWS, TABLE_NUM_ROWS ); } else { // CH.8 Hide the arrows CtlHideControl( upArrow ); CtlHideControl( downArrow ); // CH.8 Hide the scrollbar FrmHideObject( form, FrmGetObjectIndex( form, ContactListScrollbarScrollBar ) ); } // CH.8 We're done return; } 如果表的位置在开头或末尾,我们将重复按钮打上灰晕使之为不可用。这样就防止了游标被置到一个不存在值。 这样工作就完成了,重复按纽实现了象表的滚动条箭头一样的功能。 对PAGE UP和PAGE DOWN键的支持 为了捕捉PAGE UP和PAGE DOWN键,首先必须在keyDownEvent里添加代码。数学上的知识可以给我们一些提示。在当向上翻页或向下翻页,最好能在页面上留下一条常识的线。移动记录时不应移动到TABLE_NUM_ROWS,而应移动到TABLE_NUM_ROWS-1。由于不能使上下翻页键为不可用,就必须保证在按下它们时不会超出游标的移出范围。此外,游标和numRecords都是无符号的,所以必须在做数学运算前进行检查,避免它们变为负数而指向了不存在的值。这需要对contactListHandleEvent()作一些修改: // CH.8 Respond to up and down arrow hard keys case keyDownEvent: { switch( event->data.keyDown.chr ) { // CH.8 Up arrow hard key case pageUpChr: if( cursor > TABLE_NUM_ROWS - 1 ) cursor -= TABLE_NUM_ROWS - 1; else cursor = 0; break; 对向上翻页来说,运算相当简单。如果向上翻页没有使记录游标小于零,向上翻一整页;否则,就翻到零记录为止。 // CH.8 Down arrow hard key case pageDownChr: if( (numRecords > 2 * TABLE_NUM_ROWS - 1) && (cursor < numRecords - 2 * TABLE_NUM_ROWS - 1) ) cursor += TABLE_NUM_ROWS - 1; else cursor = numRecords - TABLE_NUM_ROWS; break; } // CH.8 Now refresh the table drawTable(); } break; 对向下翻页来说,必须注意,当游标是numRecords减去TABLE_NUM_ROWS后(切记游标是基于零的),表是否已经到了最后的一条记录。所以首要的是检查翻页是否超出了最后一个记录。首先,保证表中有足够的记录在从numRecords中减去它后仍是一个正数。然后再检查游标是否到了最后一条记录。如果没有,向下翻一个整页。如果已超过了最后一条记录,翻到最后一条记录为止。 在程序的最后,和滚动按钮程序一样重新绘制表。完成这些后就可以支持翻页键了。 设计滚动条 滚动条需要在事件处理和订制程序中都添加一小段代码,首先来看一下事件处理中的代码: // CH.8 Respond to scrollbar events case sclRepeatEvent: cursor = event->data.sclExit.newValue; drawTable(); break; 使游标和新的滚动条值相等,就可以响应滚动条滚动事件。如果正确地设置了滚动条滚动的范围,就能保证不会使游标得到错误的值。在为游标赋值后,和其它的滚动条类型一样,需要刷新表和滚动条。 下面,看看添加在drawTable()中的代码。代码添加在滚动按钮代码中的if(numRecords>TABLE_NUM_ROWS)声明后面: // CH.8 Show the scrollbar FrmShowObject( form, FrmGetObjectIndex( form, ContactListScrollbarScrollBar ) ); SclSetScrollBar( getObject( form, ContactListScrollbarScrollBar ), cursor, 0, numRecords - TABLE_NUM_ROWS, TABLE_NUM_ROWS ); 在这里显示了滚动条,并将其设置了精确的值。因为我们已知道表中存在的记录比可见的行数多,所以numRecords-TABLE_NUM_ROWS不会产生一个错误的结果。 但如果不是这样,而是存在的记录比可见的行数要少,就要隐藏滚动条: // CH.8 Hide the scrollbar FrmHideObject( form, FrmGetObjectIndex( form, ContactListScrollbarScrollBar ) ); } 支持滚动条的代码修改就完成了。 调试 和以前一样,首先调试刚刚添加的代码。另外,将所有的滚动条值移动到第一个和最后一个记录上,次数不要太少(一些记录不会显示)或太多(系统会崩溃的)。 Contact List窗体看起来如图8-5。 下一步做什么 在下一章中,我们将通过在Contacts中添加其他的一些很出色的函数,如系统查找、分类、保密记录等,来结束本书的基础知识部分。 清单 这是经过这一章修改后的Contacts.c: // CH.2 The super-include for the Palm OS #include <Pilot.h> // CH.5 Added for the call to GrfSetState() #include <Graffiti.h> // CH.3 Our resource file #include "Contacts_res.h" // CH.4 Prototypes for our event handler functions s |
| [] [返回上一页] [打 印] |
|
文章评论 |
