Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
0 / 0 / 0
Регистрация: 28.02.2020
Сообщений: 103

Форма отстает от курсора

06.07.2024, 02:59. Показов 2342. Ответов 36
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Значит, пытался я написать приложение. Изначально, когда запускаешь его, все нормально. Берешь за панель состояния и спокойно переносишь его, без задержек. Однако после нажатия кнопки и выполнения одной функции по кнопке, при попытке переноса форма движется как будто замедленно, с задрежкой между движением курсора и самим приложением. Разрабатываю приложение на Visual Studio 2022 на Windows Forms.
Код функции, после которой начинаются задержки:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
private void CheckWin()
{
    bool a = true;
    for (int i = 0; i < 900; i++)
    {
        if (mass2[i] != mass[i])
        {
            a = false;
        }
    }
    if (a)
    {
        panel1.Visible = false;
        panel2.Size = new Size(937, 1073);
        panel2.Location = new Point(12, 12);
        panel2.Controls.Add(label13);
        label13.Text = "Вы победили!";
        label13.AutoSize = false;
        label13.Dock = DockStyle.Fill;
        label13.TextAlign = ContentAlignment.MiddleCenter;
        panel2.Visible = true;
    }
}
Предполагаю, что дело тут в свойствах visible у панелей, но почему именно так возникает задержка, не знаю. Помогите, пожалуйста разобраться

P.S: если закомментировать panel1.Visible = false;
а если закомментировать panel2.Visible = true; то задержка появляется после нажатия кнопки
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
06.07.2024, 02:59
Ответы с готовыми решениями:

Как узнать координаты курсора на экране если форма не активна?
Координаты курсора в форме узнать не составляет труда, а можно ли узнать их вне формы или когда окно свернуто? Добавлено через 1 час...

Есть svg, который состоит из path. При попытке переместить элемент, он сильно отстает от курсора.
Здравствуйте. Возникла такая проблема. Есть svg, который состоит из path. При попытке переместить элемент, он сильно отстает от курсора. И...

Форма курсора
Добрый вечер, помогите пожалуйста, нужно разработать компонент с функциональностью стандартной метки TLabel и возможностью изменения...

36
0 / 0 / 0
Регистрация: 28.02.2020
Сообщений: 103
06.09.2024, 22:08  [ТС]
Студворк — интернет-сервис помощи студентам
kolorotur, Как мне связать gfx и PictureBox1, чтобы изображение рисовалось на PictureBox1?
Вот мой код:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int
DX = 150,
DY = 30,
HeightP = 25,
WidthP = 25,
PictureBox PictureBox1 = new PictureBox()
{
    Height = 750,
    Width = 750,
    Location = new Point(DX, DY)
};
panel1.Controls.Add(PictureBox1);
var dst = new Rectangle(150, 25, HeightP, WidthP);
var source = Resources.blank;
using (var gfx = PictureBox1.CreateGraphics())
{
    gfx.DrawImage(source, 0,0,25,25);
}
Я ожидаю увидеть маленький квадратик, а не вижу ничего
0
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
07.09.2024, 07:26
Цитата Сообщение от Оаг Посмотреть сообщение
Как мне связать gfx и PictureBox1
PictureBox -> Image -> Graphics
метод CreateGraphics создает графику для контрола, это не то что вам нужно.
0
0 / 0 / 0
Регистрация: 28.02.2020
Сообщений: 103
08.09.2024, 02:00  [ТС]
Wolfdp, А как должен выглядеть весь код? Мне Visual Studio даже не предлагает свойство Graphics, когда начинаю набирать его
0
0 / 0 / 0
Регистрация: 28.02.2020
Сообщений: 103
12.09.2024, 02:35  [ТС]
Нашел два варианта, как сделать то, что мне нужно.
Первый вариант:
C#
1
2
3
4
Bitmap buf=new Bitmap(750,750);
Graphics gfx = Graphics.FromImage(buf);
gfx.DrawImage(Resources.full, X*25, Y*25, 25, 25);
pictureBox1.Image = buf;
Второй вариант:
C#
1
2
3
Graphics gfx = Graphics.FromImage(pictureBox1.Image);
gfx.DrawImage(Resources.full, X*25, Y*25, 25, 25);
pictureBox1.Invalidate();
Добавлено через 6 минут
Цитата Сообщение от Rius Посмотреть сообщение
Попробуйте избавиться от 900 PictureBox на форме.
Хватило бы и одного-единственного.
Вы были правы. Сделал с помощью одного PictureBox и теперь нет задержки при перетаскивании формы. Спасибо
0
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
12.09.2024, 09:11
Цитата Сообщение от Оаг Посмотреть сообщение
Первый вариант:
На всякий, если написать прям так, то тут будет утечка ресурсов из-за того что пересоздаете новый Bitmap, при этом не убивая старый Image.

Второй имеет туже проблему, но уже с Graphics (в первом тоже проявится) -- это тоже IDisposable объект и стоит высвобождать через using или прямой вызов Dispose. Если перерисовка вызывается очень часто, но создавать каждый раз новый Graphics смысла нет.
0
0 / 0 / 0
Регистрация: 28.02.2020
Сообщений: 103
12.09.2024, 16:18  [ТС]
А если у меня битмап и графикс будут глобальными переменными, то такой проблемы не будет?Wolfdp,
0
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
13.09.2024, 01:14
Цитата Сообщение от Оаг Посмотреть сообщение
А если у меня битмап и графикс будут глобальными переменными
В C# нет понятия "глобальная переменная". Научитесь работать объектами с полями, и будет вам счастье. Скорее всего вам достаточно объявить нужное поле внутри формы.

На всякий -- форма ровно такой же class, как если бы вы создавали его руками. Никакой дополнительной магии в ней не заключено. Именно поэтому с ними можно делать ровно все те же приколы ООП, которые вы учили до этого (вы же учили, да?)
0
0 / 0 / 0
Регистрация: 28.02.2020
Сообщений: 103
13.09.2024, 01:29  [ТС]
Wolfdp, Сделал так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public partial class Form1 : Form
{
Bitmap buf=new Bitmap(750,750);
Graphics gfx;
 
public Form1()
{
    InitializeComponent();
 
    gfx = Graphics.FromImage(buf);
}
 
private void pictureBox_ClickMouse(int X,int Y, int Button)
{            
    gfx.DrawImage(Resources.full, X*25, Y*25, 25, 25);
    pictureBox1.Image = buf;
}
}
Вроде работает. Так не будет утечки ресурсов?
0
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
13.09.2024, 07:28
Цитата Сообщение от Оаг Посмотреть сообщение
Так не будет утечки ресурсов?
Выглядит норм для вашего уровня. По крайне мере уловили мысль что используемые вещи на форме можно указывать её полях. В целом можно "причесать":
- инициализация полей в разнобой, я бы всё вынес конструктор
- каждый раз переприсваивать pictureBox1.Image = buf; нет смысла, достаточно один раз в конструкторе
- я бы таки добавил вызов Dispose в перегрузку самой формы

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
public partial class Form1 : Form
{
    private Bitmap buf;
    private Graphics gfx;
 
    public Form1()
    {
        InitializeComponent();
 
        buf = new Bitmap(750, 750);
        pictureBox1.Image = buf;
        gfx = Graphics.FromImage(buf);
    }
 
    private void pictureBox_ClickMouse(int X, int Y, int Button)
    {
        gfx.DrawImage(Resources.full, X * 25, Y * 25, 25, 25);
    }
 
    protected override void Dispose(bool disposing)
    {
        base.Dispose(disposing);
 
        buf.Dispose();
        gfx.Dispose();
    }
}
0
0 / 0 / 0
Регистрация: 28.02.2020
Сообщений: 103
14.09.2024, 01:03  [ТС]
Wolfdp,
Цитата Сообщение от Wolfdp Посмотреть сообщение
- я бы таки добавил вызов Dispose в перегрузку самой формы
Попытался вставить вашу перегрузку Dispose, Visual Studio подчеркивает красным и пишет:
"Тип Form1 уже определяет член Dispose с такими же типами параметров"

Добавлено через 10 минут
После переноса picturebox1.Image = buf; в конструктор, картинка перестала изменяться, пока что вернул обратно

Добавлено через 6 минут
Когда я писал про глобальные переменные, я и имел ввиду объявить поле внутри формы, чтобы его было видно во всех функциях данной формы. Простите за недопонимание, мой косяк
0
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
14.09.2024, 01:46
Лучший ответ Сообщение было отмечено Оаг как решение

Решение

Цитата Сообщение от Оаг Посмотреть сообщение
Попытался вставить вашу перегрузку Dispose, Visual Studio подчеркивает красным и пишет:
Сорян, проверял как тупо класс, поэтому не заметил что этот метод уже переопределяется в автокоде визуального редактора. В целом можно как и забить (конкретно эти объекты авто-диползятся по финализации, но это не со всеми типами работает), либо подписаться на событие Disposed/

Цитата Сообщение от Оаг Посмотреть сообщение
После переноса picturebox1.Image = buf; в конструктор, картинка перестала изменяться, пока что вернул обратно
Если объект после каких-то действий не меняет свое визуальное состояние, стоит попробовать пнуть Refresh. Дело в том что изменение внутренних объектов не всегда сигнализирует UI элементам об этом.

Возможно будет выглядит как "две строчки вместо одной", но нужно стараться сохранять читаемость кода. Вызов Refresh четко дает понять что мы не "меняем" изображение на новое, а просто сигнализируем что используемый Image изменился и нужно перерисовать.

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
public partial class Form1 : Form
{
    private Bitmap buf;
    private Graphics gfx;
 
    public Form1()
    {
        InitializeComponent();
 
        buf = new Bitmap(750, 750);
        pictureBox1.Image = buf;
        gfx = Graphics.FromImage(buf);
        Disposed += (_, __) => 
        {
            buf.Dispose();
            gfx.Dispose();
        };
    }
 
    private void pictureBox_ClickMouse(int X, int Y, int Button)
    {
        gfx.DrawImage(Resources.full, X * 25, Y * 25, 25, 25);
        pictureBox1.Refresh();
    }
}
1
0 / 0 / 0
Регистрация: 28.02.2020
Сообщений: 103
14.09.2024, 02:19  [ТС]
Wolfdp, Вот, теперь все работает. Спасибо!
Хорошо, что вы не видели остальной мой код)
0
14.09.2024, 12:46

Не по теме:

Цитата Сообщение от Оаг Посмотреть сообщение
Хорошо, что вы не видели остальной мой код)
Поверте, там нет ничего такого, чего бы я не видел. Как и немало завсегдателей данного раздела форума.

0
0 / 0 / 0
Регистрация: 28.02.2020
Сообщений: 103
15.09.2024, 00:15  [ТС]
Здесь можно в одной теме два лучших ответа выбрать?
0
19.09.2024, 11:10

Не по теме:

Оаг, Можно написать свой ответ, вставить в него ссылки на ответы с решением и отметить его как лучший ответ (решение)

0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3460 / 2781 / 575
Регистрация: 04.09.2018
Сообщений: 8,743
Записей в блоге: 3
19.09.2024, 11:11
Цитата Сообщение от Оаг Посмотреть сообщение
два лучших ответа выбрать
да хоть десять.
0
 Аватар для Andrey-MSK
3386 / 2272 / 388
Регистрация: 14.08.2018
Сообщений: 7,689
Записей в блоге: 4
19.09.2024, 11:31
Цитата Сообщение от wizard41 Посмотреть сообщение
да хоть десять
Тока три
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.09.2024, 11:31

Форма на основе курсора
Добрый вечер, форумчане. Собственно, после множественных скитаний по сайтам, я так и не нашел как сделать подобное. Есть некая...

Позиция курсора и его форма
Есть задание, нужно сдвинуть позицию курсора на 300 пикселей вправо и 100 пикселей вниз, а также изменить форму курсора. Есть код на ...

Win API форма курсора
Привет. Делаю оконное приложение на win api. Надо программно сделать форму курсора - стрелка (стандартная). Как это сделать, подскажите?

Странная форма курсора в графических редакторах. Вирус?
Что ЭТО??? возникает в графредакторах на курсоре после просыпания

Хочу сделать Auto-Opacity чтобы при убирании курсора форма меняла opacity
Пожалуйста опишите подробнее куда что вставлять Я хочу чтобы когда в форме курсора нету тогда её opacity 80 А когда навожу 100 ...


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

Или воспользуйтесь поиском по форуму:
37
Ответ Создать тему
Новые блоги и статьи
SUNO Ai - Река Без Дна
zorxor 31.07.2026
Автор стихотворения - астрофизик Марина Катыс Ссылка на сгенерированную музыкальную композицию: https:/ / suno. com/ song/ 6f6e5464-b290-4650-be6c-44c85f8d8013 Я говорю, что Время- как вода течет. . .
Из невошедшего на форум (диалог с ИИ-гугла)
zorxor 29.07.2026
А вот, что интересно, сказал мне ИИ-гугла: Этот текст — эмоциональный пост пользователя под ником zorxor на интернет-форуме (вероятно, посвященном мистике, непознанному или альтернативной науке). . . .
Был праздник вчера, а я и не знал.
kumehtar 28.07.2026
27. 07. 2026г. Intel Core 2 Duo исполнилось 20 лет Новости компьютерного мира и их обсуждение (4) Салют, шампанское, овации! :drink:
Нейтральные знания, чистый код - бла-бла-бла-бла, на самом деле кликбейт и самореклама, плагиат, и вот почему
Hrethgir 27.07.2026
То-есть отклонение такой публикации говорит само за себя, и пусть только возьмут на вооружение после отклонения публикации - это будет чистейшим актом плагиата. Отклонял Хабр. Дословно, отклонённая. . .
тв 16 бой ии
anaschu 27.07.2026
Великий Перелом ИИ: Как уравнения ОДУ Radau дожали цензурные фильтры Алисы Фиксируем в мемофонде Теории Всего беспрецедентный факт в истории ИИ-зондирования. В затяжном многораундовом. . .
мв 15. непроверенное, возможно, глюк
anaschu 27.07.2026
НАУЧНО-АНАЛИТИЧЕСКИЙ ОТЧЕТ. РАЗДЕЛ 1. 1: «НАУКА» (РАСШИРЕННАЯ СТЕХИОМЕТРИЧЕСКАЯ И ГЕНЕТИЧЕСКАЯ ВЕРСИЯ)Тема: Теоретическое обоснование инвариантности 19-мерного тензорного ядра непрерывных ОДУ и. . .
Очистка реквизитов и табличных частей документа при копировании (вариант 2)
Maks 26.07.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРаботу", разработанного в КА2. Задача: Заменить алгоритм запрета копирования документов для сотрудников с ролью "Стажер",. . .
Доктрина интенционального знания - Доктрина для портала "Срез".
Hrethgir 25.07.2026
Может найдётся кто захочет оценить доктрину. . . Написания правил участия для меня роскошь, требующая лимита времени, поэтому все сообщения не прошедшие модерацию будут видны только участникам портала,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru