Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
2 / 2 / 1
Регистрация: 16.04.2022
Сообщений: 1,032

Зависает форма с PictureBox

24.03.2024, 12:57. Показов 436. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!

Есть windows form c button1 и pictureBox1. Есть такой код.

Кликните здесь для просмотра всего текста
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
using System;
using System.Drawing;
using System.IO;
using System.Windows.Forms;
 
namespace testOpenFile
{
    public partial class Form1 : Form
    {
        string pathInitialDirectory = "C:\\Users\\Acer\\Desktop\\";
        Image originImage, zoomImage;
        Bitmap myBitmap1; //BitMap основного изображения
        Bitmap myBitmap2; //Bitmap c основным изображением и прямоугольником
        int zoomWidth; //Ширина измененного изображения
        int zoomHeight; //Высота измененного изображения
        int currentX = 0; //Текущая x
        int currentY = 0; //Текущая y
        Rectangle cloneRect; //Размещение прямоугольника   
        int selectWidth = 128; //Заданная ширина прямоугольника
        int selectHeight = 128; //Заданная высота прямоугольника
 
        public Form1()
        {
            InitializeComponent();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            using (OpenFileDialog openFileDialog = new OpenFileDialog())
            {
                //openFileDialog.Reset();
                openFileDialog.InitialDirectory = pathInitialDirectory;
                openFileDialog.Filter = "Files|*.jpg;*.jpeg;*.png";
                openFileDialog.FilterIndex = 2;
                openFileDialog.RestoreDirectory = true;
                if (openFileDialog.ShowDialog() == DialogResult.OK)
                {
                    originImage = Image.FromFile(openFileDialog.FileName);
                    zoomImage = originImage;
                    zoomWidth = zoomImage.Width;
                    zoomHeight = zoomImage.Height;
                    pathInitialDirectory = Path.GetDirectoryName(openFileDialog.FileName);
                    pictureBox1.Invalidate();
                    pictureBox1.Focus();
                }
            }
        }
 
        private void pictureBox1_Paint(object sender, PaintEventArgs e)
        {
            if (zoomImage != null)
            {
                myBitmap1 = new Bitmap(zoomImage);
                Graphics gr = e.Graphics;
                myBitmap2 = (Bitmap)myBitmap1.Clone();
 
                using (Graphics g = Graphics.FromImage(myBitmap2))
                {
                    if ((currentX >= 0) && (currentY >= 0) && (currentX + selectWidth <= zoomWidth) && (currentY + selectHeight <= zoomHeight))
                    {
                        cloneRect = new Rectangle(currentX, currentY, selectWidth, selectHeight);
                        g.DrawRectangle(Pens.Blue, cloneRect);                        
                    }
                    else
                    {
                        cloneRect = new Rectangle(currentX, currentY, selectWidth, selectHeight);
                        g.DrawRectangle(Pens.Red, cloneRect);                       
                    }
                }
 
                gr.DrawImage(myBitmap2, 0, 0);
                pictureBox1.Image = myBitmap2;               
           }
        }
    }
}

Когда запускаешь, на форме нажимаешь на кнопку button1, выбираешь нужное изображение, нажимаешь "Открыть" и на форме в pictureBox1 появляется изображение. Здесь все ОК. Также на форме нажимаешь на кнопку button1 и появляется открытое диалоговое окно от объекта OpenFileDialog c надписью "Выполняется". Форма зависает.

Скажите, почему все время вызывает метод Paint? Как правильно написать?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.03.2024, 12:57
Ответы с готовыми решениями:

метод static и форма picturebox
мне нужно использовать pictureBox, checkBox в методах static, но, как известно, они - не статические. то как использовать его, его...

Зависает форма
Работает приложение как повезет. Не повезет - зависнет, повезет - все нормально отработает. Непонятно, почему. В диспетчере задач...

Зависает форма
Когда запускаю программу, то форма зависает и не отвечает, в чём может быть проблема и как решить её? private void...

4
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,898
Записей в блоге: 1
24.03.2024, 13:27
MConst, по моему проблема в том внутри Paint устанавливается свойство Image. Попробуйте без этого переписать.
0
2 / 2 / 1
Регистрация: 16.04.2022
Сообщений: 1,032
24.03.2024, 14:36  [ТС]
Удалять не нужно, иначе не будет изменяться zoomImage при изменении размера.

Добавлено через 1 час 3 минуты
Хотя до этого нормально работало.
0
2 / 2 / 1
Регистрация: 16.04.2022
Сообщений: 1,032
25.03.2024, 08:34  [ТС]
В коде добавил функциональность по изменению zoom изображения. Теперь в windows form в студии нет элементов, а непосредственно задаются в коде.

Кликните здесь для просмотра всего текста
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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.IO;
using System.Windows.Forms;
 
namespace testOpenFile
{
    public partial class Form1 : Form
    {
        string pathInitialDirectory = "C:\\Users\\Acer\\Desktop\\";
        Image originImage, zoomImage;
        Bitmap myBitmap1; //BitMap основного изображения
        Bitmap myBitmap2; //Bitmap c основным изображением и прямоугольником
        int originWidth; //Ширина оригинального изображения
        int originHeight; //Высота оригинального изображения
        int zoomWidth; //Ширина измененного изображения
        int zoomHeight; //Высота измененного изображения
        int currentX = 0; //Текущая x
        int currentY = 0; //Текущая y
        Rectangle cloneRect; //Размещение прямоугольника   
        int selectWidth = 128; //Заданная ширина прямоугольника
        int selectHeight = 128; //Заданная высота прямоугольника
        TrackBar trackBar;
        double trackValue;
        PictureBox pictureBox1;
 
        public Form1()
        {
            InitializeComponent();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            using (OpenFileDialog openFileDialog = new OpenFileDialog())
            {
                openFileDialog.InitialDirectory = pathInitialDirectory;
                openFileDialog.Filter = "Files|*.jpg;*.jpeg;*.png";
                openFileDialog.FilterIndex = 2;
                openFileDialog.RestoreDirectory = true;
                if (openFileDialog.ShowDialog() == DialogResult.OK)
                {
                    originImage = Image.FromFile(openFileDialog.FileName);
                    originWidth = originImage.Width;
                    originHeight = originImage.Height;
                    zoomImage = originImage;
                    zoomWidth = zoomImage.Width;
                    zoomHeight = zoomImage.Height;
                    pathInitialDirectory = Path.GetDirectoryName(openFileDialog.FileName);
                    pictureBox1.Invalidate();
                    pictureBox1.Focus();                    
                }
            }
        }
 
        private void pictureBox1_Paint(object sender, PaintEventArgs e)
        {
            if (zoomImage != null)
            {
                myBitmap1 = new Bitmap(zoomImage);
                Graphics gr = e.Graphics;
                myBitmap2 = (Bitmap)myBitmap1.Clone();
 
                using (Graphics g = Graphics.FromImage(myBitmap2))
                {
                    if ((currentX >= 0) && (currentY >= 0) && (currentX + selectWidth <= zoomWidth) && (currentY + selectHeight <= zoomHeight))
                    {
                        cloneRect = new Rectangle(currentX, currentY, selectWidth, selectHeight);
                        g.DrawRectangle(Pens.Blue, cloneRect);                        
                    }
                    else
                    {
                        cloneRect = new Rectangle(currentX, currentY, selectWidth, selectHeight);
                        g.DrawRectangle(Pens.Red, cloneRect);                       
                    }
                }
 
                gr.DrawImage(myBitmap2, 0, 0);
                pictureBox1.Image = myBitmap2;
            }
        }
 
        private void trackBar_Scroll(object sender, EventArgs e)
        {
            trackValue = (double)(trackBar1.Value) / 100;
            zoomWidth = (int)(originWidth * trackValue);
            zoomHeight = (int)(originHeight * trackValue);
            updateZoom();
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
            pictureBox1 = new PictureBox();
            pictureBox1.Location = new Point(0, 0);          
            pictureBox1.Paint += new PaintEventHandler(pictureBox1_Paint);
            pictureBox1.Size = new Size(300, 200);
            this.Controls.Add(pictureBox1);
 
            trackBar1 = new TrackBar();
            trackBar1.Location = new Point(0, 220);
            trackBar1.Size = new Size(100, 45);
            trackBar1.Minimum = 1;
            trackBar1.Maximum = 100;
            trackBar1.TickFrequency = 1;
            trackBar1.LargeChange = 1;
            trackBar1.SmallChange = 1;
            trackBar1.Value = trackBar1.Maximum;
            trackBar1.Scroll += new System.EventHandler(trackBar_Scroll);
            this.Controls.Add(trackBar1);
 
            Button button_open = new Button();
            button_open.Text = "Открыть изображение";
            button_open.Location = new Point(10, 280);
            button_open.Size = new Size(160, 35);
            button_open.Click += new System.EventHandler(this.button1_Click);
            this.Controls.Add(button_open);
        }
 
        private void updateZoom()
        {
            Bitmap newBitmap = new Bitmap(zoomWidth, zoomHeight);
            newBitmap.MakeTransparent();
 
            using (Graphics g = Graphics.FromImage(newBitmap))
            {
                g.CompositingQuality = CompositingQuality.HighQuality;
                g.InterpolationMode = InterpolationMode.HighQualityBicubic;
                g.DrawImage(originImage, 0, 0, zoomWidth, zoomHeight);
                g.Flush();
            }
 
            zoomImage = newBitmap;
        }
    }
}

Цитата Сообщение от OwenGlendower Посмотреть сообщение
MConst, по моему проблема в том внутри Paint устанавливается свойство Image. Попробуйте без этого переписать.
Если в методе paint перенести
C#
1
pictureBox1.Image = myBitmap2;
то не работает изменение zoom.
0
2 / 2 / 1
Регистрация: 16.04.2022
Сообщений: 1,032
25.03.2024, 17:17  [ТС]
Получилось сделать так: в методе pictureBox1_Pain убрал строку
C#
1
pictureBox1.Image = myBitmap2;
и добавил
C#
1
2
pictureBox1.Width = zoomWidth;
pictureBox1.Height = zoomHeight;
а в методе updateZoom() в конце добавил
C#
1
pictureBox1.Invalidate();
Вроде как бы работает, но не уверен, что правильно. Есть то, чего не учитывается?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.03.2024, 17:17
Помогаю со студенческими работами здесь

Зависает форма
Здравствуйте, товарищи. Пишу приложение Windows Form. На форме есть элемент dataGridView, имеет одно поле - ipAddress, он заполнен...

Зависает вторая форма
Добрый день. Помогите пожалуйста с такой проблемой... пишу программу на тиражирование данных в excel файлы. После того, как сам...

Зависает форма, при использование while
Зависает форма и просто стоит. это кнопка 1, она начинает отсчет bool t = true; private void button1_Click(object sender,...

Форма зависает, а программа работает
Приветствую. Есть программа которая работает с определенным сайтом, постоянно получая с него данные при помощи awesomium'a (замена...

Зависает форма при многопоточности
Здравствуйте! У меня такая проблема! У меня в форме есть секундомер, который запускается при нажатии на кнопку. При этом запускаются еще...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru