|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - Button со стилем BS_OWNERDRAW - класс для быстрого создания кнопки |
|
C/C++ - Button со стилем BS_OWNERDRAW - класс для быстрого создания кнопки
|
Старожил Сообщения: 467 |
Профиль | Отправить PM | Цитировать
Была у меня проблема создания кнопки BS_OWNERDRAW. Впринципе проблему я решил, создав для себя удобный класс. Для загрузки и отрисовки картинок использовал стороннюю либу CxImage.
Цитата pva:
ПС: это черновая версия класса для кнопки, кому будет интересно, можно будет доработать. |
||
------- Отправлено: 19:29, 29-01-2010 |
Ветеран Сообщения: 1180
|
Профиль | Отправить PM | Цитировать Вообще-то BUTTON со стилем BS_OWNERDRAW должна сама вызывать WM_DRAWITEM когда необходимо. Причём обработчик WM_DRAWITEM перерисовывает кнопку полностью (сама кнопка ничего не рисует).
______________________________________________ если будешь ваять кнопку руками: На событие нажатия ставим обработчик: case WM_LBUTONDOWN: case WM_LBUTONUP: myButtonPushed = (message==WM_LBUTONDOWN); // запомнили, что надо рисовать нажатую HDC dc = GetDC(buttonHWND); // взяли DC всего окна myButtonPaint(dc); // перерисовали ReleaseDC(buttonHWND, dc); // разрушили dc if (message==WM_LBUTONUP) myButtonOnClick(); // реагируем на событие case WM_LBUTONDOWN: case WM_LBUTONUP: myButtonPushed = (message==WM_LBUTONDOWN); InvalidateRect(buttonHWND, 0, 0); // отрисуем потом if (message==WM_LBUTONUP) myButtonOnClick(); // реагируем на событие // если myButtonOnClick() выполняется долго, кнопка долго не будет перерисовываться (выглядеть нажатой) case WM_CAPTURECHANGED: // кто-то вызвал SetCapture или ReleaseCapture myButtonPushed = false; InvalidateRect(buttonHWND, 0, 0); // отрисуем потом break; case WM_LBUTONDOWN: myButtonPushed = true; SetCapture(buttonHWND); InvalidateRect(buttonHWND, 0, 0); // отрисуем потом break; case WM_LBUTONUP: ReleaseCapture(buttonHWND); // вызовет WM_CAPTURECHANGED myButtonOnClick(); // реагируем на событие break; case WM_PAINT: // myButtonPushed = (GetCapture()==buttonHWND); ... |
Отправлено: 10:14, 30-01-2010 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Старожил Сообщения: 467
|
Профиль | Отправить PM | Цитировать Доделал класс для создания BS_OWNERDRAW кнопки, смотрим шапку темы.
|
------- Отправлено: 08:54, 28-03-2010 | #3 |
Ветеран Сообщения: 1180
|
Профиль | Отправить PM | Цитировать crashtuak, ты по ходу дела не понял, как работает BS_OWNERDRAW. Саму кнопку трогать не надо, надо дописать к тому, кто её держит обработку сообщения WM_DRAWITEM и WM_MEASUREITEM. Чтобы посчитать свой размер, кнопка шлёт хозяину сообщение WM_MEASUREITEM с параметром MEASUREITEMSTRUCT, чтобы отрисоваться - сообщение WM_DRAWITEM параметром DRAWITEMSTRUCT. Всё остальное - делает сама.
Смысл в том, что у родителя есть какие-то детальки, которые он умеет рисовать и измерять. А дальше их можно запихать в BUTTON, LISTBOX, COMBOBOX и MENU. Везде будет выглядеть красиво, кроме кнопки. У ней автоматически не отрисуюется кнопочная часть. Борландовские библиотеки субклассят все контролы, а обработку WM_*ITEM перенаправляют тому, кто его прислал (CM_*ITEM = 3000 + WM_*ITEM), в дальнейшем обёртка над кнопкой всё и отрисовывает. |
Отправлено: 15:24, 28-03-2010 | #4 |
Старожил Сообщения: 467
|
Профиль | Отправить PM | Цитировать pva, та я понял что я не понял, каким образом работает данная фича. Я просто решил не углублятся, и пошел по пути наименшего сопротивления
|
|
------- Отправлено: 22:28, 28-03-2010 | #5 |
Ветеран Сообщения: 1180
|
Профиль | Отправить PM | Цитировать тогда предлагаю ещё меньшее сопротивление: заранее загрузить PNG и отрисовать в HBITMAP, на форме сделать кнопку со стилем BS_BITMAP.
|
Отправлено: 13:19, 29-03-2010 | #6 |
Старожил Сообщения: 467
|
Профиль | Отправить PM | Цитировать pva, а полупрозрачность картинки в таком случае сохраниться?
|
------- Отправлено: 13:36, 29-03-2010 | #7 |
Ветеран Сообщения: 1180
|
Профиль | Отправить PM | Цитировать не сохранится, то и её можно отрисовать (берём фон кнопки...) А вот с красивым стилем будет облом. У меня, например, ХРюшка сразу рисует кнопку старым стилем, как только битмап ей назначишь
|
Отправлено: 19:34, 29-03-2010 | #8 |
Старожил Сообщения: 467
|
Профиль | Отправить PM | Цитировать pva, а мне надо, что б у кнопки вообще небыло фона. Ну, будет время, буду чтото думать ёще. Хотя, и так работает, и довольно быстро (на слабом ноуте проверял).
|
------- Отправлено: 21:08, 29-03-2010 | #9 |
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Red Button 3.9 | OSZone Software | Новости программного обеспечения | 0 | 21-12-2009 11:30 | |
Службы - Не работает S Button на Sony Vaio. | vadja | Microsoft Windows 2000/XP | 0 | 31-12-2008 19:05 | |
Проблема со стилем оформления после патча uxtheme.dll | Vitasphere | Microsoft Windows 2000/XP | 8 | 16-12-2006 06:34 | |
[решено] Помогите со стилем!!! | Scorpion666 | Вебмастеру | 2 | 26-06-2006 14:03 | |
Button,caption | Roman Go | Программирование и базы данных | 1 | 15-01-2003 14:12 |
|