<连载>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”键。