Re[10]: BS_OWNERDRAW и DrawState
От: Carc Россия https://vk.com/gosha_mazov
Дата: 30.06.17 15:56
Оценка:
C>>И как тогда быть?!?! В общем, в своих случаях я делал иначе: Субкласс\ИлиСуперКласс кнопки + перехват WM_PAINT + отрисовка по умолчанию, а уж затем свои раскраски добавлять.

CEM>По-хорошему, надо делать разбор ситуации. Я у себя проверял версию винды, плюс включены-выключены стили, и в зависимости от этого рисовал что-то своё в каждом случае.

CEM>Конкретно сабкласс кнопки на 7+dwm приведёт к тому, что при наведении мышки винда будет пытаться рисовать свою анимацию, а сабкласс будет ловить события WM_PAINT после анимации и рисовать своё — в случае или своего бака или бака у иконки будет мельтешение в кнопке.

CEM>По теме: я бы открыл картинку в редакторе и сделал 32-битную с альфой, потом BM_SETIMAGE (я так всегда делаю)

У меня там простенькая графика. Вроде стрелки влево\вниз где-нить на кнопочке. Городить из-за этого ресурс в каждом проекте, чтобы только его нарисовать на кнопке смысла мало. А так все банально: отрисовались по дефолту, а потом исключительно в клиентской области дорисовывается эта стрелочка. В общем, у меня там бликерить просто нечему. Разве что это ручками нарисованная стрелка "живая" — реагирует когда мыша над ней, и когда уходит.

Короче говоря, простенькая такая приблуда, чтобы сделать кнопку в стиле "Кнопка + Доп. варианты" (щелкнули по стрелке, какой-то как правило выбор предоставляется: менюшка там аль еще какая ересь). Делов-то минут на 30 со всеми красотами и проверками. А главное, никаких внешних (для кода кнопки) ресурсов. Вещь полностью в себе. Соответственно, и проверять нечего кочуя из проекта в проект. Разве что все руки не дойдут на переписать в WinAPI-like стиле, чтобы не поддерживать несколько версий (WTL, MFC и прочия).
Aml Pages Home
Re[11]: BS_OWNERDRAW и DrawState
От: Alexander G Украина  
Дата: 30.06.17 16:10
Оценка:
Здравствуйте, Carc, Вы писали:

C>Короче говоря, простенькая такая приблуда, чтобы сделать кнопку в стиле "Кнопка + Доп. варианты" (щелкнули по стрелке, какой-то как правило выбор предоставляется: менюшка там аль еще какая ересь).


BS_SPLITBUTTON, что ли? А зачем её самому рисовать?
Русский военный корабль идёт ко дну!
Re[5]: BS_OWNERDRAW и DrawState
От: Alexander G Украина  
Дата: 30.06.17 16:15
Оценка:
Здравствуйте, Vaynamond, Вы писали:

V>P.S.: Сейчас попробовал, облом: выводит картинку вместе с фоном (как и DrawState)


Если в остальном устраивает, то картинку можно перегнать в битмап с альфаканалом или иконку с альфаканалом перед передачей туда.
Всяко лучше без своего рисования, чем с ним.
Русский военный корабль идёт ко дну!
Re[12]: BS_OWNERDRAW и DrawState
От: Carc Россия https://vk.com/gosha_mazov
Дата: 30.06.17 16:33
Оценка: +1
Здравствуйте, Alexander G, Вы писали:

AG>BS_SPLITBUTTON, что ли? А зачем её самому рисовать?

Угу, она самая. Но насколько я помню, BS_SPLITBUTTON поддерживается начиная с Висты. В ХП это не сработает. У меня эксперименты ручками именно в ХП ничего не дали в свое время.
Так что пришлось сделать ручками.

PS хозяйке на заметку: неспроста между прочим Microsoft почесала репу и после последних событий выпустила секурные патчи и для ХП тоже.
Это к вопросу, кто сидит на ХП. Не думаю, что они о хомячках заботились…
Aml Pages Home
Re[6]: BS_OWNERDRAW и DrawState
От: Vaynamond Россия  
Дата: 30.06.17 17:40
Оценка:
Здравствуйте, Alexander G, Вы писали:

AG>Здравствуйте, Vaynamond, Вы писали:


V>>P.S.: Сейчас попробовал, облом: выводит картинку вместе с фоном (как и DrawState)


AG>Если в остальном устраивает, то картинку можно перегнать в битмап с альфаканалом или иконку с альфаканалом перед передачей туда.

AG>Всяко лучше без своего рисования, чем с ним.

Я немного выше написал уже, что выкрутился через ImageList. Добавляю туда BMP-шку с маской RGB(255, 0, 255), а в WM_DRAWITEM дергаю
ImageList_GetIcon(..., ILD_TRANSPARENT) и скармливаю полученный хендл функции DrawState. В итоге корректно выводится
и штатная картинка, и задизейбленая.
Re[11]: BS_OWNERDRAW и DrawState
От: CEMb  
Дата: 03.07.17 03:19
Оценка: 8 (1)
Здравствуйте, Carc, Вы писали:



C>>>И как тогда быть?!?! В общем, в своих случаях я делал иначе: Субкласс\ИлиСуперКласс кнопки + перехват WM_PAINT + отрисовка по умолчанию, а уж затем свои раскраски добавлять.


  Скрытый текст
CEM>>По-хорошему, надо делать разбор ситуации. Я у себя проверял версию винды, плюс включены-выключены стили, и в зависимости от этого рисовал что-то своё в каждом случае.
CEM>>Конкретно сабкласс кнопки на 7+dwm приведёт к тому, что при наведении мышки винда будет пытаться рисовать свою анимацию, а сабкласс будет ловить события WM_PAINT после анимации и рисовать своё — в случае или своего бака или бака у иконки будет мельтешение в кнопке.

CEM>>По теме: я бы открыл картинку в редакторе и сделал 32-битную с альфой, потом BM_SETIMAGE (я так всегда делаю)
C>У меня там простенькая графика. Вроде стрелки влево\вниз где-нить на кнопочке. Городить из-за этого ресурс в каждом проекте, чтобы только его нарисовать на кнопке смысла мало. А так все банально: отрисовались по дефолту, а потом исключительно в клиентской области дорисовывается эта стрелочка. В общем, у меня там бликерить просто нечему. Разве что это ручками нарисованная стрелка "живая" — реагирует когда мыша над ней, и когда уходит.

Не, секунду. Если у тебя просто кнопка, и ты в WM_PAINT туда что-то рисуешь, при этом Aero включен, то будет следующее:
— когда мышь попадает в область кнопки, кнопка начинает "наполняться" синеньким (по таймеру). В этот момент в кнопку летит несколько WM_PAINT-ов без стирания/заливки бакграунда. Если у тебя стрелка без антиалайзинга — всё ок, ничего заметно не будет. А вот в случае альфы, это сразу станет видно Альфа на альфу накладывается. Вот если с этим начать бороться через затирание/перерисовку бака — начнёт слетать синева. Точнее бликать будет.
И если у тебя кнопка, то ты точно должен был ещё наступить на WinAPI-грабли про всякие нажатия кнопки с клавиатуры/мыши, EnableWindow и ещё что-то было, не помню — все эти вещи в user32.dll идут напрямую в Draw-фукцию кнопки, не используя wm_paint. Природа этих граблей в оптимизации, но это доставило кучу хлопот скиннерам Ну, мне, по крайней мере Знаю людей(чёртовы stardock-и), которые как-то умудрялись находить адрес внутренней функции перерисовки и делать перехват именно её. Хотя эта xxxDraw наружу никак не торчит. Я в таких случаях писал примитивный ИИ, который разбирал асм-овый код, искал адрес вызываемой функции в коде и переписывал её. Но, блин, это очень неправильно и рискованно. А как делали эти гады, даже не знаю железно прошивать нельзя, на версию винды/сервиспака затачиваться нельзя, а версий dll-ки может быть несколько, и выйти новая с новыми адресами может в любой момент, и тогда софту капец...

C>Короче говоря, простенькая такая приблуда, чтобы сделать кнопку в стиле "Кнопка + Доп. варианты" (щелкнули по стрелке, какой-то как правило выбор предоставляется: менюшка там аль еще какая ересь). Делов-то минут на 30 со всеми красотами и проверками. А главное, никаких внешних (для кода кнопки) ресурсов. Вещь полностью в себе. Соответственно, и проверять нечего кочуя из проекта в проект. Разве что все руки не дойдут на переписать в WinAPI-like стиле, чтобы не поддерживать несколько версий (WTL, MFC и прочия).


А стрелку ты как рисовал? А разделитель?
Re[9]: BS_OWNERDRAW и DrawState
От: CEMb  
Дата: 03.07.17 03:21
Оценка:
Здравствуйте, Vaynamond, Вы писали:

V>>>Я за основу брал пример из CodeGuru, так там еще более замороченный алгоритм: если кнопка нажата, она рисуется

V>>>с помощью FrameRect, а в остальных случаях — через DrawFrameControl.

V>На исходнике декабрь 2002.


Ааа... это потому что ещё семёрки не было в природе
Re[12]: BS_OWNERDRAW и DrawState
От: Carc Россия https://vk.com/gosha_mazov
Дата: 10.07.17 17:13
Оценка:
Здравствуйте, CEMb, Вы писали:

CEM>Здравствуйте, Carc, Вы писали:



CEM>А стрелку ты как рисовал? А разделитель?

Ну вот скриншотец от такой кнопки.
Кнопка внизу диалога "Справка" именно с этой стрелкой. При клике по кнопке действие по умолчанию, при клике по стрелке меню с вариантами.

А рисовал просто: банальный треугольник стилизованный тенями на границах, и получается типа вдавленный. Соответственно, на лету в WM_PAINT, после дефолта, создали перья с нужными цветами и отрисовались.
  Скриншот
Aml Pages Home
Re[13]: BS_OWNERDRAW и DrawState
От: Aniskin  
Дата: 10.07.17 23:34
Оценка:
Здравствуйте, Carc, Вы писали:

C>А рисовал просто


Можно просто на Vista+ использовать нативный BS_SPLITBUTTON, а на XP самоделку. Это imho было бы более user-friendly. И (как вариант) в качестве стрелки можно использовать битмап, получаемый через LoadBitmap(0, OBM_COMBO).

Я в аналогичной ситуации сделал проще — в Vista+ использую BS_SPLITBUTTON, а на XP забиваю. Но у меня правый щелчок мыши равнозначен нажатию на доп стрелку, поэтому и пользователи XP тоже имеют доступ к появляющемуся меню.
Re[14]: BS_OWNERDRAW и DrawState
От: Carc Россия https://vk.com/gosha_mazov
Дата: 13.07.17 19:34
Оценка:
Здравствуйте, Aniskin, Вы писали:

A>Здравствуйте, Carc, Вы писали:


C>>А рисовал просто


A>Можно просто на Vista+ использовать нативный BS_SPLITBUTTON, а на XP самоделку. Это imho было бы более user-friendly.

Но это нарушение правила ODR… Если ружье висит на стене, то в каком-нить акте оно все-таки выстрелит. Я в том смысле, что рано или поздно две разных ветки кода рассинхронятся. И одна будет вести так, а другая эдак. И пойдут малопонятные проблемы и жалобы от юзеров. Причем проблема будет во внешнем коде: т.к. обрабатывать BS_SPLITBUTTON будет внешний код, на котором оно висит. В моем случае всё однозначно. Куда кликнули решает только мой код (мимо стрелки, или по стрелке) — а внешний код только отвечает за реакцию на это.
Мухи — отдельно, котлеты отдельно.

A>И (как вариант) в качестве стрелки можно использовать битмап, получаемый через LoadBitmap(0, OBM_COMBO).

Угусь, а завтра очередной индус поменяет в какой-нить винде этот самый битмап, и что мы получим на выходе? Какую красоту? Кто его знает? Причем узнаем мы об этом сильно позже других. На кой закладываться на это!?! Не проще ли ручками отрисоваться на HDC? Кто мешает? И, заметьте Ватсон, вся отрисовка полностью под нашим контролем. Всегда. Везде.

A>Я в аналогичной ситуации сделал проще — в Vista+ использую BS_SPLITBUTTON, а на XP забиваю. Но у меня правый щелчок мыши равнозначен нажатию на доп стрелку, поэтому и пользователи XP тоже имеют доступ к появляющемуся меню.

Та я в принципе не против и забить. Но вот какое дело… Только из-за этой штучки-дрючки сделать софт неработоспособным на ХП? Стоит ли?
Пользователи они знаете какие? Вы забили на ХП, а они на ваш софт.
Aml Pages Home
Re[13]: BS_OWNERDRAW и DrawState
От: CEMb  
Дата: 14.07.17 02:49
Оценка:
Здравствуйте, Carc, Вы писали:

CEM>>А стрелку ты как рисовал? А разделитель?

C>Ну вот скриншотец от такой кнопки.

Ну вот, там нет альфы, поэтому всё ок
А меня постоянно тянет на красоту, поэтому у меня кнопки со всякими градиентами, интерактивным контентом, альфой и комплексными тенями.

Позанудствую.
Стрелка "дополнительно" в последних всех операционках чёрненькая и направлена вниз. Я вот слегка задумался над смыслом белой стрелки вправо
Re[14]: BS_OWNERDRAW и DrawState
От: Carc Россия https://vk.com/gosha_mazov
Дата: 14.07.17 13:12
Оценка:
Здравствуйте, CEMb, Вы писали:

CEM>Здравствуйте, Carc, Вы писали:


CEM>>>А стрелку ты как рисовал? А разделитель?

C>>Ну вот скриншотец от такой кнопки.

CEM>Ну вот, там нет альфы, поэтому всё ок

CEM>А меня постоянно тянет на красоту, поэтому у меня кнопки со всякими градиентами, интерактивным контентом, альфой и комплексными тенями.
Не уловил, а откуда такая красота? Если это твои битмапки там отрисованы, то что опять же мешает? Раз все равно своё, то можно дорисовать что надо. Разве не так?
Я ж говорил несколько суть о другом. Мне нужен был механизм Customization, т.е. что бы всё по дефолту и всё делает система, а я только до делываю, до рисовываю (свою стрелку).
Причем чтобы не переделывать по 100 раз, вся отрисовка вещь в себе. Чтобы из проекта в проект таскать просто добавлением модуля и только. Никаких внешних ресурсов.



CEM>Позанудствую.

CEM>Стрелка "дополнительно" в последних всех операционках чёрненькая и направлена вниз. Я вот слегка задумался над смыслом белой стрелки вправо
  1. Ну в данном случае “вправо” только потому, что у меня там меню справа будет, а не снизу.
  2. Отрисовка, как говорил, полностью вещь в себе и alliclusuve. Понадобится, добавить еще варианты отрисовки дело 10 минут (код отрисовки локализован до пары функций).
Aml Pages Home
Re[15]: BS_OWNERDRAW и DrawState
От: CEMb  
Дата: 17.07.17 04:11
Оценка:
Здравствуйте, Carc, Вы писали:

CEM>>Ну вот, там нет альфы, поэтому всё ок

CEM>>А меня постоянно тянет на красоту, поэтому у меня кнопки со всякими градиентами, интерактивным контентом, альфой и комплексными тенями.
C>Не уловил, а откуда такая красота? Если это твои битмапки там отрисованы, то что опять же мешает? Раз все равно своё, то можно дорисовать что надо. Разве не так?
Мешает там родное рисование кнопки. Тень — полупрозрачная. Т.е. если при первом проходе, нарисует 10% от чёрного, на втором 20%... в результате тень будет просто чёрная.
Там не совсем просто битмапки, там многослойная штука: 2 тени, интерактивный контент (оно движется), 2 бевела. Всё рисуется по-разному, в зависимости от положения и состояния мыши. Но это уже оффтоп.
C>Я ж говорил несколько суть о другом. Мне нужен был механизм Customization, т.е. что бы всё по дефолту и всё делает система, а я только до делываю, до рисовываю (свою стрелку).
C>Причем чтобы не переделывать по 100 раз, вся отрисовка вещь в себе. Чтобы из проекта в проект таскать просто добавлением модуля и только. Никаких внешних ресурсов.
Да, всё верно, я только хотел сказать про альфу, вон там выше "там нет альфы"
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.