信息化 频道

<连载>Protel二次开发从入门到精通

  7.4 如何使用一个事件处理?

此代码例子示范了如何在PCB编辑器中使用一个事件处理,此代码例子为您示范发一个事件处理服务器的简单实现。

请见SDK例子\SAMPLES\NO4\API\PCB\Event handler。

{....................................................................................}

Implementation

Type

TEventCapture = Class(TPCBEventHandler)//从TPCBEventHandler继承。

SourceObject : TPCBTrack;

Constructor Create(ABoardHandle, APrimitiveHandle : TObjectHandle);

DestructorDestroy; Override;

ProcedureHandle_X; Override;

End;

{................................................................................}

Var

EventCapture : TEventCapture;

{................................................................................}

Function CapturePCBEvents : Boolean;

Var

Handle : TObjectHandle;

BoardHandle: TObjectHandle;

Begin

SetAllPCBProcAddresses;

//SetAllPCBProcAddresses过程初始化并且设置所有PCB编辑器调用。即取得所有AdvPcb.dll中输出的函数和过程的地址指针。

If MessageRouter_GetState_WindowKind(PCBAPI_GetCurrentEditorWindow) <> 'PCB' Then Exit;

//PcbApi_GetCurrentEditorWindow函数返回文档对象窗体句柄。

//MessageRouter_GetState_WindowKind函数使用编辑器窗体句柄返回表示编辑器窗体类型的字符串值。例如,Advanced PCB 编辑器返回“PCB”字符串,并且TextEdit服务器返回“TEXT” 字符串。

BoardHandle := PcbApi_GetCurrentBoardHandle;

//PcbApi_GetCurrentBoardHandle函数返回当前在设计资源管理器中的PCB文档的句柄,如果印制板没有找到则返回值是空(nil)。

Handle := PcbApi_GetObjectAtCursor(BoardHandle,//印制板句柄。

[eTrackObject], //线对象类型。

AllLayers,//所有层。

'选择一个线对象(Choose a Track)'); //状态条提示。

//PcbApi_GetObjectAtCursor函数返回所点击的对象的句柄,当此函数调动激活时,一个光标出现在印制板上来提示用户点击任何PCB对象,所能点击的PCB对象依赖于参数提供,此函数调用将返回所选择的PCB对象句柄。此函数依赖于底层函数PcbApi_GetObjectAtXYAskUserIfAmbiguous支持来提取指定的PCB对象。

While Handle <> 0 Do

Begin

EventCapture := TEventCapture.Create(BoardHandle, Handle);//创建EventCapture对象。

EventCapture.Run;//运行。

EventCapture.Handle_X;//在循环过程中处理X键按下事件。

EventCapture.Free;//释放。

Handle := PcbApi_GetObjectAtCursor(BoardHandle,//印制板句柄。

[eTrackObject], //线对象类型。

AllLayers,//所有层。

'选择一个线对象(Choose a Track)');//状态条提示

//提示选择下一个对象。

End;

End;

{................................................................................}

//TEventCapture的构造过程。

Constructor TEventCapture.Create(ABoardHandle, APrimitiveHandle : TObjectHandle);

Begin

Inherited Create(ABoardHandle);//继承父类对象的构造函数。

SourceObject := TPCBTrack.Create(APrimitiveHandle);//创建线对象。

SourceObject.QueryDatabase(eGetState);//同步数据。

End;

{................................................................................}

DestructorTEventCapture.Destroy;

Begin

SourceObject.Free; //释放线对象

Inherited Destroy; //继承父类对象的释放过程

End;

{................................................................................}

Procedure TEventCapture.Handle_X; //对X键进行处理,X键扩展线对象的宽度。

Begin

Inherited Handle_X;

SourceObject.Width := MilsToCoord(100);//线对象宽度。

SourceObject.QueryDatabase(eSetState);//用外部服务器数据同步内部服务器数据。

PcbApi_QueryObjectGraphicallyInvalidate(SourceObject.ObjectHandle);

//PcbApi_QueryObjectGraphicallyInvalidate使用给定的对象句柄请求重绘一个PCB对象。

End;

{................................................................................}

Procedure Command_ExpandTracks(Window : TServerWindow; Parameters : PChar);

Begin

CapturePCBEvents;

End;

{................................................................................}

End.

为有效运行事件处理例子,您需要注意下列少许的步骤,当运行此例子时,设计资源管理器状态将提示一个“选择一个线对象(Choose a Track)” 字符串,您接下来点击一个线对象,此线对象句柄被通过事件处理获得,您接着按下“X”键来扩展此线对象的宽度,您可以按下“Escape”或点击鼠标右键来从当前模式中退出,但事件处理仍然在活动,状态栏提示您“选择一个线对象(Choose a Track)”的消息。

为退出事件处理系统,您需再次点击鼠标右键或按下“Escape”键。

0
相关文章