Аватар для irineyxxx
151 / 53 / 11
Регистрация: 18.09.2011
Сообщений: 730

События на MouseEnter и MouseLeave используя Graphics

22.03.2012, 06:44. Показов 5350. Ответов 38
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите пожалуйста, вот нарисовал методом:

C#
1
2
3
4
5
6
        private Graphics graphicsRectangleTwo(){
            Graphics graphicsRectangle = this.CreateGraphics();
            Rectangle rectangle = new Rectangle(455, 10, 40, 40);
            graphicsRectangle.FillRectangle(Brushes.Silver, rectangle);
            return graphicsRectangle;
        }
Мне нужно сделать так, чтобы когда мышь входила в область этого квадрата, квадрат перерисовывался с такими размерами:

C#
1
Rectangle rectangle = new Rectangle(455, 10, 45, 45);
ну можно и цвет еще поменять

А вот когда мышь покидала область этого квадратика, квадрат снова перерисовывался и возращался к исходным размерам:

C#
1
   Rectangle rectangle = new Rectangle(455, 10, 40, 40);
P.S.: Спасибо за помощь!

Добавлено через 1 минуту
Заметка: GDI + тут)
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
22.03.2012, 06:44
Ответы с готовыми решениями:

События MouseEnter и MouseLeave
У меня на форме не большой Splitter, ширика 3-4 пикселя, на его события MouseEnter и MouseLeave повешены обработчики, но если очень быстро...

События MouseEnter/MouseLeave при drag-n-drop
описываю ситуацию: есть два контрола: <Label Canvas.Top="40" Canvas.Left="30" Padding="10" ...

Обработчики mouseenter() и mouseleave()
Всем здравствуйте! Подскажите как изолировать обработчики друг от друга. В принципе все работает, но если быстро двигать мышью по углу...

38
35 / 35 / 1
Регистрация: 14.01.2011
Сообщений: 111
22.03.2012, 13:44
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от irineyxxx Посмотреть сообщение
rect = new Rectangle[] { new Rectangle(10, 10, 40, 40), new Rectangle(455, 10, 40, 40), new Rectangle(10, 435, 40, 40) }; - это всё можно ведь объявить и в глобальной переменной...
можно все
0
 Аватар для irineyxxx
151 / 53 / 11
Регистрация: 18.09.2011
Сообщений: 730
22.03.2012, 13:48  [ТС]
Egr66001, Ты градиентом красил ? ( Как убрать ?

Добавлено через 25 секунд
C#
1
using (Brush b = new SolidBrush(BackColor))
- вот вроде
0
35 / 35 / 1
Регистрация: 14.01.2011
Сообщений: 111
22.03.2012, 13:50
Цитата Сообщение от irineyxxx Посмотреть сообщение
Egr66001, Ты градиентом красил ? ( Как убрать ?

Добавлено через 25 секунд
C#
1
using (Brush b = new SolidBrush(BackColor))
- вот вроде
что красил?

Добавлено через 1 минуту
почитай про GDI+, много лишних вопросов исчезнет. SolidBrush это сплошная кисть.
0
 Аватар для irineyxxx
151 / 53 / 11
Регистрация: 18.09.2011
Сообщений: 730
22.03.2012, 13:51  [ТС]
Egr66001, У меня при прорисовке сбивается Transparent у всех label ((

Добавлено через 11 секунд
вот минусы твоего кода пишу )

Добавлено через 32 секунды
Egr66001, сейчас скриншот кину
0
35 / 35 / 1
Регистрация: 14.01.2011
Сообщений: 111
22.03.2012, 13:52
вот очень хорошая статья:
http://www.rsdn.ru/article/gdi/gdiplus2mag.xml
0
 Аватар для irineyxxx
151 / 53 / 11
Регистрация: 18.09.2011
Сообщений: 730
22.03.2012, 13:54  [ТС]
Вот пожалуйста, смотри )
Миниатюры
События на MouseEnter и MouseLeave используя Graphics  
0
35 / 35 / 1
Регистрация: 14.01.2011
Сообщений: 111
22.03.2012, 13:55
Цитата Сообщение от irineyxxx Посмотреть сообщение
Egr66001, У меня при прорисовке сбивается Transparent у всех label ((
это потому что bufferedGraphics определен по всей форме:
using (BufferedGraphics bg = BufferedGraphicsManager.Current.Allocate (CreateGraphics(), DisplayRectangle))
0
 Аватар для irineyxxx
151 / 53 / 11
Регистрация: 18.09.2011
Сообщений: 730
22.03.2012, 13:55  [ТС]
Справа - это диффекты твоего кода )))
0
35 / 35 / 1
Регистрация: 14.01.2011
Сообщений: 111
22.03.2012, 14:00
если у тебя еще на форме контроллы находятся, то по всей форме рисовать нельзя, это не ошибка ты мне просто не сказал что у тебя на форме контроллы еше лежат, в твоем случае нужно рисовать это совсем по другому:
в событии движения мыши определять над каким прямоугольником она находится и рисовать только этот прямоугольник
0
 Аватар для irineyxxx
151 / 53 / 11
Регистрация: 18.09.2011
Сообщений: 730
22.03.2012, 14:23  [ТС]
Egr66001, Пожалуйста примерчик кода , если не трудно )))

Добавлено через 2 минуты
Egr66001, Это я игру пишу
0
 Аватар для irineyxxx
151 / 53 / 11
Регистрация: 18.09.2011
Сообщений: 730
22.03.2012, 14:29  [ТС]
Вот посмотри, как тебе начальное представление...
Вложения
Тип файла: rar Wo.rar (369.3 Кб, 10 просмотров)
0
 Аватар для irineyxxx
151 / 53 / 11
Регистрация: 18.09.2011
Сообщений: 730
22.03.2012, 14:32  [ТС]
скриншот
Миниатюры
События на MouseEnter и MouseLeave используя Graphics  
0
35 / 35 / 1
Регистрация: 14.01.2011
Сообщений: 111
22.03.2012, 16:11
если ты делаешь игру, зачем тогда использовать WinForm?
ведь есть WPF или XNA.

можешь поподробнее описать что будет в этой игре

Добавлено через 1 минуту
кидай исходники. зачем мне эта презентация?
0
 Аватар для irineyxxx
151 / 53 / 11
Регистрация: 18.09.2011
Сообщений: 730
22.03.2012, 18:16  [ТС]
Egr66001, Для XNA - нужна команда . Будет команда - будет и XNA.
В WF - просто, можно не плохо тестировать 2D игры. И WF более знаком
0
1057 / 864 / 195
Регистрация: 31.03.2010
Сообщений: 2,521
22.03.2012, 18:54
в свете данной задачи я бы поступил так:
1. Создал свой класс MyRectangle, который реализует
а) свойство активен-неактивен
б) метод собственную отрисовку в полученном объекте graphics
в) метод-проверка лежит ли точка внутри прямоугольника. (public void Inner(float x, float y)
и соотвественно изменяет статус активности
г) при изменении статуса активности выполняем перерисовку
2. Создал List<MyRectangle>
3. По событии MouseOver делал бы метод Inner для всех объектов моего списка.
0
 Аватар для irineyxxx
151 / 53 / 11
Регистрация: 18.09.2011
Сообщений: 730
22.03.2012, 19:01  [ТС]
Learx, Ну всё хорошо, кроме одного, вот тут ошибочно вы написали про то, что:
3. По событии MouseOver делал бы метод Inner для всех объектов моего списка.
Зачем перерисовывать все все объекты, а если их много очень, система будет тормозить ужасно.

Насчет класса вы правы, поддерживаю! Есть примеры реализации ?
0
1057 / 864 / 195
Регистрация: 31.03.2010
Сообщений: 2,521
22.03.2012, 19:32
1) перерисовка требуется только если был статус "неактивен" и стал "активен", или наоборот(Inner и делает эту проверку)
2) вот самостоятельно и реализуй.
0
 Аватар для irineyxxx
151 / 53 / 11
Регистрация: 18.09.2011
Сообщений: 730
22.03.2012, 19:55  [ТС]
Learx, ок, попробую
0
35 / 35 / 1
Регистрация: 14.01.2011
Сообщений: 111
23.03.2012, 07:06
Вот посмотри то что тебе нужно
класс коллекции:
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
    public class RectangleCollection
    {
        private List<Rectangle> _items;
        private Rectangle _activeRect;
        private IntPtr _hwnd;
        public List<Rectangle> Items
        {
            get { return _items; }
            set { _items = value; }
        }
        public RectangleCollection(IntPtr handle)
            : this(new List<Rectangle>(), handle)
        { }
        public RectangleCollection(List<Rectangle> rects, IntPtr handle)
        {
            _hwnd = handle;
            _items = rects;
            _activeRect = new Rectangle();
        }
        //рисует активный элемент неактивным
        public void RemoveActiveRect()
        {
            DrawRect(false, _activeRect);
            _activeRect = new Rectangle();
        }
        //рисует активный элемент
        public void DrawActiveRect(Rectangle r)
        {
            if (_activeRect != r)
            {
                DrawRect(false, _activeRect);
                DrawRect(true, r);
                _activeRect = r;
            }
        }
        //рисует все элементы неактивными
        public void DrawAll()
        {
            foreach (Rectangle r in _items)
            {
                DrawRect(false, r);
            }
        }
        private void DrawRect(bool isUnder, Rectangle rect)
        {
            using (Graphics g = Graphics.FromHwnd(_hwnd))
            using (BufferedGraphics bg = BufferedGraphicsManager.Current.Allocate(g, rect))
            {
                bg.Graphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit;//красивый текст
                bg.Graphics.FillRectangle(isUnder ? Brushes.Silver : Brushes.DimGray, rect);
                bg.Graphics.DrawString("P2", new Font("Arial Narrow", 25, FontStyle.Bold), isUnder ? Brushes.DimGray : Brushes.DeepSkyBlue, rect.Location);
                bg.Render();
            }
        }
форма:
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
    public partial class Form1 : Form
    {
        RectangleCollection rects;
        public Form1()
        {
            InitializeComponent();
            rects = new RectangleCollection(new List<Rectangle>(new Rectangle[] 
                                                                {
                                                                    new Rectangle(10, 10, 40, 40),
                                                                    new Rectangle(455, 10, 40, 40), 
                                                                    new Rectangle(10, 435, 40, 40) 
                                                                }), Handle);
        }
        
        private void Form1_MouseMove(object sender, MouseEventArgs e)
        {
            bool isDrawed = false;
            foreach (Rectangle r in rects.Items)
            {
                if (r.Contains(e.Location))
                {
                    rects.DrawActiveRect(r);
                    isDrawed = true;
                }
            }
            if (!isDrawed)
                rects.RemoveActiveRect();
        }
        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);
            rects.DrawAll();
        }
 
    }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
23.03.2012, 07:06

MouseLeave и MouseEnter(Gradient)
Привет форумчане, пытаюсь изучить wpf и при изучение материала с этими событиями создал себе практическую задачу, на эту тематику и уже...

Избавится от артефактов MouseEnter/MouseLeave
Есть такой кусочек кода... var png: TPngImage; .... procedure TForm1.Image4MouseEnter(Sender: TObject); begin Png :=...

SetTimeout для mouseenter/mouseleave
Как правильно повесить setTimeout на события mouseenter/mouseleave? Но с одним нюансом, если предположим, что setTimeout для обоих событий...

Многоразовое событие mouseenter / mouseleave
Проблема в том, что если человек быстро и много раз будет водить курсором по элементу, то после этого, элемент будет и дальше выполнять...

Альтернатива mouseenter/mouseleave для touch
Здравствуйте уважаемые форумчане. Посоветуйте как можно сделать функционал для устройств с тач... Смысл такой: Есть список комментариев и...


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

Или воспользуйтесь поиском по форуму:
39
Ответ Создать тему
Опции темы

Новые блоги и статьи
Жара жесть.
kumehtar 18.08.2026
Пролетают летом дни Тридцать пять жары в тени. Каждый август год от года Дарит жаркую погоду.
Когда логика программы не спасает от человеческих ошибок
Maks 18.08.2026
В последнее время всё чаще и чаще сталкиваюсь с таким явлением, как абсолютная невнимательность (или глупость) пользователей. Проявляется это чаще всего на работе в коллективе. Допустим, человек с. . .
Лето уходит
kumehtar 17.08.2026
Мысли в слух
kumehtar 17.08.2026
Забавно, насколько сейчас стала доступна информация. Например о магии, духовном развитии, медитациях, и других подобных направлениях, ранее зачастую тайных, передаваемых от учителя к ученику. Хотя. . .
Перемещение строк из ТЧ в другой документ с учетом текущего пробега
Maks 17.08.2026
Реализация из решения ниже выполнена на примере нетипового документа "Автозапчасти", с ТЧ "Шины". За основу взят алгоритм отсюда: https:/ / www. cyberforum. ru/ blogs/ 359708/ 10838. html Задача: . . .
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru