К нему прикреплены только ListBox и PopupMenu (Delphi XE7, VCL). Когда я щелкаю правой кнопкой мыши на ListBox, вызывается меню, а когда я долго нажимаю стилусом (или пальцем) на планшете, нет. В чем может быть проблема? Спасибо!
Delphi XE7: Как вызвать всплывающее меню ListBox на планшете с Windows?
Ответы (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;