Рамки в Progress Bar при отключенных Visual Styles
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 15.04.23 14:10
Оценка:
PBM_SETBARCOLOR, как известно, не работает, если Visual Styles включены для его окна (а они включены по умолчанию еще с XP). Чтобы менять цвет индикатора, не портя вида остальных элементов, можно отключить стили только для окна индикатора через SetWindowTheme. После этого цвет устанавливается, но у индикатора напрочь пропадает рамка. В ресурсах у него стоит WS_BORDER, но после вызова SetWindowTheme он пропадает. Добавление через SetWindowLong не помогает — флаг устанавливается, но вид элемента не меняется. Пробовал также
WS_EX_CLIENTEDGE, WS_EX_STATICEDGE и WS_EX_WINDOWEDGE в разных сочетаниях — бесполезно. Если у индикатора нулевая позиция — его вообще не видно в диалоге.

Это как-то можно победить, кроме как вручную рисовать рамку, или вообще весь индикатор?
Re: Рамки в Progress Bar при отключенных Visual Styles
От: Carc Россия http://www.amlpages.com/home.php
Дата: 30.04.23 17:49
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>PBM_SETBARCOLOR, как известно, не работает, если Visual Styles включены для его окна (а они включены по умолчанию еще с XP).

Может проще будет использовать Custom Draw для прогресс-бара?
Aml Pages Home
Re[2]: Рамки в Progress Bar при отключенных Visual Styles
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 30.04.23 18:04
Оценка:
Здравствуйте, Carc, Вы писали:

C>Может проще будет использовать Custom Draw для прогресс-бара?


Считаете, что, если нет возможности просто включить рисование рамки, то рисовать вручную весь progress bar будет проще, чем нарисовать вручную только рамку вокруг стандартного?
Re[3]: Рамки в Progress Bar при отключенных Visual Styles
От: Carc Россия http://www.amlpages.com/home.php
Дата: 30.04.23 18:12
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:


ЕМ>Считаете, что, если нет возможности просто включить рисование рамки, то рисовать вручную весь progress bar будет проще, чем нарисовать вручную только рамку вокруг стандартного?

Зачем весь?
Я просто предложил направление размышлений.
Обычно в Custom Draw можно поменять цвета, дальше всё делается само собой.
Хотя именно для прогресс-бара я CustomDraw не ковырял... Как-то не приходилось (достаточно было текста поверх самого индикатора).
Aml Pages Home
Re[4]: Рамки в Progress Bar при отключенных Visual Styles
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 30.04.23 18:42
Оценка:
Здравствуйте, Carc, Вы писали:

C>именно для прогресс-бара я CustomDraw не ковырял...


Оно вообще существует? Нигде не видел, чтоб такая возможность оговаривалась.

C>достаточно было текста поверх самого индикатора


MS полагает, что так делать не стоит.
Re[5]: Рамки в Progress Bar при отключенных Visual Styles
От: Carc Россия http://www.amlpages.com/home.php
Дата: 30.04.23 20:38
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

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


C>>именно для прогресс-бара я CustomDraw не ковырял...


ЕМ>Оно вообще существует? Нигде не видел, чтоб такая возможность оговаривалась.

Похоже, я погорячился. Судя по доке для прогресс-бара нет CustomDraw.
Но с другой стороны сто лет в обед не было и для Button, а потом всё ж приделали nm-customdraw-button. Так что я б перепроверил на всяк случай, а то почти все Common Controls поддерживают CustomDraw, а прогресс-бар с какого-то вдруг нет... Странно это.

C>>достаточно было текста поверх самого индикатора


ЕМ>MS полагает, что так делать не стоит.

Не уловил намека. Что именно там не рекомендуется?
Aml Pages Home
Re[6]: Рамки в Progress Bar при отключенных Visual Styles
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 01.05.23 08:56
Оценка: 6 (1)
Здравствуйте, Carc, Вы писали:

C>Но с другой стороны сто лет в обед не было и для Button, а потом всё ж приделали nm-customdraw-button. Так что я б перепроверил на всяк случай, а то почти все Common Controls поддерживают CustomDraw, а прогресс-бар с какого-то вдруг нет...


Ну, для Button они сделали в XP — считай, через пять лет после успешного старта Win 95. Если уж за следующие двадцать не анонсировали для progress bar... По крайней мере, новых структур *CUSTOMDRAW в commctrl.h не появилось.

C>Что именно там не рекомендуется?


Don't put the percentage complete or any other text on a progress bar. Such text isn't accessible and isn't compatible with using themes.

Re[7]: Рамки в Progress Bar при отключенных Visual Styles
От: Carc Россия http://www.amlpages.com/home.php
Дата: 01.05.23 09:34
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

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


C>>Но с другой стороны сто лет в обед не было и для Button, а потом всё ж приделали nm-customdraw-button. Так что я б перепроверил на всяк случай, а то почти все Common Controls поддерживают CustomDraw, а прогресс-бар с какого-то вдруг нет...


ЕМ>Ну, для Button они сделали в XP — считай, через пять лет после успешного старта Win 95. Если уж за следующие двадцать не анонсировали для progress bar... По крайней мере, новых структур *CUSTOMDRAW в commctrl.h не появилось.


А там не обязательно должны появиться новые структуры... Для прогресс-бара может использоваться и простая изначальная NMCUSTOMDRAW. Ну, а там уже обычные же танцы с бубном ::SetTextColor/::SetBackColor(NMCUSTOMDRAW::hdc, ...).

Плюс опыт + дока показывают, что CDRF_NEWFONT рекомендуется возвращать не только когда меняем шрифт, но и если только цвета. Не помню что за контрол был, и уж тем паче версии Винды (точно какое-то старье, чуть ли не 2000-ая) — дык вот при возвращаемом значении CDRF_NEWFONT, всё работало. Без него нет.

Проще говоря, стоит поэкспериментировать.
Многие вещи совсем не очевидны.
Как в соседнем посте про сброс тултипа+виртуальный ListView+LVM_DELETEALLITEMS. Кто б мог подумать!
В доке про LVM_DELETEALLITEMS о таком эффекте ни слова. Ничего хотя бы любопытного нигде не нашлось, ни в MSDN, на на SO/CodeProject/Codeguru etc.
Надо пробовать...
Aml Pages Home
Отредактировано 01.05.2023 9:36 Carc . Предыдущая версия .
Re[7]: Рамки в Progress Bar при отключенных Visual Styles
От: Carc Россия http://www.amlpages.com/home.php
Дата: 01.05.23 14:11
Оценка: +1
Здравствуйте, Евгений Музыченко, Вы писали:


C>>Что именно там не рекомендуется?


ЕМ>

ЕМ>Don't put the percentage complete or any other text on a progress bar. Such text isn't accessible and isn't compatible with using themes.

Ах вот они про что... Спасибо за инфу.
Только одно непонятно, с гуёв ли ему быть несовместимым именно с темами? Чего криминального-то!?!
И потом, частенько без подобного текста просто никуда. Нужно и текст (что делается), и проценты (сколько сделано).... И UI запросто бывает, что разместить их больше некуда.

PS: А вообще Microsoft мастер прасирадь (С) пространство на экране впустую.

Пример навскидку: разделитель в меню. Линия и всё тут. И боле нифига. Религия не позволяет.
А тем не менее поверх линии можно кратенький и текст отрисовать. Пользователю более чем наглядно. Не только отделяем группы меню визуально, но позволяет еще и указать, что именно отделяет разделитель.
Казалось бы, чо_там_делать_то!?! (C) MENUITEMINFO позволяет. И совместимость спокойно сохранится.
Ан хрен вам, девелоперз! Танцы-бубните сами со всяким OwnerDraw.
Aml Pages Home
Re: Рамки в Progress Bar при отключенных Visual Styles
От: qaz77  
Дата: 04.05.23 15:06
Оценка: 1 (1)
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>Это как-то можно победить, кроме как вручную рисовать рамку, или вообще весь индикатор?

При использовании визуальных тем у прогресс бара имеется анимация.
Там такая светлая полоска пробегает по заполненной части бара.
Т.е. о какой-то фиксированной отрисовке в некий битмап буфер речи не идет.

Если хочется сделать что-то довольно похожее на прогресс бар с визуальными темами, то есть функции типа DrawThemeBackground из uxtheme.dll, которые с этим успешно справляются. Они рисуют прогресс бар в соответствии с текущей темой с градиентами цвета. В старых W2K барах был один цвет, а при использовании тем нет возможности в DC указать один Set...Color и радоваться жизни.

Я бы сделал просто свое окно с отрисовкой нужной рамки и контента через DrawThemeBackground.
Re[2]: Рамки в Progress Bar при отключенных Visual Styles
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 05.05.23 18:46
Оценка:
Здравствуйте, qaz77, Вы писали:

Q>При использовании визуальных тем у прогресс бара имеется анимация.


Она мне не нужна, и даже мешает, поскольку на progress bar у меня сделаны индикаторы заполнения очередей-буферов. Поэтому я отключаю visual styles для этих элементов.

Q>Если хочется сделать что-то довольно похожее на прогресс бар с визуальными темами


Нет, не хочется. Хочется обычную, одноцветную полосу, цвет которой я могу задавать сам, и со стандартной рамкой вокруг.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.