Я провел сегодня поиск везде, где вы найдете конкретное объяснение или пример раскраски большого пальца на трекбаре (слайдер) в win32 C++. Все, что я нашел, было частично объяснено, и, пытаясь понять все мыслимые вариации, я пришел в себя.win32 C++ Custom Color for Trackbar thumb
Элемент управления, на котором я был сфокусирован, определен в моем файле rc как CONTROL "", IDC_PLAYSLIDER, "msctls_trackbar32", TBS_NOTICKS | WS_TABSTOP, 5,22,187,15
По существу, обработка сообщений NM_CUSTOMDRAW сводится к следующему. У меня нет уверенности в обработке цвета/hdc, но отсутствие сообщений - моя основная проблема.
INT_PTR CALLBACK dialogproc(HWND h, UINT m, WPARAM w, LPARAM l)
{
switch (m) {
case WM_NOTIFY:
{
switch (((LPNMHDR)l)->code) {
case NM_CUSTOMDRAW:
{
LPNMCUSTOMDRAW lpNMCD = (LPNMCUSTOMDRAW)l;
UINT idc = lpNMCD->hdr.idFrom;
switch (lpNMCD->dwDrawStage) {
case CDDS_PREPAINT:
return CDRF_NOTIFYSUBITEMDRAW;
break;
case CDDS_SUBITEM | CDDS_ITEMPREPAINT:
{
switch (lpNMCD->dwItemSpec)
{
case TBCD_THUMB:
HGDIOBJ old_pen = SelectObject(lpNMCD->hdc, penSlider);
HGDIOBJ old_brush = SelectObject(lpNMCD->hdc, brushSlider);
return CDRF_NEWFONT;
}
}
break;
}
Что я получаю во время выполнения является CDDS_PREPAINT на правильном контроле, но независимо от того, что я пытался, у меня не было никаких дальнейших сообщений CDDS_ drawStage.
Если кто-то сделал это на трек-панели (большинство примеров - это элементы управления списком) и желает поделиться своим кодом обработчика сообщений или может пролить свет на мое замешательство, это было бы весьма полезно.
Помимо специальных шагов, которые необходимо предпринять, чтобы возвращать значения из 'DialogProc' (указано в ответе Джонатана), вы, вероятно, будете разочарованы результатами. Пользовательский рисунок элемента управления дорожкой отключит визуальные стили (темы), благодаря чему он будет выглядеть так же, как в Windows 95. Будет намного сложнее изменить цвет элемента управления, сохранив поддержку визуальных стилей. Что вызывает вопрос о том, почему вам необходимо изменить цвет в первую очередь - пользователь должен выбрать его, выбрав тему. –
@CodyGray: пользователям не удалось выбрать тему с Windows XP :) –
@ CodyS.Pumpkins: Я не знаю, где вы видели это поведение. В Win 7 мне удалось настроить тики трек-бэка, используя CDRF_SKIPDEFAULT на CDDS_ITEMPREPAINT TBCD_TICS, все еще получая остальную часть трекбола (самой Windows) с тематическим визуальным стилем. – Fizz