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

Магическое, ненормальное поведение про простом обращении к свойству UserControl в примитивной программе. Чудеса!

24.09.2013, 18:17. Показов 1156. Ответов 11
Метки нет (Все метки)

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

Ситуация: есть два solutions:
  1. собственный контрол: CustomMenuStrip, он создан отдельным UserControl'ом, подключается к основному проекту как dll. В этом контроле я наследуюсь от обычного MenuStrip и рисую в этом меню своими цветами так как мне нужно.
  2. основной проект: тестовая программа с одной формой и этим самым CustomMenuStrip на ней для проверки работоспособности моего контрола

У контрола есть конфиг файл, где хранятся цвета для рисования меню.

Что происходит: я в основном проекте в дизайнере Visual Studio подключил свой контрол, ввел названия пунктов меню, выбрал цвета для отрисовки, все нормально.

Теперь, ВНИМАНИЕ: по-дефолту все цвета рисуются так как нужно, НО (!) если я считываю любой цвет, к примеру MenuBorder, то мне возвращают значение не то, что я установил в дизайнере (и этот цвет нормально и правильно рисуется самой системой, так как и нужно), а возвращают цвет, который был в конфиг-файле!

Но ведь цвет в контроле в конфиг-файле был уже переопределен в дизайнере в основном проекте! Что вообще невообразимо, так это то, что то, что рисуется самой системой по-умолчанию (та отрисовка, в которую я не вмешиваюсь) - все цвета правильные. А вот когда я сам рисую - неправильные.

Скриншот:
Кликните здесь для просмотра всего текста


Обратите внимание на нижние 4 линии: они рисуются мной, они черные, а должны быть красные. Верхние линии шапки над пунктом меню рисуются системой автоматически, они красные, какими и должны быть, ибо я в дизайнере сделал MenuBorder красным. (картинку делал для stackoverflow.com, поэтому надписи английские)

Чтобы не расстилать два полотна простыней кода в несколько страниц, прикрепляю эти два проекта в зипе.

Прошу общественность мне помочь, кода немного и не работать тут просто нечему. В чем дело - непонятно. Абсолютная магия.

Ссылка на проекты:
Аттач: Projects.zip
Линк: http://speedy.sh/Hq4HK/Projects.zip
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.09.2013, 18:17
Ответы с готовыми решениями:

StackOverflowException при обращении к свойству
Здравствуйте уажаемые пользователи данного форума! Прошу, помогите! Не могу разобраться со свойствами. Перекопал форум StackOverFlow,...

System.NullReferenceException при обращении к свойству класса
private void TapOnTile(object sender, GestureEventArgs e) { MatrixTransform.M12 = 0.03; } На...

Чудеса в Решетове или странное поведение QGraphicsScene
Добрый вечер. Такой вопрос: Есть QGraphicsScene. На нее я добавил парочку эллипсов (для пробы, я с этой бедой только сейчас начал...

11
0 / 0 / 0
Регистрация: 24.09.2013
Сообщений: 15
25.09.2013, 15:08  [ТС]
Чтобы было более понятно: сам процесс рисования я произвожу в OnRenderToolStripBorder(ToolStripRenderE ventArgs e) в моем контроле (в первом солюшне, файл CustomMenuStrip.cs)
0
 Аватар для Spectral-Owl
608 / 583 / 157
Регистрация: 29.06.2010
Сообщений: 1,620
25.09.2013, 15:45
не скажу что до конца понял что происходит в этих двух проектов, но после того как сделаешь это:
C#
1
2
3
4
5
6
7
8
9
10
        /// <summary>
        /// Gets or sets the color used when the menu item is selected in the System.Windows.Forms.MenuStrip control.
        /// </summary>
        [Category("Style")]
        [DisplayName("MenuBorder")]
        public Color MenuBorder
        {
            get { return Color.Red; }
            set { Properties.Settings.Default.MenuBorder = Color.Red; }
        }
получится такой результат:
Миниатюры
Магическое, ненормальное поведение про простом обращении к свойству UserControl в примитивной программе. Чудеса!  
0
0 / 0 / 0
Регистрация: 24.09.2013
Сообщений: 15
25.09.2013, 17:55  [ТС]
Тогда немного подробнее:

В первом проекте CustomMenuStrip происходит следующее:
  1. создаю свой контрол CustomMenuStrip, наследуясь от MenuStrip
  2. создаю свой Renderer для отрисовки (чтобы переопределить поведение при событии). Для этого я загружаю цвета из CustomMenuStripColorTable, это передаются в конструктор Renderer'а. Эта таблица цветов хранится в настройках Properties.Settings.Default.
  3. в переопредененном методе OnRenderToolStripBorder рисую то что нужно

Во втором тестовом проекте я просто кинул свой контрол на форму и задал цвета какие мне нужно.
Но в том-то и дело, что я задал Red, а рисуется цветом Black. Почему, если я в дизайнере поставил Red и все системой по-дефолту рисуется правильно, красным, а мне выдают цвет из Properties.Settings.Default, т.е. черный?

Суть-то как раз и в том, чтобы можно было в дизайнере поменять цвета и все работало, ручная правка через Properties.Settings.Default исключена.

Ради интереса попробуйте вызвать MessageBox с цветом MenuBorder из первого проекта и из второго, он будет разный, хотя контрол один и тот же! Ну как так может быть, чтобы один и тот же контрол возвращал разные значения для одного и того же свойства? Мистика, не иначе!
0
208 / 164 / 29
Регистрация: 11.09.2013
Сообщений: 445
25.09.2013, 19:26
мне кажется, пахнет полиморфизмом. простите, нет сил ковырять проект, но попробуйте поискать, в каком месте может вызываться свойство родительского (вместо дочернего) экземпляра
0
0 / 0 / 0
Регистрация: 24.09.2013
Сообщений: 15
25.09.2013, 22:48  [ТС]
Хм... Да нет, вряд ли, я уже испробовал и так и так и СЯК и т.д.

Самое интересное, что в месте
C#
1
2
3
4
5
6
7
8
9
10
11
        /// <summary>
        /// Gets or sets the color used when the menu item is selected
        /// in the System.Windows.Forms.MenuStrip control.
        /// </summary>
        [Category("Style")]
        [DisplayName("MenuBorder")]
        public Color MenuBorder
        {
            get { return Properties.Settings.Default.MenuBorder; }
            set { Properties.Settings.Default.MenuBorder = value; }
        }
происходит как раз-таки присвоение цвету моего контрола нового цвета из дизайнера из основного проекта. В сеттере все правильно: цвет Red. В Properties.Settings.Default.MenuBorder тоже записывается Red. Что я сделал:
C#
1
2
3
4
5
            set
            {
                Properties.Settings.Default.MenuBorder = value;
                MessageBox.Show(Properties.Settings.Default.MenuBorder.ToString());
            }
Получил Red. Вызвал тот же МессаджБокс в конструкторе - Black.

То есть как то в Properties.Settings.Default.MenuBorder значение и сохраняется и не сохраняется одновременно.

Как это?
0
208 / 164 / 29
Регистрация: 11.09.2013
Сообщений: 445
25.09.2013, 22:57
можно код в конструкторе и код get свойства?
0
0 / 0 / 0
Регистрация: 24.09.2013
Сообщений: 15
25.09.2013, 23:14  [ТС]
Код конструктора:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
        public CustomMenuStrip()
        {
            InitializeComponent();
 
            this.RenderMode = ToolStripRenderMode.Professional;
            this.Renderer = new MyRenderer(new CustomMenuStripColorTable(), this, 
              Properties.Settings.Default.MenuBorder); // вот здесь передаю цвет в конструктор Рендерера
        }
 
        public class MyRenderer : ToolStripProfessionalRenderer
        {
            private Pen pen;
            private CustomMenuStrip topparent;
 
            public MyRenderer(ProfessionalColorTable a, CustomMenuStrip tp, Color cc) : base(a)
            {
                topparent = tp;
                pen = new Pen(сс, 1);
                MessageBox.Show(cc.ToString());
            }


Код геттера:
C#
1
2
3
4
5
6
7
        [Category("Style")]
        [DisplayName("MenuBorder")]
        public Color MenuBorder
        {
            get { return Properties.Settings.Default.MenuBorder; }
            set { Properties.Settings.Default.MenuBorder = value; }
        }
0
208 / 164 / 29
Регистрация: 11.09.2013
Сообщений: 445
25.09.2013, 23:19
значение свойства (я про get) изменяет дефолтный цвет. но объект УЖЕ СОЗДАН, и его цвет - тот, который был дефолтным ТОГДА. поэтому смена дефолтного цвета на нем не сказывается. как-то так, мне кажется

Добавлено через 3 минуты
вообще не понимаю, зачем оно все. было бы поле static - все ок. но ведь это экземпляр. поэтому геттеры-сеттеры должны менять свойства экземпляра, а не дефолты сборки. даже если проблема не в этом, все равно подход неверный
0
0 / 0 / 0
Регистрация: 24.09.2013
Сообщений: 15
25.09.2013, 23:28  [ТС]
Хмм.. Тогда подскажите пожалуйста, каков правильный подход? Static не подойдет, могут быть несколько меню разных цветов, а статик свойства будут действовать на все экземпляры....
0
208 / 164 / 29
Регистрация: 11.09.2013
Сообщений: 445
25.09.2013, 23:31
я делаю так:

C#
1
set { this._Pen.Color = value; }
и у каждого объекта свой цвет

Добавлено через 55 секунд
ну и рисовалка:

C#
1
g.DrawLine(_Pen, new Point(), new Point());
1
0 / 0 / 0
Регистрация: 24.09.2013
Сообщений: 15
06.10.2013, 21:31  [ТС]
sezada, большое спасибо за советы и помощь

Проект свой подправил.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
06.10.2013, 21:31
Помогаю со студенческими работами здесь

Ссылка на объект не указывает на экземпляр объекта при обращении к свойству tag
Доброе время суток. Объясните пожалуйста откуда сие берется..

Поведение BackColor в Button/UserControl
Знатоки помогите и разжуйте такой вот вопрос. Допустим у меня есть проект меню которого оформлено в стиле такой программы как CCleaner -...

Странное поведение вектора при многопоточном обращении
обращаюсь к другому классу из потока, чтобы поискать в векторе: gCacheAVD_mutex.lock(); std::cout &lt;&lt;...

Не понятное поведение апача на VM Linux при обращении из хостовой машины
Всем привет! Заранее прошу прощения, если пишу не по адресу, так как я пока не понимаю, к какой точнее ветке форума моя проблема...

ТВ-тюнер Авер медиа. При повторном обращении к программе она зависает
Здравствуйте,у меня проблема такова.Я купил ТВ тюнер Авер медиа,так он работает нормально,но когда подключаешь кабель программа один раз...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru