PBM_SETBARCOLOR, как известно, не работает, если Visual Styles включены для его окна (а они включены по умолчанию еще с XP). Чтобы менять цвет индикатора, не портя вида остальных элементов, можно отключить стили только для окна индикатора через SetWindowTheme. После этого цвет устанавливается, но у индикатора напрочь пропадает рамка. В ресурсах у него стоит WS_BORDER, но после вызова SetWindowTheme он пропадает. Добавление через SetWindowLong не помогает — флаг устанавливается, но вид элемента не меняется. Пробовал также
WS_EX_CLIENTEDGE, WS_EX_STATICEDGE и WS_EX_WINDOWEDGE в разных сочетаниях — бесполезно. Если у индикатора нулевая позиция — его вообще не видно в диалоге.
Это как-то можно победить, кроме как вручную рисовать рамку, или вообще весь индикатор?
Re: Рамки в Progress Bar при отключенных Visual Styles
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>PBM_SETBARCOLOR, как известно, не работает, если Visual Styles включены для его окна (а они включены по умолчанию еще с XP).
Может проще будет использовать Custom Draw для прогресс-бара?
Здравствуйте, Carc, Вы писали:
C>Может проще будет использовать Custom Draw для прогресс-бара?
Считаете, что, если нет возможности просто включить рисование рамки, то рисовать вручную весь progress bar будет проще, чем нарисовать вручную только рамку вокруг стандартного?
Re[3]: Рамки в Progress Bar при отключенных Visual Styles
ЕМ>Считаете, что, если нет возможности просто включить рисование рамки, то рисовать вручную весь progress bar будет проще, чем нарисовать вручную только рамку вокруг стандартного?
Зачем весь?
Я просто предложил направление размышлений.
Обычно в Custom Draw можно поменять цвета, дальше всё делается само собой.
Хотя именно для прогресс-бара я CustomDraw не ковырял... Как-то не приходилось (достаточно было текста поверх самого индикатора).
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>Здравствуйте, Carc, Вы писали:
C>>именно для прогресс-бара я CustomDraw не ковырял...
ЕМ>Оно вообще существует? Нигде не видел, чтоб такая возможность оговаривалась.
Похоже, я погорячился. Судя по доке для прогресс-бара нет CustomDraw.
Но с другой стороны сто лет в обед не было и для Button, а потом всё ж приделали nm-customdraw-button. Так что я б перепроверил на всяк случай, а то почти все Common Controls поддерживают CustomDraw, а прогресс-бар с какого-то вдруг нет... Странно это.
C>>достаточно было текста поверх самого индикатора
ЕМ>MS полагает, что так делать не стоит.
Не уловил намека. Что именно там не рекомендуется?
Здравствуйте, 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, Вы писали:
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.
Надо пробовать...
ЕМ>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.
Здравствуйте, Евгений Музыченко, Вы писали: ЕМ>Это как-то можно победить, кроме как вручную рисовать рамку, или вообще весь индикатор?
При использовании визуальных тем у прогресс бара имеется анимация.
Там такая светлая полоска пробегает по заполненной части бара.
Т.е. о какой-то фиксированной отрисовке в некий битмап буфер речи не идет.
Если хочется сделать что-то довольно похожее на прогресс бар с визуальными темами, то есть функции типа DrawThemeBackground из uxtheme.dll, которые с этим успешно справляются. Они рисуют прогресс бар в соответствии с текущей темой с градиентами цвета. В старых W2K барах был один цвет, а при использовании тем нет возможности в DC указать один Set...Color и радоваться жизни.
Я бы сделал просто свое окно с отрисовкой нужной рамки и контента через DrawThemeBackground.
Re[2]: Рамки в Progress Bar при отключенных Visual Styles
Здравствуйте, qaz77, Вы писали:
Q>При использовании визуальных тем у прогресс бара имеется анимация.
Она мне не нужна, и даже мешает, поскольку на progress bar у меня сделаны индикаторы заполнения очередей-буферов. Поэтому я отключаю visual styles для этих элементов.
Q>Если хочется сделать что-то довольно похожее на прогресс бар с визуальными темами
Нет, не хочется. Хочется обычную, одноцветную полосу, цвет которой я могу задавать сам, и со стандартной рамкой вокруг.