Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
113 / 100 / 68
Регистрация: 21.04.2014
Сообщений: 1,420

Исчезает один из столбцов в гистограмме

30.03.2016, 15:08. Показов 894. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте.
Создаю свой контрол для рисования гистограмм. Столкнулся с очередной проблемой:
Если контрол достаточно сильно ужать (изменить размер формы), то самые маленькие столбцы становятся невидимыми. Причём исчезают не только столбцы, но и эллипс и подпись к столбцу. Старался отследить значения ширины и высоты для них. Вроде всё адекватно. Помогите определить в чём проблема.
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
protected override void OnPaint(PaintEventArgs e)
            {
                if (dicData == null || DesignMode) 
                    return;
 
                float fHorizontal = ClientSize.Width - Padding.Left - Padding.Right;
                float fVertical = ClientSize.Height - Padding.Top - Padding.Bottom - (ClientSize.Height/50);
                Graphics g = e.Graphics;
 
                g.TranslateTransform(Padding.Left, Padding.Top);
 
                //Рисуем горизонтальную и вертикальную линии (левая и нижняя стенки)
                //g.DrawLine(Pens.Black, 0, fVertical, fHorizontal, fVertical);
                //g.DrawLine(Pens.Black, 0, 0, 0, fVertical);
 
                //Определяем наибольшее число в списке
                double iMaxParameter = int.MinValue;
                foreach (var dic in dicData)
                    if (dic.Value > iMaxParameter)
                        iMaxParameter = dic.Value;
 
                float fStepX = fHorizontal / dicData.Count;
 
                Color[] arrColor = new Color[10];
                arrColor[0] = Color.FromArgb(139, 0, 0);
                arrColor[1] = Color.FromArgb(0, 100, 0);
                arrColor[2] = Color.FromArgb(0, 50, 50);
                arrColor[3] = Color.FromArgb(0, 0, 255);
                arrColor[4] = Color.FromArgb(75, 0, 128);
                arrColor[5] = Color.FromArgb(225, 69, 0);
                arrColor[6] = Color.FromArgb(100, 30, 0);
                arrColor[7] = Color.FromArgb(30, 125, 150);
                arrColor[8] = Color.FromArgb(120, 0, 100);
                arrColor[9] = Color.FromArgb(5, 60, 1);
 
                Color[] arrColorLight = new Color[10];
                arrColorLight[0] = Color.FromArgb(255, 40, 50);
                arrColorLight[1] = Color.FromArgb(127, 255, 0);
                arrColorLight[2] = Color.FromArgb(220, 220, 220);
                arrColorLight[3] = Color.FromArgb(0, 220, 255);
                arrColorLight[4] = Color.FromArgb(178, 112, 225);
                arrColorLight[5] = Color.FromArgb(225, 225, 0);
                arrColorLight[6] = Color.FromArgb(255, 128, 0);
                arrColorLight[7] = Color.FromArgb(0, 255, 240);
                arrColorLight[8] = Color.FromArgb(255, 50, 220);
                arrColorLight[9] = Color.FromArgb(100, 170, 90);
 
                int j = 0;
                int i = 0;
                foreach (var dic in dicData)
                {
                   /* if (dic.Value < 0)
                        dic.Value = 0;*/
 
                    if (j > arrColor.Length - 1)
                        j = 0;
 
                    float fBarHeight;
                    if ((float) dic.Value == 0)
                        fBarHeight = 1;
                    else
                        fBarHeight = 1f * fVertical * (float)dic.Value / (float)iMaxParameter - (fStepX * CoefficientWidth / 4);
 
                    if ((int) fBarHeight != 0)
                    {
                        float fYDownElips = (fVertical - (fStepX * CoefficientWidth / 4));
                        float fYUpElips = ((fVertical - fBarHeight - (fStepX * CoefficientWidth / 4) / 2) - (fStepX * CoefficientWidth / 4) / 2);
 
                        if (fYUpElips > fVertical)
                            fYUpElips = fYDownElips;
 
                        //Не рисовать столбец если значение равно 0
                        if ((double) dic.Value > 0)
                        {
                            LinearGradientBrush gradBrush =new LinearGradientBrush(new RectangleF((fStepX*i), (fVertical - fBarHeight), (fStepX*(CoefficientWidth + 0.1f)), fBarHeight), arrColor[j], arrColorLight[j], LinearGradientMode.Horizontal);
                            //g.FillRectangle(gradBrush, fStepX*i, fVertical - fBarHeight, fStepX*CoefficientWidth, fBarHeight);
                            g.FillRectangle(gradBrush, fStepX*i, fVertical - fBarHeight - (fStepX*CoefficientWidth/4)/2, fStepX*CoefficientWidth, fBarHeight);
 
                            LinearGradientBrush gradBrushEllipse = new LinearGradientBrush(new Rectangle((int) (fStepX*i), (int) fYUpElips - 10, (int) (fStepX*CoefficientWidth), 50), arrColor[j], arrColorLight[j], LinearGradientMode.BackwardDiagonal);
                            g.SmoothingMode = SmoothingMode.AntiAlias;
                            g.FillEllipse(gradBrushEllipse, fStepX*i, fYUpElips, fStepX*CoefficientWidth, fStepX*CoefficientWidth/4);
                        }
                        RectangleF rect = new RectangleF(fStepX * i, fVertical - fBarHeight, fStepX * CoefficientWidth, fBarHeight);
 
                        rect = new RectangleF(rect.Left, fVertical + 7, rect.Width, 100);
                        StringFormat sf = new StringFormat { Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Near };
                        g.DrawString(dic.Key.ToString(), Font, Brushes.Black, rect, sf);
 
 
                        //Нижний круг
                        if (fYDownElips - (fStepX * CoefficientWidth / 4) > fYUpElips)                                                                                       //В этом самом месте к ширине прямоугольника для заливки элипса
                        {                                                                                                                                                    //прибавляется 1/10 ширины столбца, чтобы заливка была равномерной
                            LinearGradientBrush gradBrushEllipse1 = new LinearGradientBrush(new RectangleF((fStepX * i), (fVertical - (fStepX * CoefficientWidth / 4)) - 10, (fStepX * CoefficientWidth) +  (fStepX * CoefficientWidth/10), (fStepX * CoefficientWidth / 4)), arrColor[j], arrColorLight[j], LinearGradientMode.Horizontal);
                            g.FillEllipse(gradBrushEllipse1, fStepX * i, fYDownElips, fStepX * CoefficientWidth, fStepX * CoefficientWidth / 4);
                        }
                    }
                    i++;
                    j++;
                }
            }
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
30.03.2016, 15:08
Ответы с готовыми решениями:

На роутере исчезает интернет, после перезагрузки появляется и несколько минут работает, потом снова исчезает
в чем причина и как решить эту проблему? Может ли быть проблема со стороны интернет-провайдера или проблема в роутере?

на панеле задач каждые 2 минуты появляется значок шестеренки и исчезает, при этом исчезает полноэкранный режим
привет, на ноуте стоит win7, на панеле задач каждые 2 минуты появляется значок шестеренки и исчезает, при этом исчезает полноэкранный...

Объединение 5 столбцов в один
Добрый день Форум. Ребята помогите разобраться. Есть файл с данными уровни доступа. На первом листе проиcходит все действие. На...

1
113 / 100 / 68
Регистрация: 21.04.2014
Сообщений: 1,420
31.03.2016, 17:19  [ТС]
Исправил сам.
проблема была в округлении.
C#
1
if ((int) fBarHeight != 0)
Если fBarHeight был равен, на пример, 0.4, то условие не выполнялось.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
31.03.2016, 17:19
Помогаю со студенческими работами здесь

Объединение столбцов в один с условием
Здравствуйте! Очень нужна ваша помощь: необходимо написать запрос на объединение столбцов из одной таблицы. Необходимо объединить столбцы:...

Объединить несколько столбцов в один
Скажите пожалуйста, можно ли реализовать действия на картинке и если да то как? Потому что я даже не представляю как это сделать:) ...

Перемещение из нескольких столбцов в один
Здравствуйте, как с помощью макроса можно сделать так чтобы из столбцов (E-F,I-J,M-N,Q-R) начиная с 7 строки по последнюю переместилось в...

Суммирование некольких столбцов в один
SELECT( SUM( case when `Message_To_1` is not NULL then '0x0001' else NULL end case when `Message_To_0` is not NULL then '0x0002'...

Объединение нескольких столбцов в один
Добрый день, уважаемые форумчане. Возникла следующая проблема: Необходимо из таблицы &quot;Сводная&quot; из столбцов &quot;ФИО Инициатора...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
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-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru