Delphi XE7: Как вызвать всплывающее меню ListBox на планшете Windows?

К нему прикреплены только ListBox и PopupMenu (Delphi XE7, VCL). Когда я щелкаю правой кнопкой мыши ListBox, вызывается меню, а когда я долго жму стилус (или палец) на планшете - нет. В чем может быть проблема? Спасибо!

1 ответ

Согласно этой документации MSDN:

Как включить жест нажатия и удержания планшета в приложении MFC

Чтобы включить концепцию щелчка правой кнопкой мыши, которая обычно означает "отображать контекстное меню" и имеет форму сообщений 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;
Другие вопросы по тегам