Skip to content

YevGenerator/WinformPaintedControls

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

6 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

WinformPaintedControls

Мета

Оновити візуальний вигляда елементів Winforms. Для цього потрібно додати можливість:

  • Змінювати колір границі елемента.
  • Змінювати товщину границі елемента
  • Змінювати колір всього елемента в залежності від його стану

Стандартні елементи не підтримують зміну кольору границі чи його товщину (окрім Button). Деякі з них також не мають можливості легкої зміни кольору внутріншніх елементів (наприклад ListBox, TreeView). Деякі є самі по собі складними і не мають можливості прямої зміни (ComboBox). Тому вирішено створити набір Controls, що замінюють їх і дозволяють самостійно задавати кольори/зовнішній вигляд.

Було створено:

Основа

За основу взята та ідея, що при взаємодії з елементами форми вони переходять у деякі стани. Ці стани можна позначати кольором.

Для визначення станів є статичний клас ColorStates (замість нього можна було використати enum, але для уникання конвертацій вирішено використовувати статичні константи), де зберігають значення Default, Press, Hover, Check.

Для обробки є контейнери ColorContainers, що мають певні кольори для кожного стану і поточний стан, за яким видається поточний колір. Є контейнери, що використовують два стани, три або усі чотири. Для кожного контролу використовуєть по два контейнера (один - для кольору тексту і границі, другий - для фарбування тла).

Для використання даних контейнерів у дизайнері в Visual Studio є класи ColorStateConverter.

Всі Custom-контроли є наслідниками BorderControl. Це клас, що наслідується від Control і має композитно основний елемент, що відображається. BorderControl виступає батьком і малює на собі границю, дочірній елемент розташований в межах границі. Такий підхід дозволяє

  1. Малювати границю всередині елемента. Тобто, границя виступає частиною даного елемента, що дозволяє зручно маніпулювати положеннями і розмірами елемента.

  2. Тримати основний елемент в межах границі. Його розміри чітко визначені і не можуть бути перекриті границею. Вони не заважають один одному. (Для Panel це особливо важливо, бо у випадку, коли дочірній елемент виходить за межі Panel, то візуально "малюється під границею". Інші випробувані мної підходи дають ефект малювання над границею).

Мінусом даного підходу є те, що багато важливих властивостей залишаються у основного дочірнього елемента, і доступ до них є дещо ускладненим. Основні події також приймає саме цей елемент. Тому у коді для багатьох класів є властивість, що відповідає основному елементу (наприклад, List для класу ListBox), що дозволяє отримати необхідні події/властивості/методи. Іноді властивості самого класу перевизначені або розкриті для використання методів дочірнього елементу.

Користувацькі форми

CustomButton

Унаслідуваний від BorderControl, має елемент Label. Передбачено кольори Default, Hover, Press для тла і границі. Колір границі і тексту збігаються. При натисканні запускає подію OnClick. Інші події для прив'язки не дієві. Текст завжди по центру.

Файл буде дописано...

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages