| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Общие вопросы по .NET и C# > Как сделать производный класс для кнопки ? |
| Автор: mr.DUDA 4.2.2004, 21:56 | ||
| Создаю проект UserControl, переписываю класс контрола таким образом, как показано ниже, компилирую и получаю сборку (DLL), добавляю полученную супер-кнопку в другой проект (Add Reference..., перетягиваю супер-кнопку "CFadeButton control" из тулбокса на форму), и компилирую проект ----- почему ВСЕ свойства кнопки сразу после запуска программы кривые (цвет - чёрный, Caption - "cFadeButton" и т.п.) ? Тоже самое (цвет чёрный) - на форме в Design View. Помогите !!!
|
| Автор: Albinos 5.2.2004, 03:30 | ||||||||
Не знаю. Я делал вот так:
Скорее всего тебя интересует внешний вид кнопки:
А для того, чтобы прорисовка не была заметна - включаем двойную буферизацию:
Можно программировать видимость свойств и общее поведение контрола в дезайнере и редакторе:
Ну в общем и т.д. В MSDN в принципе про это написано, но искать будешь долго ... |
| Автор: Albinos 5.2.2004, 03:32 | ||||
|
| Автор: Albinos 5.2.2004, 03:33 |
| Блин, а здесь отработала |
| Автор: mr.DUDA 6.2.2004, 13:55 | ||
Не катит - компилер ругается, что нужно реализовать методы интерфейса IButtonControl (NotifyDefault, PerformClick, DialogResult). И раз мы берём базовый класс System.Windows.Forms.Control - то получается, что весь контрол нужно организовать с нуля ? А в моём примере класс порождается уже из готовой кнопки, я лишь добавил функциональности для "подсветки" кнопки при наведении мыши. Или так делать нельзя (напрямую производить от System.Windows.Forms.Button) ? |
| Автор: Guest 7.2.2004, 12:22 | ||||
| Короче, если все еще проблемка осталась, вот тебе ее решение.. Я надеюсь. Я тут написал два почти одинаковых файла, но они реализуют немножко разный подход. Здесь я не стал выносить описание собственного контрола (приятно звучит Из примеров следует, что от Button МОЖНО наследоваться. Причем без проблем. Чем отличаются файлы? 1-й (ButtonSon.cs) ПЕРЕГРУЖАЕТ функции OnMouseEnter, OnMouseLeave, к-е, если не ошибаюсь, определены в базовом классе Control. 2-й (ButtonSon1.cs) НАВЕШИВЕТ СОБЫТИЯ OnMouseEnter, OnMouseLeave. Ты можешь откомпилить оба файла и посмотреть, что получится - подсвеченный контрол. А различие подходов 1-го и 2-го файла, что от 2-й версии проблемнее наследоваться - я имею ввиду, там навешивание событий происходит в конструкторе - если ты в потомке от собственного контрола (может ведь такое быть?) явно не вызовешь конструктор родителя - все - обработчики потеряны. Первый способ, как мне кажется, лучше. Мы просто перегрузили методы. Соответственно, наследоваться будут уже новые обработчики -> с наследниками все в порядке! ClientSon:
ClientSon1:
|
| Автор: Kurt 7.2.2004, 12:24 |
| Guest - это я! Просто почему-то забыл залогиниться.. |
| Автор: Albinos 8.2.2004, 03:27 | ||||||
Разумеется. Если залезть в MSDN и посмотреть, то Button именно так и определяется. Я тебе не все дал, а только наметки. Необходио реализовать интерфйс IButtonControl (если в редакоре начать писать SUPERButton: Control, IButtonControl, то VS предложить добавить реализацию интерфейса IButtonControl в твой класс. По нажатию TAB`а. Дальше реализовывать надо самому, т.е. приватные переменные и т.д. и т.п.).
Наследовать конечно можно. Меня интересовало написание своих контролов с нуля, поэтому пошел по такому пути. Подсветку кнопки реализовывал как описывает Kurt (имею ввиду добавление обработчика на MouseHover). Ну и остальной функционал так же. А вообще - привожу полный код (возможно, кривой, т.к. времени на прорботку было мало.)
|
| Автор: Kurt 8.2.2004, 04:43 | ||
А я наоборот - считал, что необходимо именно наследование от Button'a, как спрашивал mr.DUDA. |
| Автор: mr.DUDA 8.2.2004, 12:53 |
| Albinos, круто ! (оффтоп) А все эти #region-ы, комментарии и теги сам вручную вставляешь, или есть какая кнопка/фича в VS ? Или это делает Visual Assist.NET Kurt, спасибо за пример. Я нашёл свой способ как обойти "черноту" кнопки - дизайнер форм заполняет все свойства объекта значениями, указанными в конструкторе. В том числе и CurrStep. А так как при этом дизайнер не создаёт поток Thread, но зато выполняет CurrStep.set, то значение this.BackColor = m_ColorCurrent, который равен неизвестно чему. |
| Автор: Albinos 11.2.2004, 02:33 |
| mr.DUDA, #region-ы сам вставляю (кстати, очень удобная штука - при сохранении файла и последующем открытии сохраняют свое состояние свернутости\развернутости), хотя наверняка возможно вставлять их как-то еще. А вот комментарии и теги вставляются автоматически, если набрать /// . |