Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.84/25: Рейтинг темы: голосов - 25, средняя оценка - 4.84
 Аватар для irineyxxx
151 / 53 / 11
Регистрация: 18.09.2011
Сообщений: 730

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

22.03.2012, 06:44. Показов 5335. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
Почему SEO не начинается с ключевых слов: что проверить до написания текстов
Neotwalker 01.08.2026
Когда владельцу сайта предлагают заняться SEO, первым шагом часто становится сбор запросов и написание текстов. Логика кажется понятной: 1. Находим ключевые слова. 2. Добавляем их на. . .
Знание — сила: Доктрина интенциональности знаний, углубление в формулу
Hrethgir 01.08.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11957&stc=1&d=1785567302 Знаменитый афоризм Фрэнсиса Бэкона «Знание — сила» (Scientia potentia est) в массовой культуре принято понимать. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru