При рисовании прямоугольника в элементе управления PictureBox, если курсор мыши перемещается слишком быстро, иногда он т ⇐ 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; }
Проблема в том, что я пытаюсь очень быстро нарисовать прямоугольник при перемещении мыши в области 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; }
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Отображение увеличенной части PictureBox в другом PictureBox при наведении курсора С#
Anonymous » » в форуме C# - 0 Ответы
- 16 Просмотры
-
Последнее сообщение Anonymous
-