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;