| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > Как кнопку Button, BitBtn перекрасить? |
| Автор: Sarge big father 17.5.2003, 14:19 |
| У меня есть кнопка Button1 или BitBtn1, можно ли помянить её цвет например на синий во время выполнения программы? дело в том что присвоить кнопке BitBtn рисунок можно только перед запуском, и |
| Автор: Song 17.5.2003, 14:36 |
| >>что присвоить кнопке BitBtn рисунок можно только перед запуском Сам придумал? |
| Автор: Sarge 17.5.2003, 15:55 |
| Вернее я могу! |
| Автор: <Spawn> 17.5.2003, 16:01 |
| Класс TButton не имеет возможности смены цвета. Ето можно сделать только самому. Тобишь тебе нада создать производный класс от TButton и реализовать смену цвета )) |
| Автор: Sarge 17.5.2003, 19:28 |
| А как? |
| Автор: &-ray 17.5.2003, 20:00 |
| Можно сделать другое: вместо button использовать image и при клике менять картинку, чтобы был эффект нажатия. Там уж можно нарисовать что угодно |
| Автор: Sarge 17.5.2003, 20:24 |
| Srawn, напиши пожалуйста, а КАК создать производный класс от TButton и реализовать смену цвета. |
| Автор: <Spawn> 17.5.2003, 22:27 | ||
Я компонентов практически еще не делал, но могу показать на небольшом примерчике. Например, можно обрабатывать самому WM_PAINT (Хотя возможно существуют внутренние события компонента о которых я не знаю). Я не стал возиться, но у меня ни как не получилось заставить работать, если создать Канвас на стадии Create или CreateWnd - вылетала Access Vialetion, так что я только ради примера привожу в таком виде:
Надеюсь это тебе как то поможет |
| Автор: <Spawn> 18.5.2003, 08:54 | ||
Если хочется, чтоб кнопка отображала фокус то можно добавить это:
|
| Автор: Song 18.5.2003, 14:21 |
| Sarge, чтобы это сделать, тут весьма объёмный исходник будет. Стоит ли оно того? |
| Автор: 78125 19.5.2003, 08:32 | ||
Вот я тоже так думаю - хоть цветочки нарисуй! |
| Автор: Unregistered 19.5.2003, 10:55 |
| А почему экземпляр TCanvas создать не получилось? я специяльно попробовал, вроде нормально... |
| Автор: <Spawn> 19.5.2003, 13:41 | ||
не знаю, но у меня вылетала ошибка (пробовал на Create и на CreateWnd) |
| Автор: Unregistered 19.5.2003, 14:51 |
| Можешь даже свою BitBTn панелькой заменить у неё цвет меняеться |
| Автор: Guest_df_3 19.5.2003, 14:52 |
| Можешь даже свою BitBTn панелькой заменить у неё цвет меняеться |
| Автор: Sarge 24.5.2003, 23:26 |
| Спасибо! |
| Автор: Sarge 24.5.2003, 23:48 |
| Извини, Spawn за вопрос, а как сделать обработчик события ONCLICK? |
| Автор: <Spawn> 25.5.2003, 05:09 | ||||
Напиши прототип обработчика OnClick и присвой его обработчику етой кнопки. А можно новые компоненты устанавливать - Component>InstallComponent. Тогда он будет добавлен к компонентам и ты сможешь использовать его обработчики стандартным образом. Для прототипа обработчика делаешь, например так:
но если ты будешь пользоваться моим примером, то там надо еще добавить обработку перерисовки компонента на паре событий, а именно CM_MOUSEENTER(или как то по другому) и CM_MOUSELEAVE. |
| Автор: Medved 27.5.2003, 07:35 | ||
| Вот, взято из Кулибы: Цветная кнопка В книгах Калверта, Свана и других авторов можно найти похожий текст. Смысл текста – "Изменить цвет кнопок Button, BitBtn нельзя, т.к. их рисует WINDOWS". Если нельзя, но ОЧЕНЬ НУЖНО, то можно. Небольшой компонент ColorBtn, дает возможность использовать в кнопках цвет. Кроме того, представлено новое свойство - Frame3D, позволяющее получить более реалистичный вид нажатой кнопки. В отличие от API, при изменении значения свойства Frame3D, не требуется переоткрытие компонента.
Небольшое дополнение. Кнопку по прежнему рисует WINDOWS, а раскрашивает ее ColorBtn. Код компонента на 90% повторяет код BitBtn, ничего необычного здесь нет. Хочется повторить слова Калверта – "Пользуйтесь исходным кодом". Чаще заглядывайте в VCL - можно найти много интересного. |
| Автор: dm9 27.5.2003, 16:39 |
| Здесь есть о цветной кнопке, а также ещё много интересго http://www.symbol.ru/library/delphi_secrets/ |
| Автор: Dapo 28.5.2003, 08:59 |
| Чтобы перекрасить кнопку достаточно знать ее хендл. Код приведенный Pegas-ом, конечно полезен. Но чтобы был понятен смысл всего вышеизложенного можно вкратце написать, следующее: Чтобы закрасить контрол другим цветом нужно через его хендл получить контекст устройства - HDC (f.e. ButtonDC:=GetWindowDC(Button.Handle)). Затем создать экземпляр класса TCanvas (f.e. ButtonCanvas:=TCanvas.Create) и назначить ему полученный контекст устройства (ButtonCanvas.Handle:=ButtonDC). Теперь используем этот "настроеный" канвас для отрисовки изображения на контроле. Можно использовать и сам HDC для отрисовки API-функциями. У меня была похожая задача, только рисовать надо было на TListBox. |
| Автор: Sarge 2.6.2003, 13:44 | ||||
| А я решил всё подругому, в лоб! По ходу программы создаю TBitmap и присваиваю кнопке. Причем кнопка получается как у SPAWN без его километрового кода, и не глючит... Я очень долго мучался с краями, поэтому получился такой странный код. Смотрите код, пропишите функцию:
И её вызов, например:
параметр brd означает отступление от краёв кнопки, если поставить 0 то она просто закрасится сплошняком, я использую 2. И заметьте, что ведь у меня (пока) самый простой и эффективный способ!!! |
| Автор: Unregistered 2.6.2003, 14:04 |
| Sarge, я не понял как у тебя будут обрабатываться клики на кнопке (в предидущик примерах это есть). |
| Автор: Sarge 2.6.2003, 14:17 | ||||
| Это был код общего применения. А этот заточен под кнопку TBitBtn:
И используется так:
|
| Автор: Sarge 2.6.2003, 14:21 |
| Unregistered, клики обрабатываются стандартным образом, потому что кнопка создаётся сатически. Просто кидаешь на форму BitBtn Создаёшь обработчик события OnClick... Понял? |
| Автор: Sarge 2.6.2003, 15:11 |
| А хотя нет... Моя кнопка работает только без Caption... Может быть кто-нибудь знает как сделать Caption? Просто я рачитывал, что текст можно поместить поверх рисунка, а насамом деле только слева, справа, сверху, или снизу... Обломчик, хотя... может быть кому то нужна пустая кнопка... |
| Автор: Song 2.6.2003, 17:04 |
| А что за проблема текст вывести? |
| Автор: <Spawn> 2.6.2003, 17:07 | ||
TextOut()? |
| Автор: Dapo 3.6.2003, 06:49 |
| Sarge извини конечно, но твой код по моему не имеет смысла...т.е. он может и работает (не смотрел), но для чего так делать? Ставить на форму TBitButton только для для того чтобы получить его рект и наложить на него битмап? Тебе же сказали, если тебе нужен такой подход - целесообразней использовать TImage. И в зависимости от состояния подгружай в него картинки (например из TImageList), а еще лучше наследника от него (TImage) сделать и добавить св-ва на разные состояния. Хотя тут вариантов много. PS Я хочу сказать, что твой код - не ответ на поставленный тобой вопрос. |
| Автор: Dapo 3.6.2003, 07:39 |
| Да, а как на счет TButton? Чтобы не быть голословным - вот что-то приблизительное, то о чем я писал уже: procedure ChgClr(Sender:TButtonControl;clr,capclr:TColor;Caption:string); var DC:HDC;//контекст устройства Cnvs:TCanvas; begin Cnvs:=TCanvas.Create; DC:=GetWindowDC(Sender.Handle); Cnvs.Handle:=DC; Cnvs.Brush.Color:=clr; Cnvs.Font.Color:=capclr; Cnvs.FillRect(Sender.ClientRect); Cnvs.TextRect(Sender.ClientRect,0,0,Caption); ReleaseDC(Sender.Handle,dc); Cnvs.Free; end; |
| Автор: Unregistered 3.6.2003, 08:35 |
| Dapo Совершенно справедливо! Но на практике наверное не очень удобно каждый раз на WM_PAINT создавать и убивать Cnvs... лучше сделать его пропертью. Но не ужели нет варианта каким-нибудь образом попытаться заставить windows отрисовывать кнопку др. цветом? Возможно ли на время отрисовки TButton изменить значение BtnFaсe например?... Мне кажется что вопрос был задан именно в этом направление. |
| Автор: Sarge 3.6.2003, 13:53 | ||||
| Я не сдамся!!! Отвечаю, кнопка как живая, потому что я отступаю от краёв, если не отступать, то получится просто не живой цветной прямоугольник, а тут именно кнопка, зацените. Вот готовый код. Caption работает!!! Всё готово!!!
Всё теперь всё работает, кнопка просто кидается на форму, после Implementation прописываем этот код (сверху), И теперь когда надо перекрасить просто вызываем эту процедеру:
и кнопка перекрашиваеися в указаный цвет. Если надо создать уже "накрашенную" пихаем запуск процедуры в OnCreate; Просто сделайте как я говорю, и все будет чики-пуки! |
| Автор: Dapo 4.6.2003, 06:30 |
| >>frag.Glyph:=bmp;//используешь св-во Glyph Так что на счет TButton? |
| Автор: Dapo 4.6.2003, 06:34 | ||
Конечно лучше! :-) Возвращаемся к коду Pegas-a (создание собственного компонента). Расширяем? |
| Автор: Pasha 4.6.2003, 06:46 |
| Button- никак не перекрасишь она использует цвета Windows, а другую BitBtn.Color если не ошибаюсь. |
| Автор: Unregistered 4.6.2003, 08:35 |
| Dapo так я же говорю, что если во время WM_PAINT изменить системную константу BtnFace, кажеться так она называется, интересно что получиться... ща просто занят немного, освобожусь попробую... |
| Автор: Medved 4.6.2003, 10:32 | ||
Прежде чем ввязываться в дисскуссию, читайте пожалуйста темы с самого начала, |
| Автор: Sarge 11.6.2003, 12:35 |
| Странно, кажется идеи закончились, и каждый остался при своём мнении... |
| Автор: Чoо 6.8.2010, 18:06 | ||||||||||||
Закрасил так же кнопочку. Единственное, хотел бы обратить внимание на
Лучше bmp объявить сразу после implementation
Само создание сделать так:
так как необязательно его создавать каждый раз заново ну и не забывать его освобождать, например по событию формы дестрой:
а то утечки будут. Если я заблуждаюсь, подправьте меня, пожалуйста. Добавлено @ 18:07 пы сы: темка старая, но до сих пор актуальная |
| Автор: bems 7.8.2010, 11:14 |
| Чoо, нет, за 7 лет ему ужн точно не надо. Не делай так больше. |
| Автор: Чoо 7.8.2010, 11:48 |
| bems, я тему апнул не просто что бы апнуть или посоветовать что-то автору. Просто решил, что, поскольку я так же закрашиваю кнопки, кто-то и еще может воспользоваться примером, написанным выше. Поэтому написал пару замечаний на счет утечек. И у самого же возник вопрос: так ли опасны эти утечки, что стоит им уделять внимание, и освобождаются ли ресурсы, если уничтожается дочерняя форма, которая заняла эти ресурсы (создала bmp.create)? вобщем тему поднял только из добрых побуждений. |