Может ли PictureBox оставить призрак на Form1 после его перемещения с помощью мыши?

Я перемещаю графические блоки на Form1, щелкая по ним левой кнопкой мыши и перетаскивая их в другое место. (то есть, используя mousemove, mousedown, mouseup с e.X и e.Y). Я также соединяю формы линий из одного графического блока с другим с помощью перетаскивания. Однако при перетаскивании конца формы линии я не показываю конец формы, когда он находится над графическим блоком, что указывает на то, что это нормально, чтобы оставить его на данном графическом блоке.

Вопрос в том, что после перемещения графических блоков в желаемое положение, бывают случаи, когда конец перетаскиваемой формы линии исчезает над «призраком» или остатком графического бокса, которого больше нет. По-видимому, позиции управления нужно обновлять каждый раз, когда я перемещаю окно с картинками. Итак, после того, как я перемещаю графические блоки, нужно ли какое-то обновление, которое мне нужно сделать в элементах управления Form1, чтобы положение графических блоков было обновлено?


person Community    schedule 29.12.2019    source источник
comment
Что такое соединяющая линия? Можете ли вы опубликовать код, который может воспроизвести это поведение? В любом случае попробуйте позвонить Me.Invalidate(true) (указав регион, если он слишком сильно мерцает) после сброса. Или обновите форму (больше мерцания). Я не совсем уверен, в чем ваша проблема / контекст, поэтому ...   -  person Jimi    schedule 29.12.2019
comment
Решил вопрос. Конец формы линии пропускал стандартные графические блоки, расположенные на Form1 во время разработки, которые были невидимы во время выполнения. Поэтому я в основном отфильтровал имена добавленных новых графических блоков, и это решило проблему. Линии - это линии, которые можно нарисовать на форме без пользовательских графических команд; они являются частью Microsoft VBPowerPacks ShapeControls.   -  person    schedule 29.12.2019


Ответы (1)


Да, вам нужно создать собственный класс, который наследует класс панели / окна изображения, и на уровне конструктора вам нужно сказать me.doublebuffered = true, чтобы предотвратить тень от перетаскивания окна изображения / панели

Также в вашем коде в событии движения мыши вам нужно вычесть текущие координаты панели из координат курсора, чтобы изображение было рядом с вашим курсором.

person Rosh    schedule 29.12.2019
comment
Я уже делаю вычитание, так как, да, X, Y элемента управления не поспевают за e.X и e.Y мыши, если нет. Не уверен насчет Me.DoubleBuffered = True, поскольку я никогда не использовал это, поэтому попробую. Я обычно использую двойную буферизацию для таблиц данных и таблиц данных. - person ; 29.12.2019