只有一个 ListBox 和 PopupMenu,附在它上面(Delphi XE7,VCL)。当我右键单击 ListBox 时,会调用菜单,而当我在平板电脑上长按触控笔(或手指)时不会。可能是什么问题呢?谢谢!
问问题
743 次
1 回答
1
根据此 MSDN 文档:
要启用通常意味着“显示上下文菜单”的右键单击概念,并以 WM_RBUTTONDOWN、WM_RBUTTONUP 和 WM_CONTEXTMENU 消息以及 ISG_HOLDENTER 和 ISG_RIGHTTAP 事件的形式出现,必须为该窗口启用“按住”手势。为了检测这个手势,必须引入一些延迟来区分简单的“按下”(视为左键单击)和“按住”(右键单击)。因此,引发左键单击事件将需要更长的时间,并且应用程序的响应性似乎会降低。因此,出于这个原因,默认行为是禁用“按住”手势。
如果没有该手势,长按将不会生成一条WM_CONTEXTMENU
消息,VCL 使用该消息来显示弹出菜单。
如果您的应用程序想要启用按住手势,您必须
WM_TABLET_QUERYSYSTEMGESTURESTATUS
在 [window] 中 [handle the message] 并返回不包含 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;
于 2015-11-22T18:27:12.393 回答