Правая кнопка мыши на изображении отключает события первого щелчка мыши за пределами изображения

У меня есть приложение Delphi с элементом управления TImgView32 (часть Graphics32). Я передаю событие перемещения мыши и нажатия мыши, и это работает. Проблема в том, что всякий раз, когда я использую правую кнопку мыши внутри изображения, когда я отпускаю правую кнопку мыши (все еще в моем изображении — я не выходил за пределы изображения, прежде чем отпустить) — левая кнопка мыши не запускает кнопку, флажок, минимизацию или любые другие события элемента управления. Он выполняет дополнительное событие нажатия кнопки мыши в TImgView32 до тех пор, пока не щелкнет второй раз. Как я могу заставить щелчки мыши перейти к правильному элементу управления, когда мышь больше не находится на моем изображении без двойного щелчка? Я скомпилировал и с XE3, и с 2007, и результат был тот же.


person Robert Richter    schedule 22.11.2012    source источник
comment
Я получаю такое же поведение в Vista (32-разрядная версия) и Windows7 (64-разрядная версия).   -  person Robert Richter    schedule 22.11.2012
comment
вы сами отлавливаете события мыши через WM_RBUTTONxxx, возможно, отсутствует для установки результата сообщения?   -  person bummi    schedule 22.11.2012
comment
У меня есть событие для OnMouseDown, OnMouseMove, OnMouseWheel (которое неэффективно, но работает то, что на главной форме), OnResize, OnBitmapResize, OnPaintStage, OnScroll. Все эти события относятся к моему элементу управления TImgView32. Я не перехватываю обычный обработчик событий, а использую обработчик событий, настроенный в Delphi.   -  person Robert Richter    schedule 22.11.2012
comment
И что вы делаете на этих мероприятиях? Меня особенно интересует OnMouseDown.   -  person Rob Kennedy    schedule 22.11.2012
comment
Я отключил оба, добавив выход; в качестве первой строки процедуры. Хотя изображение мертво, когда я нажимаю, оно все еще действует так же. Если я нажимаю правую кнопку мыши внутри изображения, то левая кнопка мыши где-либо снаружи игнорируется в первый раз, а затем обрабатывается во второй раз.   -  person Robert Richter    schedule 22.11.2012
comment
Я проследил это до добавления слоя в коллекцию TImgView32. Даже без каких-либо событий слой, добавленный к этому элементу управления, вызывает такое поведение.   -  person Robert Richter    schedule 22.11.2012
comment
Кажется, это исправлено: imgOriginalBitmap.Layers.MouseEvents:=False;   -  person Robert Richter    schedule 22.11.2012
comment
Просматривая исходный код, это определенно ошибка Graphics32. Итак, я отправлю отчет об ошибке. Что происходит, так это то, что при щелчке левой кнопкой мыши унаследованный tControl.MouseCapture устанавливается в значение true и освобождается при отпускании мыши. При щелчке правой кнопкой мыши он устанавливается, но не освобождается. Это не ошибка Delphi, а ошибка стороннего компонента.   -  person Robert Richter    schedule 23.11.2012
comment
@Robert - Тогда вы, вероятно, можете ReleaseCapture вместо отключения MouseEvents.   -  person Sertac Akyuz    schedule 23.11.2012


Ответы (2)


В качестве быстрого и грязного исправления вы могли бы просто имитировать щелчок левой кнопкой мыши в конце обработки события правой кнопки мыши?

person Donovan Boddy    schedule 24.11.2012
comment
Поскольку я не обрабатываю события мыши на слоях, а только на изображении, самым простым решением было указать слоям не захватывать события мыши, и тогда эта ошибка не возникает. Насколько мне известно, проблема решена, и я отправил отчет об ошибке. - person Robert Richter; 26.11.2012

Это оказалось ошибкой в ​​стороннем компоненте, а не в Delphi или его библиотеке VCL. Отчет об ошибке отправлен. Если события мыши захватываются слоем, убедитесь, что изображение или средство просмотра изображений сбрасывает «MouseCapture», но если события нужны только изображению, а не слоям, установите для Layers.MouseEvents значение false в качестве обходного пути.

person Robert Richter    schedule 25.11.2012