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

Изменить размер по событию click, при растягивании окна перерисовать сетку

03.04.2016, 23:45. Показов 2497. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый вечер!
Помогите изменить размер ячеек сетки по событию click(вообще хотел по вращению колеса мыши, но не нашел такого действия), т.е. как бы сымитировать эффект приближения и при растягивании окна формы перерисовать сетку до краев формы.
Если можно особо не усожняя мой код(полностью отсутствуют знания пока. )

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
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Linq;
using System.Text;
using System.Windows.Forms;
 
namespace Plot_4
{
    public partial class Form1 : Form
    {
        Bitmap myBitmap;            // инкапсулирует точечный рисунок
        Graphics gr;                // инкапсулирует поверхность рисования
 
        float step_x;
        float step_y;
 
        public Form1()
        {
            InitializeComponent();
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
            myBitmap = new Bitmap(pictureBox1.Width, pictureBox1.Height);
            step_x = myBitmap.Width / 20;
            step_y = myBitmap.Width / 20;
            gr = Graphics.FromImage(myBitmap);
            gr.SmoothingMode = SmoothingMode.AntiAlias;
        }
 
        private void pictureBox1_Paint(object sender, PaintEventArgs e)
        {
           
                // Create a new pen.
                Pen LightBluePen = new Pen(Brushes.LightBlue);
                // Set the pen's width.
                LightBluePen.Width = 0.5F;
 
                float x = 20.0F;
                float y = 20.0F;
                float x1 = 0.0F;
                float y1 = 0.0F;
                float x2 = 0.0F;
                float y2 = 0.0F;
                
       
                for (; x < myBitmap.Width; x += step_x)
                {
                    x1 = x;
                    y1 = 0;
                    x2 = x;
                    y2 = myBitmap.Height;
                    gr.DrawLine(LightBluePen, x1, y1, x2, y2);
                }
 
                for (; y < myBitmap.Height; y += step_y)
                {
                    x1 = 0;
                    x2 = myBitmap.Width;
                    y1 = y;
                    y2 = y;
                    gr.DrawLine(LightBluePen, x1, y1, x2, y2);
                }
                
                // Set the PictureBox to display the image.
                pictureBox1.Image = myBitmap;
                                  
                //Dispose of the pen.
                LightBluePen.Dispose();
        }
 
        private void pictureBox1_Click(object sender, EventArgs e)
        {
            step_x *=  2;
            step_y *= 2;
        }
       
    }
}
Добавлено через 12 минут
Ну вернее 1% знаний по Windows.Forms.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.04.2016, 23:45
Ответы с готовыми решениями:

Изменить размер при изменении окна, но фиксировано
Надеюсь на помощь. Есть возможность вставлять произвольный html код. Есть картинка длиной 1200 на 80 Мне нужно фиксировать размер ее по...

Изменить размер окна fancybox при переходе по ссылке
Есть модальное окно с описанием товара, в этом окне есть кнопа купить, которая ведет на форму обратной связи. Форма открывается в этом же...

Передать событию Click кнопке доп. информацию при ее программном нажатии
Всем привет! Подскажите пожалуйста, капал в разные стороны, в итоге ничего... На форме есть кнопка: &lt;asp:Button...

16
979 / 874 / 350
Регистрация: 26.04.2012
Сообщений: 2,647
04.04.2016, 03:00
Цитата Сообщение от НовыйНовичок Посмотреть сообщение
вообще хотел по вращению колеса мыши, но не нашел такого действия
Вот
Во-первых, определитесь, на чем именно вы рисуете. Если на битмапе, то зачем это делать в событии Paint? Если на графиксе picturebox, то зачем битмап(и вообще, нужен ли сам picturebox, может лучше прямо на форме рисовать)?
В любом случае, по-моему стоит сделать статический метод, принимающий в аргументах Graphics, Rectangle, в котором должна рисоваться сетка, и шаг, который у вас сейчас step_x и step_y. В нем и рисовать сетку на графиксе. Дальше, в зависимости от того, на чем вы решите рисовать, вызывать этот метод либо в событии Paint(Graphics тогда брать из аргументов события), либо где-то еще где посчитаете нужным, если рисовать таки на битмапе. Переменные, которые подаются как шаг, объявить как поля в классе формы. И, когда потребуется, просто менять их значения и вызывать перерисовку.
1
1 / 1 / 2
Регистрация: 10.11.2013
Сообщений: 126
04.04.2016, 09:07  [ТС]
Там два графических объекта для создания двойного буфера для сглаживания, при частоте обновления 30 мс по событию таймер были тормоза, не я придумал, у коллеги были проблемы он сделал так.
А кто может помочь исправить этот код: я создал событие click, где меняю шаг сетки, но событие paint, которое как я предполагал будет вызываться при каждом изменении не вызывает повторный проход кода. Как сделать чтобы событие click влияло на paint? И да лучше код, идеи реализации мне бы помогли, если бы были знания.
И да убрать несколько графических объектов инкапсулирующих поверхность рисования, думаю можно будет, там кажется есть свойство двойной буферизации, но сейчас пока охота сделать так, а потом уже тот вопрос решить.

Добавлено через 1 минуту
Да, ссылку то я заметил после того как написал ответный пост, сорри, сейчас посмотрю
0
979 / 874 / 350
Регистрация: 26.04.2012
Сообщений: 2,647
04.04.2016, 17:12
Цитата Сообщение от НовыйНовичок Посмотреть сообщение
Там два графических объекта для создания двойного буфера для сглаживания, при частоте обновления 30 мс по событию таймер были тормоза, не я придумал, у коллеги были проблемы он сделал так.
Я не понимаю, какое отношение данный код имеет к двойной буферизации. Двойная буферизация-это вроде бы когда 2 битмапа, на одном рисуется новое изображение в одном потоке, а другой тем временем рисуется на экране в другом. А потом они меняются. И да, есть стандартное свойство по этому поводу.
Цитата Сообщение от НовыйНовичок Посмотреть сообщение
SmoothingMode.AntiAlias
А это у вас по идее отвечает за сглаживание. А то, что у вас происходит в методе Paint, отвечает только за создание тормозов. Что бы вы ни хотели сделать, это явно надо делать по-другому. А по поводу быстрой графики почитайте вот эту тему и блог. Там шутер с хорошим ФПС делается в винформе без применения сторонних библиотек, много полезного кода для работы с графикой.
0
1 / 1 / 2
Регистрация: 10.11.2013
Сообщений: 126
05.04.2016, 14:15  [ТС]
Кстати на сайте х-брах-р есть тема C# WinForms — Советы по разработке пользовательских компонентов , там про использование Bitmap есть. file:///C:/Users/user/Desktop/C%23%20WindowsForms/C%23%20WinForms%20%E2%80%94%20%D0%A1%D0% BE%D0%B2%D0%B5%D1%82%D1%8B%20%D0%BF%D0%B E%20%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1 %D0%BE%D1%82%D0%BA%D0%B5%20%D0%BF%D0%BE% D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%8 2%D0%B5%D0%BB%D1%8C%D1%81%D0%BA%D0%B8%D1 %85%20%D0%BA%D0%BE%D0%BC%D0%BF%D0%BE%D0% BD%D0%B5%D0%BD%D1%82%D0%BE%D0%B2%20_%20% D0%A5%D0%B0%D0%B1%D1%80%D0%B0%D1%85%D0%B 0%D0%B1%D1%80.htm -- надеюсь я не нарушаю правила, данным постом, так как в правилах только про запрет ссылок на другие форумы.
Кстати кто может, на основе этого кода, напишите пожалуйста реализацию координатной сетки, с обновлением по timers.timer.
Естественно я пробую реализовать сам, но помощь будет полезна, пока не получилось.

Добавлено через 3 часа 34 минуты
Вот написал на основе того кода костяк, но не выводит прямоугольник, что не так?
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
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Linq;
using System.Text;
using System.Windows.Forms;
 
namespace Plot_4_4
{
    public partial class Form1 : Form
    {
/// <summary>
        /// Событие рендеринга
        /// </summary>
        protected event EventHandler Rendering;
        /// <summary>
        /// Генератор события рендеринга
        /// </summary>
        protected void OnRendering()
        {
            if (Rendering != null)
            {
                Rendering(this, EventArgs.Empty);
            }
        }
 
        Bitmap MyBitmap;
 
 
        public Form1()
        {
            SignUpToUserEventHandlers();
            InitializeComponent();
        }
 
        private void SignUpToUserEventHandlers()
        {
            Rendering += new EventHandler(My_rendering);
            Paint += new PaintEventHandler(My_Paint);
            Resize += new EventHandler(Edit_Resize);
        }
 
 
              
        private void timer1_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
          
        }
 
        /// <summary>
        /// Отрисовка визуального буфера контрола
        /// </summary>
        void Render()
        {
            MyBitmap = new Bitmap(pictureBox1.Width, pictureBox1.Height);
            using (Graphics g = Graphics.FromImage(MyBitmap))
            {
                g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
                g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit;
                g.Clear(Color.White);
                g.DrawRectangle(new Pen(Color.Blue, 7.0F), new Rectangle(new Point(0, 0), new Size(100, 100)));
            }
        }
 
        void My_rendering(object sender, EventArgs e)
        {
            Render();
        }
 
        /// <summary>
        /// Вывод визуального буфера на экран
        /// </summary>
        void My_Paint(object sender, PaintEventArgs e)
        {
            e.Graphics.Clear(Color.White);
            if (MyBitmap == null)
            {
                e.Graphics.DrawRectangle(new Pen(Color.Yellow, 7.0F), new Rectangle(new Point(0, 0), new Size(this.Width - 1, this.Height - 1)));
                return;
            }
            e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
            //e.Graphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit;
            e.Graphics.DrawImage(MyBitmap, new Rectangle(new Point(0, 0), this.Size));
        }
 
        /// <summary>
        /// Обработка изменения размеров 
        /// </summary>
        void Edit_Resize(object sender, EventArgs e)
        {
            Invalidate();
        }   
            
        
    }
}
0
979 / 874 / 350
Регистрация: 26.04.2012
Сообщений: 2,647
05.04.2016, 14:56
НовыйНовичок, ваша ссылка, во-первых, указывает на рабочий стол вашего компа, во-вторых для ссылок есть теги.
Цитата Сообщение от НовыйНовичок Посмотреть сообщение
Кстати кто может, на основе этого кода, напишите пожалуйста реализацию координатной сетки, с обновлением по timers.timer.
Вы бы лучше задачу описали, что вообще надо сделать? От того, что на экране просто будет нарисована какая-то сетка, она не станет координатной. И зачем ее обновлять по какому-то таймеру?
Должен быть тогда уж класс, который отвечает за уровень зума и тд, методы для работы с объектами на этой сетке и тд. Если вы собираетесь рисовать графики или диаграммы, то для этого существует компонент Chart и сторонняя библиотека ZedGraph, не надо изобретать велосипед.

Добавлено через 26 минут
НовыйНовичок, данный код рисует. Не знаю, в чем у вас проблема. Правда зачем там упоминается pictureBox, если рисование происходит на форме, не понимаю.
0
1 / 1 / 2
Регистрация: 10.11.2013
Сообщений: 126
05.04.2016, 15:01  [ТС]
Да приложение по построению графиков, данные будут с другой машины, приходят по сокету, обновляются по таймеру, ось абсцисс время; данные отображаются примерно как в диспетчере задач загрузка процессора с автоматическим масштабированием, на текущий момент(с неб. задержкой понятно). При остановке приложения можно использовать доп. функции по обработке и анализу инфы. Вот примерно.

Но это большая задача, мне сейчас только бы ответ на вопрос почему не рисуется прямоугольник в последнем моем коде.
0
979 / 874 / 350
Регистрация: 26.04.2012
Сообщений: 2,647
05.04.2016, 15:03
НовыйНовичок, как я уже сказал, он рисуется. По краям формы. Снизу и справа не видно, так как получается, что само рисование происходит за краем. А по задаче-если она не учебная, то не стесняйтесь использовать сторонние библиотеки.
0
1 / 1 / 2
Регистрация: 10.11.2013
Сообщений: 126
05.04.2016, 15:28  [ТС]
Как я понимаю pictureBox там чтобы инициализоровать размеры bitmap'a, может это можно сделать размерами самой form1?
Почему рисунок не видно не знаю, может как раз picture box закрывает.

Добавлено через 4 минуты
Убрал picture box, теперь виден прямоугольник, но желтый, т.е. событие paint обрабатывается, a render нет, так там рисуется синий прямоугольник.

Добавлено через 3 минуты
C#
1
MyBitmap == null
у меня по этому условию вызывается прямоугольник, а в функции render рисуется синий

Добавлено через 11 минут
А по поводу библиотек chart и zedgraph посмотрю, спасибо.
Но посмотрите кто-нибудь, что неправильно в коде выше, или функция render() не вызывается, или я непрафильно использую её (.
0
979 / 874 / 350
Регистрация: 26.04.2012
Сообщений: 2,647
05.04.2016, 15:29
НовыйНовичок, ну так событие Render в этом коде не вызывается.
0
1 / 1 / 2
Регистрация: 10.11.2013
Сообщений: 126
05.04.2016, 15:56  [ТС]
Каким образом можно инициировать это событие? Я не понимаю какие мне изменения сделать в коде?
0
979 / 874 / 350
Регистрация: 26.04.2012
Сообщений: 2,647
05.04.2016, 17:49
НовыйНовичок, хотелось бы увидеть ссылку на изначальный вариант этого кода, чтобы что-то сказать.
0
1 / 1 / 2
Регистрация: 10.11.2013
Сообщений: 126
05.04.2016, 22:56  [ТС]
Сообщение в пятом топике.
0
979 / 874 / 350
Регистрация: 26.04.2012
Сообщений: 2,647
05.04.2016, 23:38
НовыйНовичок, что за пятый топик? По моей ссылке я такого кода не вижу.
0
1 / 1 / 2
Регистрация: 10.11.2013
Сообщений: 126
06.04.2016, 10:30  [ТС]
Сверху наших сообщений значки, над тем сообщением, где #5, там ссылка в текстовом виде.
0
979 / 874 / 350
Регистрация: 26.04.2012
Сообщений: 2,647
06.04.2016, 14:37
НовыйНовичок, я как уже писал выше, я не знаю, о чем мне должна говорить ссылка на рабочий стол вашего компьютера, к которому я доступа не имею.
0
1 / 1 / 2
Регистрация: 10.11.2013
Сообщений: 126
06.04.2016, 15:24  [ТС]
https://habrahabr.ru/post/263847/ -- вот, я не знаю как тот набор символов, когда я его ставлю в браузер открывает у меня в нем нужный пост
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
06.04.2016, 15:24
Помогаю со студенческими работами здесь

Растягивание изображения при растягивании главного окна.
Хочу написать программу(форму) при растягивании которой будет растягиваться изображение. К примеру имеет оно размеры 300х600, я...

dataGridView автоматически растягивается при растягивании окна(формы)
Ранее делал это, но сейчас никак не могу найти ни в mws, ни в интернете. На скрине видна проблема которую я хочу устранить. (хочу...

Изменить размер и положение окна, которое получается при подключении crt
Как можно изменить размер и положение окна, которое получается при подключении crt? Не того окна, которое window, а окошечка, которое...

GridSplitter работает не правильно. При растягивании сетки выходит за пределы окна.
Может кто-нибудь объяснить в чём причина? Не могу понять, уже замучался. Если потянуть за разделитель вниз, то он спокойно уходит за...

написать резиновую вёрстку так чтобы при растягивании окна браузера всё оставалось там где и должно быть
доброго времени суток! ни как не могу осуществить поставленную задачу. цель: написать резиновую вёрстку так чтобы при растягивании окна...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Как дизайн сайта влияет на конверсию: 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 На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru