【问题标题】:Delphi XE7: How to call a pop up menu of a ListBox on a Windows tablet?Delphi XE7:如何在 Windows 平板电脑上调用 ListBox 的弹出菜单?
【发布时间】:2015-11-22 18:03:02
【问题描述】:

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

【问题讨论】:

  • 你是怎么附上菜单的?

标签: delphi listbox stylus-pen


【解决方案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;

【讨论】:

    猜你喜欢
    • 2016-05-31
    • 1970-01-01
    • 2015-08-30
    • 1970-01-01
    • 1970-01-01
    • 2015-10-19
    • 2015-10-31
    • 1970-01-01
    • 2012-08-31
    相关资源
    最近更新 更多