При рисовании прямоугольника в элементе управления PictureBox, если курсор мыши перемещается слишком быстро, иногда он тC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Гость
 При рисовании прямоугольника в элементе управления PictureBox, если курсор мыши перемещается слишком быстро, иногда он т

Сообщение Гость »


Проблема в том, что я пытаюсь очень быстро нарисовать прямоугольник при перемещении мыши в области PictureBox. Затем, когда мышь покидает область PictureBox, вместо этого она будет рисовать прямоугольник до тех пор, пока край PictureBox в том направлении, в котором я переместил курсор мыши, не остановится где-то посередине. он рисует прямоугольник, но не того размера, который должен быть, потому что я двигаю мышь очень быстро.

Есть ли способ обойти это?

событие нажатия кнопки мыши:

private void imageBoxImageToCrop_MouseDown(отправитель объекта, MouseEventArgs e) { if (e.Button != MouseButtons.Left || обрезка == false) return; х = 0; у = 0; if (pictureBoxImageToCrop.Image != null && selectedPath != null) { если (!isRealTimeCropping) { if ((x >= 0 && x = 0 && y = 0 && X = 0 && Y 0) { if ((x >= 0 && x = 0 && y 0 && imageBoxImageToCrop.Image != null && selectedPath != "") { if ((x >= 0 && x = 0 && y 0 && dr.Rect.Height > 0) { rectImage = CropAtRect((Bitmap)pictureBoxImageToCrop.Image, dr.Rect); если (сохранить прямоугольники) { считать++; прямоугольникИмя = GetNextName(Путь.Объединить(выбранныйПуть, "Прямоугольник"), ".bmp"); FileList.Add($"{dr.Location}, {dr.Size}", прямоугольникИмя); строка json = JsonConvert.SerializeObject( список файлов, Форматирование. С отступом ); используя (StreamWriter sw = новый StreamWriter(Path.Combine(selectedPath, "rectangles.txt"), false)) { sw.WriteLine("Общее количество прямоугольников: " + count + Environment.NewLine); sw.Write(JSON); SW.Закрыть(); } rectImage.Save(имяпрямоугольника); saveRectanglesCounter++; } еще { поток вар = ToMemoryStream (rectImage); вар изображение = System.Drawing.Image.FromStream(поток); PictureBoxCroppedImages.Image = изображение; } // Здесь я добавил дополнительную проверку, чтобы убедиться, что изображение установлено в PictureBoxCroppedImages if (saveRectangles && imageBoxCroppedImages.Image == null) { //pictureBoxCroppedImages.Image = rectImage; } пикселейCounter = rect.Width * rect.Height; PictureBoxCroppedImages.Invalidate(); var newKey = $"{dr.Location}, {dr.Size}"; вар newItem = новый MyListBoxItem { Сообщение = newKey + "," + FileList[newKey], Цвет элемента = Цвет.Зеленый }; МоиЭлементы.Добавить(новыйЭлемент); listBoxCroppedImages.SelectedIndex = MyItems.Count - 1; label2.Text = listBoxCroppedImages.Items.Count.ToString(); PictureBoxImageToCrop.Focus(); // Проверяем, является ли изображение нулевым, прежде чем использовать его если (pictureBoxCroppedImages.Image != ноль) { Графика g = Graphics.FromImage(this.pictureBoxCroppedImages.Image); g.Clear(this.pictureBoxCroppedImages.BackColor); } } } еще { если (clearRectangles) { РисованиеРекты.Очистить(); PictureBoxImageToCrop.Invalidate(); } х = 0; у = 0; } } если (isRealTimeCropping) { this.Курсор = Курсоры.По умолчанию; } } Событие рисования:

private void imageBoxImageToCrop_Paint(отправитель объекта, PaintEventArgs e) { если (drawBorder) { ControlPaint.DrawBorder(e.Graphics, imageBoxImageToCrop.ClientRectangle, Color.Red, ButtonBorderStyle.Solid); } if (pictureBoxImageToCrop.Image != null && selectedPath != null && DrawingRects.Count > 0) { DrawShapes(e.Graphics); } если (isRealTimeCropping) { // Рисуем прямоугольник обрезки в позиции курсора ПрямоугольникcropRect = новый прямоугольник(realTimeCursorPos.X, realTimeCursorPos.Y,cropRectWidth,cropRectHeight); используя (Pen pen = new Pen(Color.Red, 1)) { e.Graphics.DrawRectangle(pen,cropRect); } } } Я пытался заблокировать курсор мыши, удерживая его внутри области PictureBox, используя событие ввода мыши. Это всего лишь пример, демонстрирующий идею. Я сделал это с границами PictureBox и вводом события, но это не сработало. это неправильное решение.
private void Form1_MouseEnter (отправитель объекта, EventArgs e) { Курсор.Клип = this.Bounds; }
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»