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

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


person user3671276    schedule 22.11.2015    source источник
comment
Как вы прикрепили меню?   -  person David Heffernan    schedule 22.11.2015


Ответы (1)


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

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

Чтобы включить концепцию щелчка правой кнопкой мыши, которая обычно означает "отображение контекстного меню" и представлена ​​в форме сообщений WM_RBUTTONDOWN, WM_RBUTTONUP и WM_CONTEXTMENU, а также событий ISG_HOLDENTER и ISG_RIGHTTAP , для этого окна должен быть включен жест "нажать и удерживать". Чтобы обнаружить этот жест, по необходимости вводится некоторая задержка, чтобы различать простое «нажатие» (рассматриваемое как щелчок левой кнопкой мыши) и «нажатие и удержание» (щелчок правой кнопкой мыши). Таким образом, вызов событий левого щелчка займет больше времени, и приложение будет менее отзывчивым. Таким образом, по этой причине поведение по умолчанию — отключить жест «нажать и удерживать».

Без этого жеста длительное нажатие не будет генерировать сообщение WM_CONTEXTMENU, которое VCL использует для отображения всплывающих меню.

Если ваше приложение хочет включить жест «нажмите и удерживайте», вы должны [обработать WM_TABLET_QUERYSYSTEMGESTURESTATUS] в вашем [окне] и вернуть что-то, что не включает флаг TABLET_DISABLE_PRESSANDHOLD.

Попробуйте создать подкласс свойства WindowProc ListBox, чтобы перехватить это сообщение:

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;
person Remy Lebeau    schedule 22.11.2015