Delphi XE7:如何在Windows平板电脑上调用ListBox的弹出菜单?

时间:2015-11-22 18:03:02

标签: delphi listbox stylus-pen

只附加了一个ListBox和PopupMenu(Delphi XE7,VCL)。当我右键单击ListBox时,会调用菜单,而当我长按平板电脑上的手写笔(或手指)时则不会。可能是什么问题呢?谢谢!

1 个答案:

答案 0 :(得分:1)

根据此MSDN文档:

How to Enable Tablet Press-and-Hold Gesture in MFC Application

  

要启用通常意味着“显示上下文菜单”的右键单击概念,并以WM_RBUTTONDOWN,WM_RBUTTONUP和WM_CONTEXTMENU消息以及ISG_HOLDENTER和ISG_RIGHTTAP事件的形式出现,必须启用“按住”手势那个窗口。为了检测该手势,必要时引入一些延迟以区分简单的“按压”(被视为左击)和“按住”(右击)。因此,引发左键单击事件需要更长的时间,并且应用程序的响应速度会降低。因此,出于这个原因,默认行为是禁用“按住”手势。

如果没有这种手势,长按不会生成WM_CONTEXTMENU消息,VCL会使用该消息显示弹出菜单。

  

如果您的应用程序想要启用按下并保持手势,您必须[处理[窗口]中的WM_TABLET_QUERYSYSTEMGESTURESTATUS消息]并返回不包含TABLET_DISABLE_PRESSANDHOLD标记的内容。

尝试继承ListBox的WindowProc属性以捕获该消息:

private
  PrevListBoxWndProc: TWndMethod;
  procedure ListBoxWndProc(var Message: TMessage);

...

procedure TMyForm.FormCreate(Sender: TObject);
begin
  PrevListBoxWndProc := ListBox1.WindowProc;
  ListBox1.WindowProc := ListBoxWndProc;
end;

procedure TMyForm.ListBoxWndProc(var Message: TMessage);
const
  WM_TABLET_QUERYSYSTEMGESTURESTATUS = 0x02CC;
begin
  if Message.Msg = WM_TABLET_QUERYSYSTEMGESTURESTATUS then
    Message.Result := 0
  else
    PrevListBoxWndProc(Message);
end;