DispatchInputEvent

表单、交互、输入

描述

通过当前 TPDFlibFormSession 分派一个与 GUI 框架无关的指针、滚轮、键盘或文本输入事件

指针坐标使用与 HitTest 相同的旋转后可视 CropBox 坐标系,原点在可视左上角

分派器会跟踪进入和按下的部件,因此注释的 /E、/X、/D、/U 动作遵循 PDF 触发顺序规则

只有当主按钮在部件上按下并在同一连续进入区域内释放时,才发生指针抬起动作和默认激活

fiekPointerCancel 不分派 /U 即清除捕获;宿主失去指针捕获时应发送它

键盘处理包括 Tab 与 Shift+Tab 焦点遍历、字素安全的 Backspace 与 Delete、方向性选择移动、感知行的上下移动、Home 与 End、文本字段的 Enter 与 Escape、按钮激活,以及全选、撤销、重做的 Control/Meta 快捷键

fiekTextInput 接受完整的 WideString 输入,宿主因此可以转发组合后或增补的 Unicode 文本,而不必降为平台按键码

垂直滚轮增量是规范化后的逻辑步长,而不是操作系统常量;正值选择更靠前的 choice 项,负值选择更靠后的项

声明

function DispatchInputEvent(
  const InputEvent: TPDFlibFormInputEvent;
  out InputResult: TPDFlibFormInputResult): Integer;

参数

InputEvent事件种类及该种类所需的字段
InputResult处理结果,以及随之产生的焦点、悬停、按下、值和选定状态

事件字段

指针移动、按下、抬起和双击设置 Page、X 和 Y;按下和抬起还需设置 Button
指针离开和取消无需坐标
Wheel设置 Page、X、Y 和规范化的 WheelDeltaX 或 WheelDeltaY
按键按下和抬起设置 Key 以及所有处于活动状态的 Modifiers
文本输入把 Text 设为要插入或替换的组合文本

返回值

事件结构有效且被接受分发时返回 1,包括刻意保持未处理以让宿主执行自身回退的事件 事件无效、指针坐标无效、会话已分离或输入分发重入时返回

0 通过

InputResult.Handled 判断是否仍需宿主回退

示例

var
  InputEvent: TPDFlibFormInputEvent;
  InputResult: TPDFlibFormInputResult;
begin
  InputEvent.Kind := fiekPointerDown;
  InputEvent.Page := PageNumber;
  InputEvent.X := PageX;
  InputEvent.Y := PageY;
  InputEvent.Button := fibPrimary;
  InputEvent.Modifiers := [fimShift];
  Session.DispatchInputEvent(InputEvent, InputResult);

  InputEvent.Kind := fiekTextInput;
  InputEvent.Text := ComposedText;
  Session.DispatchInputEvent(InputEvent, InputResult);
end;

另请参阅

TPDFlibFormInputEvent, TPDFlibFormInputResult, TPDFlibFormSession, HitTest, FocusNext