<连载>Protel二次开发从入门到精通
7. 交互作用的事件处理系统
7.1 在PCB编辑器中的交互事件处理角色
在某些确定的过程执行期间(如放置线、测量距离等等),PCB进入一个交互模式,所有的鼠标和键盘被管理,并且通过PCB编辑器解释,一个十字光标通常出现在鼠标光标位置,用户能够交互地(和图形化的)编辑一个PCB对象,在PCB编辑器内部,一个事件处理对象是形成交互方式的原因,并且被通过PCB API如一个“TPCBEventHandler”类来暴露,使用此对象,第三方程序设计者能容易地在任何PCB文档上“撤消一个光标(drop a cursor)”并且执行任何他想要的交互的行为。
7.2 交互事件处理系统
TPCBEventHandler对象暴露内部PCB对象,是形成交互模式的原因,此对象捕捉所有的用户输入(鼠标移动、键盘按下等等),并且处理它们来驱动交互进程(一个鼠标的移动事件通常更新正在被编辑的PCB对象的位置,如果这样,位置为一个十字光标的位置等等),此对象的基本行为如下面所描述。
下图显示了TPCBEventHandler对象的基本行为。
当TPCBEventHandler被创建好并运行时,在循环中重复相同的动作,它首先得到用户考虑好的输入(框1),任何涉到的对象通过此输入被给了一个来从屏幕中删除的机会(框2),用户输入是进程 (框3),并且通过用户输入涉到的对象能被在屏幕上绘制出(框4),如果有目的的停止活动或交互处理被取消(框5),TPCBEventhandler停止此循环。

图4-17 TPCBEventHandler对象的基本的行为
7.3 写一个自定义的事件处理
通过从TPCBEventhandler类继承并且重载它的方法, 一个第三方的开发者能自定义基本的行为。下面描述TPCBEventhandler要被重载的方法。
|
字段 |
描述 |
|
ObjectHandle |
表示一个印制板对象的句柄。 |
|
方法 |
描述 |
|
Create |
创建一个事件处理对象。 |
|
Destroy |
销毁一个事件处理对象。 |
|
PerformanceIsPoor |
在PCB编辑器中检测事件处理系统的性能。 |
|
Handle_F1 |
当F1键被按下时取消。 |
|
Handle_Plus |
当Plus键被按下时取消。 |
|
Handle_X |
当X键被按下时取消。 |
|
Handle_Y |
当Y键被按下时取消。 |
|
Handle_L |
当L键被按下时取消。 |
|
Handle_Minus |
当- 键被按下时取消。 |
|
Handle_Multiply |
当+ 键被按下时取消。 |
|
Handle_BackSpace |
当BackSpace键被按下时取消。 |
|
Handle_Tab |
当Tab键被按下时取消。 |
|
Handle_KeyPressed |
当按键事件发生时调用。 |
|
Handle_Space |
当空格键被按下时调用。 |
|
Handle_Escape |
当Escape键被按下时调用。 |
|
Handle_Return |
当Return键被按下时调用。 |
|
Handle_Insert |
当Insert键被按下时调用。 |
|
Handle_Delete |
当Delete键被按下时调用。 |
|
Handle_ReleasedLB |
当鼠标左键被释放时调用。 |
|
Handle_ReleasedRB |
当鼠标右键被释放时调用。 |
|
Handle_MouseMove |
当鼠标移动被探测到时调用。 |
|
Handle_PaintMsg |
当绘制消息被探测到时调用。 |
|
Handle_RightArrow |
当右箭头键被按下时调用。 |
|
Handle_LeftArrow |
当左箭头键被按下时调用。 |
|
Handle_UpArrow |
当Up键被按下时调用。 |
|
Handle_DownArrow |
当Down键被按下时调用。 |
|
Handle_PageUp |
当Page Up键被按下时调用。 |
|
Handle_PageDown |
当Page Down键被按下时调用。 |
|
Handle_Home |
当Home键被按下时调用。 |
|
Handle_End |
当End键被按下时调用。 |
|
Handle_MouseMovedOutsideClient |
当鼠标移到到客户端PCB文档窗体外部时调用。 |
|
DrawInverted |
当对象被Drawn On或OFF时调用。 |
|
UpdateObject |
当任何Handle_XXX 函数后调用。 |
|
OnSuccess |
在事件处理已成功完成它的任务后调用。 |
|
OnCancel |
当事件处理被取消后调用。 |
|
OnShow |
当事件处理显示图示的内容后调用。 |
|
OnHide |
当事件处理隐藏图示的内容后调用。 |
|
OnTerminate |
当事件处理过程结束时调用。 |
|
UpdateBoundingRectangle |
当在印制板上的边界矩形被更新时调用,常用于当边界矩形没有被更新但尺寸已被更新的情形。 |
|
DrawInvertedBoundingRectangle |
当边界矩形被绘制成反向的颜色时调用。 |
|
Abort |
调用来测试,是否停止循环(异常终止状态)。 |
|
GoalAchieved |
调用来测试,是否停止循环(成功状态)。 |
|
Run |
句柄被设置和处理时是否调用。 |
|
ShiftIsPressed |
Shift键被按下时是否调用。 |
|
ControlIsPressed |
Control键被按下时是否调用。 |
让我们设想,一个事件处理在一个印制板的点(例如(100,100))和当前鼠标位置之间绘制一个线(Track),此事件处理对象从TPCBEventHandler类继承,并且包含一个附加的TPCBTrack类型的字段(线对象被绘制在(100,100)到鼠标光标之间)。
Handle_MouseMove方法将需要被重载来更新TPCBTrack对象的坐标,Handle_Minus, Handle_Plus, Handle_Multiply能被重载来在绘制时更新线对象的层。UpdateObject方法能被重载来更新PCB数据库(调用PCBTrack.QueryDatabase(eSetState)),UpdateObject方法有最后的分配到TPCBTrack对象字段的值,DrawInverted方法需要被重载,来隐藏并且显示线对象(通过调用PCBApi_DrawInverted)。