Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.81/16: Рейтинг темы: голосов - 16, средняя оценка - 4.81
1 / 1 / 0
Регистрация: 05.09.2012
Сообщений: 46
1

Рисование прямоугольника курсором мыши: как избавиться от красных линий

27.10.2012, 06:30. Показов 3088. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Во общем есть кус кода ,по клику на форме передаются координаты левого угла прямоугольника,размеры прямоугольника меняются при перемещении мыши,когда я передвигаю мышь вправо и вниз всё нормально и от рисовка работает правильно когда тяну в противоположном направлении появляются красные рамки ,Тут и вопрос как избавиться от них,как правильно перерисовать прямоугольник чтобы их не было?

прикрепил скрин на первом скрине я тянул вправо и вниз всё нормально работает ,на втором скрине в обратные направления(тут то и неправильно).

вот сам кус кода

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
private void Form1_MouseClick(object sender, MouseEventArgs e)
        {
            
            if (count != 2)
            {
                cord1 = e.Location.X;
                cord2 = e.Location.Y;
                count++;
                metka = true;
            }
            else
            {
                metka = false;
               
            }
        }
 
        private void Form1_MouseMove(object sender, MouseEventArgs e)
        {
 
            if (metka)
            {
                mousecord1 = e.Location.X;
                mousecord2 = e.Location.Y;
                int savecor1 = mousecord1;
                int savecor2 = mousecord2;
                if (cord1 > mousecord1)
                {
                    mousecord1 = cord1 - mousecord1;
                }
                else
                {
                    mousecord1 = mousecord1 - cord1;
                }
                if (cord2 > mousecord2)
                {
                    mousecord2 = cord2 - mousecord2;
                }
                else
                {
                    mousecord2 = mousecord2 - cord2;
                }
 
                Invalidate(new Rectangle(cord1, cord2, mousecord1, mousecord2));
                Invalidate(new Rectangle(savecor1, savecor2,mousecord1+900, mousecord2+900));
 
                
 
                Graphics g = Graphics.FromHwnd(Handle);
               
                g.DrawRectangle(new Pen(Color.Red, 4), new Rectangle(cord1, cord2, mousecord1, mousecord2));
                
            }
Миниатюры
Рисование прямоугольника курсором мыши: как избавиться от красных линий   Рисование прямоугольника курсором мыши: как избавиться от красных линий  
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.10.2012, 06:30
Ответы с готовыми решениями:

Рисование и перемещение линий по нажатию кнопок мыши
По нажатию пкм нарисовать линию, а по нажатию лкм перемещение этой линии

Рисование прямоугольника на PictureBox с помощью мыши
Добрый день. Можете подсказать элементарное рисование на PictureBox прямоугольника мышью. Заранее...

Рисование прямоугольника с помощью мыши - прерывание
Вот цель работы: Рисование прямоугольника с помощью мыши. Координаты левой верхней вершины...

Рисование непересекающихся линий, которые задаются кликом мыши
Доброго времени суток всем! Очень нужна помощь новичку в C#. Задача: Рисование линий по...

6
430 / 431 / 93
Регистрация: 16.07.2012
Сообщений: 886
27.10.2012, 10:40 2
Лучший ответ Сообщение было отмечено как решение

Решение

Что-то слишком запутанно у вас все. Попробуйте так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
public partial class Form1 : Form
{
    private readonly Pen Pen = new Pen(Color.Red, 4);
 
    private Point from, to;        
    private bool isSelecting;
 
    public Form1()
    {
        InitializeComponent();
        DoubleBuffered = true;
    }
 
    protected override void OnMouseDown(MouseEventArgs e)
    {
        base.OnMouseDown(e);
 
        from = to = e.Location;
        isSelecting = true;
        Invalidate();
    }
 
    protected override void OnMouseMove(MouseEventArgs e)
    {
        base.OnMouseMove(e);
 
        if (isSelecting)
        {
            to = e.Location;
            Invalidate();
        }
    }
 
    protected override void OnMouseUp(MouseEventArgs e)
    {
        base.OnMouseUp(e);
 
        isSelecting = false;
        Invalidate();
    }
 
    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);
 
        if (isSelecting)
        {
            var x = Math.Min(from.X, to.X);
            var y = Math.Min(from.Y, to.Y);
            var width = Math.Abs(from.X - to.X);
            var height = Math.Abs(from.Y - to.Y);
            e.Graphics.DrawRectangle(Pen, x, y, width, height);
        }
    }
}
3
1 / 1 / 0
Регистрация: 05.09.2012
Сообщений: 46
27.10.2012, 21:44  [ТС] 3
очень помогло,вот переделал пример и прокоментил,возникла проблема после того как я загрузил картинку и стал рисовать прямоугольник,он исчезает вследствие перерисовки,как сделать так чтобы этого не происходило,чтобы прямоугольник нормально чертился поверх неё?

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
 
namespace kyrcovaia
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        private int width, height;
        public Image db;
        private int cord1, cord2;//координаты левого верхнего угла прямоугольника
        private bool metka = false;
        private int count = 1;//кол-во кликов
        private int mousecord1, mousecord2;//хранят расстояние от левого угла прямоуг до правого нижнего угла прямоуг(по х и по у)
 
        private void button1_Click(object sender, EventArgs e)
        {
            OpenFileDialog opendialog = new OpenFileDialog();//загрузка картинки
            opendialog.Title = "Загрузка";
            opendialog.InitialDirectory = @"C:\";
            opendialog.Filter = "*.*|*.*";
            if (opendialog.ShowDialog() == DialogResult.OK)
            {
                try
                {
                    Graphics g = Graphics.FromHwnd(Handle);
                    db = Image.FromFile(opendialog.FileName);
                     width = db.Width;
                     height = db.Height;
                    while(width > this.Width || height > this.Height)//масштабируем картинку если она слишком большая(чтоб умещалась в окне)
                    {
                        width--;
                        height--;
                    }
 
                    g.DrawImage(db, new Rectangle(ClientSize.Width / 2 - width/2, ClientSize.Height / 2 - height/2,width,height));//отрисовка картинки в центре экрана
                }
                catch
                { }
            }
        }
 
        private void Form1_MouseClick(object sender, MouseEventArgs e)
        {
            
            if (count != 2)//считаем клики если их 2 то мы нарисовали прямоугольниик
            {
                cord1 = e.Location.X;
                cord2 = e.Location.Y;
                count++;
                metka = true;
               // Invalidate();
            }
            else
            {
                metka = false;
               
            }
        }
 
        private void Form1_MouseMove(object sender, MouseEventArgs e)
        {
 
            if (metka)
            {
                mousecord1 = e.Location.X;//пока двигаем мышь ,то увеличиваем/уменьшаем размеры прямоугольника
                mousecord2 = e.Location.Y;
                Invalidate();//перерисовка
                
            }
        }
 
        private void Form1_Paint(object sender, PaintEventArgs e)
        {
            if (metka)
            {
                mousecord1 = mousecord1 - cord1;//вычисляем расстояния от левого угла прямоуг  по х и у
                mousecord2 = mousecord2 - cord2;
                e.Graphics.DrawRectangle(new Pen(Color.Red, 4), new Rectangle(cord1, cord2, mousecord1, mousecord2));
            }
        }
 
       /* public void CutImadge()
        {
            Graphics g = Graphics.FromHwnd(Handle);
            GraphicsUnit guint = GraphicsUnit.Pixel;
            g.DrawImage(db, new Rectangle(ClientSize.Width / 2 - width / 2, ClientSize.Height / 2 - height / 2, width, height), new Rectangle(cord1, cord2, mousecord1, mousecord2), guint);
        }*/
    }
}
0
Футболист
532 / 434 / 142
Регистрация: 31.10.2011
Сообщений: 1,010
27.10.2012, 22:14 4
используй
C#
1
this.Refresh();//или что то в етом роде
0
1 / 1 / 0
Регистрация: 05.09.2012
Сообщений: 46
27.10.2012, 22:37  [ТС] 5
Не помогло эффект такой же как и от
C#
1
invalidate()
.
0
Футболист
532 / 434 / 142
Регистрация: 31.10.2011
Сообщений: 1,010
27.10.2012, 22:41 6
покажи код куда ты рефреш скинул.
0
1 / 1 / 0
Регистрация: 05.09.2012
Сообщений: 46
28.10.2012, 05:34  [ТС] 7
C#
1
2
3
4
5
6
7
8
9
10
11
 private void Form1_MouseMove(object sender, MouseEventArgs e)
        {
 
            if (metka)
            {
                mousecord1 = e.Location.X;//пока двигаем мышь ,то увеличиваем/уменьшаем размеры прямоугольника
                mousecord2 = e.Location.Y;
                this.Refresh();               //Invalidate();//перерисовка
                
            }
        }
Добавлено через 4 часа 47 минут
актуально

Добавлено через 1 час 43 минуты
решил вопрос за счёт вторичной прорисовки изображения в событии paint(вариант не самый лучший),у кого - нибудь есть другие варианты как это можно сделать?
0
28.10.2012, 05:34
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.10.2012, 05:34
Помогаю со студенческими работами здесь

Рисование линий по клику мыши (неправильно определяются координаты курсора)
Рисую линию в обработчике события клик,сначала рисую одну точку из которой должна начинаться...

Рисование линий из центра экрана нажатием левой кнопкой мыши
Здравствуйте! Начала разбирать программу, рисующую линии нажатием левой кнопкой мыши из центра...

Рисование прямоугольника в графическом окне по двум кликам мыши
Задача такова: при нажатии правой клавиши миши первый раз должны записатся её координаты на экране,...

Рисование линий от точки до точки при помощи мыши
Нашла задачу, рисует линии, как я поняла от точки до точки. С помощью tasm и tlink делаю exe файл,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru